Datgs' Blog

Quyết chiến quyết thắng !

Archive for the tag “php”

Sắp xếp dữ liệu Tiếng Việt với PHP


Các hàm của PHP hầu hết không hỗ trợ sắp xếp Tiếng Việt nói riêng và các ngôn ngữ loằng ngoằng nói chung. Hoặc nếu có hỗ trợ thì lại đụng chạm nhiều thứ như … hosting không có hỗ trợ…

Em cũng gặp tình huống như vậy nên em phải viết cái hàm sau sử dụng với PHP usort để sắp xếp với Tiếng Việt. Tất nhiên là chỉ sắp xếp trên code thôi chứ không sắp xếp phân trang với SQL đâu nha.

function e_sortcb($a, $b) {
$map = array(
‘Ă’ => ‘Az’,
‘Ằ’ => ‘Azz’,
‘Ắ’ => ‘Azzz’,
‘Ẳ’ => ‘Azzzz’,
‘Ẵ’ => ‘Azzzzz’,
‘Ặ’ => ‘Azzzzzz’,
‘Â’ => ‘Azzzzzzz’,
‘Ầ’ => ‘Azzzzzzz’,
‘Ấ’ => ‘Azzzzzzzz’,
‘Ẩ’ => ‘Azzzzzzzzz’,
‘Ẫ’ => ‘Azzzzzzzzzz’,
‘Ậ’ => ‘Azzzzzzzzzzz’,
‘ă’ => ‘az’,
‘ằ’ => ‘azz’,
‘ắ’ => ‘azzz’,
‘ẳ’ => ‘azzzz’,
‘ẵ’ => ‘azzzzz’,
‘ặ’ => ‘azzzzzz’,
‘â’ => ‘azzzzzzz’,
‘ầ’ => ‘azzzzzzzz’,
‘ấ’ => ‘azzzzzzzzz’,
‘ẩ’ => ‘azzzzzzzzzz’,
‘ẫ’ => ‘azzzzzzzzzzz’,
‘ậ’ => ‘azzzzzzzzzzzz’,
‘Đ’ => ‘Dz’,
‘đ’ => ‘dz’,
‘Ê’ => ‘Ez’,
‘Ề’ => ‘Ezz’,
‘Ế’ => ‘Ezzz’,
‘Ể’ => ‘Ezzzz’,
‘Ễ’ => ‘Ezzzzz’,
‘Ệ’ => ‘Ezzzzzz’,
‘ê’ => ‘ezzzzzzz’,
‘ề’ => ‘ezzzzzzzz’,
‘ê’ => ‘ezzzzzzzzz’,
‘ể’ => ‘ezzzzzzzzzz’,
‘ễ’ => ‘ezzzzzzzzzzz’,
‘ệ’ => ‘ezzzzzzzzzzzz’,
‘Ô’ => ‘Oz’,
‘Ồ’ => ‘Ozz’,
‘Ố’ => ‘Ozzz’,
‘Ổ’ => ‘Ozzzz’,
‘Ỗ’ => ‘Ozzzzz’,
‘Ộ’ => ‘Ozzzzzz’,
‘Ơ’ => ‘Ozzzzzzz’,
‘Ờ’ => ‘Ozzzzzzzz’,
‘Ớ’ => ‘Ozzzzzzzzz’,
‘Ở’ => ‘Ozzzzzzzzz’,
‘Ỡ’ => ‘Ozzzzzzzzzz’,
‘Ợ’ => ‘Ozzzzzzzzzzz’,
‘ô’ => ‘oz’,
‘ồ’ => ‘ozz’,
‘ố’ => ‘ozzz’,
‘ổ’ => ‘ozzzz’,
‘ỗ’ => ‘ozzzzz’,
‘ộ’ => ‘ozzzzzz’,
‘ơ’ => ‘ozzzzzzz’,
‘ờ’ => ‘ozzzzzzzz’,
‘ớ’ => ‘ozzzzzzzzz’,
‘ở’ => ‘ozzzzzzzzzz’,
‘ỡ’ => ‘ozzzzzzzzzzz’,
‘ợ’ => ‘ozzzzzzzzzzzz’,
‘Ư’ => ‘Uz’,
‘Ừ’ => ‘Uzz’,
‘Ứ’ => ‘Uzzz’,
‘Ử’ => ‘Uzzzz’,
‘Ữ’ => ‘Uzzzzz’,
‘Ự’ => ‘Uzzzzzz’,
‘ư’ => ‘uz’,
‘ừ’ => ‘uzz’,
‘ứ’ => ‘uzzz’,
‘ử’ => ‘uzzzz’,
‘ữ’ => ‘uzzzzz’,
‘ự’ => ‘uzzzzzz’,
);
$keys = array_keys($map);
$vals = array_values($map);
$a = str_replace($keys, $vals, $a);
$b = str_replace($keys, $vals, $b);
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}

Dùng hàm này với PHP usort, hoạt động khá tốt.

OAuth là gì?


0. Mở đầu

Bài viết này dành cho những người chưa hiểu cơ bản về OAuth và Single Sign On.

OAuth là gì? Đó là câu hỏi không dễ đối với những người chưa từng làm việc với SSO (Single Sign On). Thực ra thì Single Sign On không liên quan gì mấy đến nội dung của OAuth. Tuy nhiên chúng hay đi liền với nhau. Vì vậy cũng phải có sự phân biệt cho khỏi nhầm lẫn.

  1. Single Sign On là việc bạn có thể đăng nhập vào một website (như google.com) và sử dụng đăng nhập đó trên các website khác.
    • Vì vậy SSO là một tiện ích
    • Thường được sử dụng trên các website liên quan mật thiết đến nhau
    • Tiện ích SSO có nhiều phương pháp để thực hiện, SAML là một trong các phương pháp đó
  2. OAuth là phương pháp chia sẻ tài nguyên giữa các ứng dụng mà không phải đưa ra “giấy thông hành” là username và password.
    • Do đó, OAuth là một phương pháp
    • Thường được sử dụng trên các website … chả liên quan gì nhau (thực ra là có liên quan đấy, nhưng về mặt bản chất chúng có thể hoạt động mà chẳng cần gì đến nhau, việc kết nối là để xin chút tài nguyên thôi).
Ngoài ra, bạn cũng phải phân biệt giữa hai từ Authorization và Authentication. Từ thứ 2 đơn giản là “đăng nhập” hay không, còn từ thứ nhất là “có quyền” hay không. Cần chú ý chúng khác nhau nhiều lắm, đôi khi bạn chẳng cần “đăng nhập” bạn cũng có thể “có quyền”. Ý của tôi ở đây là Authentication thường liên quan đến việc bạn phải “đăng nhập” vào hệ thống. Còn Authorization tức “có quyền” trên tài nguyên hệ thống hay không thì bạn phải yêu cầu chủ thể của tài nguyên cho phép bạn.
Nói vậy thì hơi lan man, bạn có thể bỏ qua đừng suy nghĩ gì về đoạn giải thích như đánh đố trên.
Xin được đi chi tiết hơn về OAuth, nội dung của nó thì không mới, các hãng lớn như Google, Aol, Yahoo… đều có các phương pháp Authorization của riêng mình. Nhưng nó khiến các bên thứ ba khó khăn khi tích hợp với họ. Vì vậy họ họp nhau lại để tạo ra chuẩn Open Authorization.
1. Bắt đầu với Authorization, cụ thể là OAuth bạn phải phân biệt được những bên liên quan như sau
  • Client: là ứng dụng (chú ý là một ứng dụng, có thể là ứng dụng Desktop, cũng có thể là website của bạn như http://www.youbrainy.com
    ), muốn có quyền sử dụng tài nguyên của Server
  • Server: là một ứng dụng khác,  chẳng hạn như google.com.
  • You: chính bạn, bạn có tài nguyên trên Server và bạn muốn cho Client quyền sử dụng nó
Tóm lại: OAuth là phương pháp để Client sử dụng được tài nguyên của You bên phía Server
2. Phân biệt hai loại OAuth
  • 2-legged OAuth: là kiểu Authorization trong đó vai trò của You và Client là như nhau. Tức là Client chính là You của Server. Đó là kịch bản Client-Server thông thường.
  • 3-legged OAuth: là kiểu Authorization trong đó You và Client là phân biệt. Client muốn You chia sẻ tài nguyên đã có bên phía Server.
3. Cách OAuth hoạt động
3.1. 2- legged OAuth
  1. Client đăng ký sử dụng dịch vụ với Server
  2. Server cho Client
    • CONSUMER_KEY
    • CONSUMER_SECRET_KEY
  3. Client sử dụng các keys trên để thực hiện Authorization
3.2. 3- legged OAuth
  1. Client đăng ký sử dụng dịch vụ với Server
  2. Server cho Client
    • CONSUMER_KEY
    • CONSUMER_SECRET_KEY
  3. You có tài nguyên ở Server
  4. You sử dụng dịch vụ ở Client, Client yêu cầu You cho phép khai thác tài nguyên của You ở Server
  5. Client yêu cầu Server gửi REQUEST_TOKEN cho You
  6. Client chuyển You đến Server Authentication
  7. You đăng nhập vào Server, Server hỏi You có muốn chia sẻ quyền khai thác dữ liệu cho Client hay không
  8. You đồng ý, Server chuyển You về Client kèm theo ACCESS_TOKEN
  9.  Client sử dụng ACCESS_TOKEN để thực hiện thao tác trên các tài nguyên của You thuộc Server
4. Chú ý khi cài đặt với PHP
  1. Các trang tích hợp OAuth phần lớn hỗ trợ thư viện để bạn có thể dễ dàng cấu hình OAuth
  2. Nếu trong tình huống xấu, bạn chính là người cung cấp dịch vụ và muốn cung cấp mã nguồn tích hợp OAuth với dịch vụ của bạn. Thì bạn phải code rùi. Tất nhiên đây là trường hợp chủ động
  3. Nếu bên cung cấp dịch vụ ỉm đi, không cho bạn cái gì sất. Bạn phải code phần client chẳng hạn. Bạn nên tìm hiểu các thư viện sẵn có để học hỏi. Như Zend_OAuth chẳng hạn.
5. Tài liệu

Mẹo mực với Eclipse PDT


Nguồn http://i-php.net

Khi làm việc với Eclipse PDT, đôi khi bạn gặp phải những tình huống như:

1/ Mất chức năng AutoComplete?

Đơn giản là hãy xóa file .project đi và refresh lại. Lỗi này thường gặp khi bạn Create Project from SVN

2/ Khi làm việc với những đối tượng như CakePHP, giả sử với AuthComponent bạn muốn gọi trong Controller như sau: $this->Auth->something, nếu có AutoComplete cho cái something kia thì tốt hơn đúng không ạ.

Những lúc thế này mình phải khai báo biến Auth cho controller mình đang sử dụng:

/**
* @var AuthComponent
*
* @var Auth
*/
var $Auth;

3/ Với template thì sao, template thì ná ná giống functional based code. Do đó mẹo như sau:

Đưa file này https://github.com/markstory/story-scribbles/blob/master/eclipse/code-completion-in-views.php vào bất cứ thư mục nào (trừ thư mục gốc của project). Bạn sẽ có AutoComplete cho form.

4/ Về Code AutoComplete cho CakePHP em đã tham khảo ở đây:

http://mark-story.com/posts/view/code-completion-for-cakephp-in-eclipse

Sinh mã số theo dải quy định trước


Như đã nói trong comment trước. Em sẽ trình bày một phương pháp sử dụng trường autoincrement để sinh mã số theo dải số quy định trước.

Như các bác thấy, trong thực tế, có rất nhiều trường hợp gặp phải ví dụ như là, mỗi một thành phố có một dải số chứng minh thư riêng chẳng hạn, hoặc trong một nhà máy, ID của mỗi sản phẩm họ quy định một dải số riêng như kem đánh răng thì từ 10000 đến 20000, còn bàn chải thì từ 20001 đến 30000…

Vậy thì làm thế nào? Cách đơn giản mà ta có thể nghĩ ra ngay là sử dụng một cơ chế khóa để luôn đảm bảo quá trình sinh mã được thực hiện theo thứ tự lần lượt. Em sẽ không comment gì cách này nữa.

Cách của em muốn đề cập ở đây là sử dụng một bảng như sau:

CREATE TABLE `seq` (
`CODE` varchar(255) NOT NULL,
`AUTO` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`CODE`),
UNIQUE KEY `CODE` (`CODE`,`AUTO`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1

Sau đó định nghĩa giá trị ban đầu của dải KEMDANHRANG là 9999 và dải BANCHAI là 20000

INSERT INTO `seq` (`CODE`, `AUTO`) VALUES (‘KEMDANHRANG’, ’9999′);
INSERT INTO `seq` (`CODE`, `AUTO`) VALUES (‘BANCHAI’, ’20000′);

Sau đó, nếu bạn muốn tính toán mã tiếp theo của bàn chải chẳng hạn, bạn sử dụng query sau:

replace into seq (`CODE`,`AUTO` ) values (‘BANCHAI’, ”)

Lúc này, giá trị trả về của mysql_insert_id sẽ là auto number tiếp theo của bàn chải (là 20001).

Tương tự như vậy:

replace into seq (`CODE`,`AUTO` ) values (‘KEMDANHRANG’, ”)

Sau truy vấn này, mysql_insert_id trả về 10000 (auto number của dải kem dánh răng).

Tất nhiên để kiểm soát giá trị trên của dài. Sau khi lấy được mã, chúng ta phải tự so sánh giá trị lấy được với giá trị trên để xem mã vừa lấy được có phù hợp hay không.

http://i-php.net/2011/04/sinh-ma-so-theo-dai-quy-dinh-t/

Tại sao tôi lại được khuyến cáo không sử dụng TRIGGER và PROCEDURE của MySQL?


Chào các bác,

Em mới vào Sài Gòn chưa được ít lâu. Hiện đang đi phỏng vấn xin việc. Được mấy công ty rồi, ở trong này cách họ truy vấn lúc phỏng vấn khá là khác biệt so với các công ty em đã làm ở ngoài Hà Nội. Đại khái em thấy họ tập chung vào các kinh nghiệm làm việc thực tế, hơn là lý thuyết chung chung. Đặc biệt là họ chỉ focus vào các yêu cầu của công việc, chẳng đoái hoài gì đến giá trị gia tăng gì sất (cũng hơi là lạ lúc đầu nhưng sau 3 lần phỏng vấn em cũng thấy quen rồi và cũng cho thế là hợp lý, tuyển PHP, MySQL thì sức đâu mà lo đến Java, Python… khác). Khi xin tuyển công ty khác thì em cũng sửa sửa, xóa xóa tùy theo yêu cầu tuyển dụng :D .

À quay lại chủ đề chính. Có một công ty em tuyển có trao đổi một đoạn như sau (với anh xếp Việt Kiều Úc, công ty KiSS Concept):

- Em đã bao giờ sử dụng tính năng như TRIGGER, PROCEDURE trên các dự án của mình chưa?

- Chưa. Em được khuyến cáo là không sử dụng những tính năng đó của MySQL. Thay vì thế, dùng mã PHP.

- Tại sao vậy? Không phải việc của CSDL thì để cho CSDL làm chẳng phải sẽ nhanh hơn rất nhiều sao?

- Việc đó thì em nghĩ là đúng. Em cũng chưa từng tự hỏi vì sao họ lại khuyến cáo như vậy. Về phần em, cũng không thấy phiền hà lắm với việc xử lý tất cả trên PHP. Đôi khi còn rất hữu dụng nữa…

Về nhà em cũng suy nghĩ lại đoạn đó, vả cũng cố nghĩ ra một cách giải thích, các bác xem có hợp lý không nhé:

- Tất nhiên, khai thác triệt để các tính năng do CSDL mang lại là tốt nhất.

- Tuy nhiên khi phát triển các ứng dụng trên PHP và MySQL, các bác nhà ta thường chuẩn bị tư thế sẵn sàng cho việc … vì lý do nào đó, thay đổi cơ sở dữ liệu sử dụng (từ MySQL sang Oracle chẳng hạn). Code tất cả các tính năng trong PHP giảm được sự phức tạp cho việc chuyển đổi này. Vì thế, MySQL chỉ được coi là thùng chứa dữ liệu, chứ các tính năng xử lý dựng sẵn không được coi trọng.

- Xử lý bằng PHP, về sau hệ thống cần phải chịu tải lớn, cần phải tối ưu hóa một số đoạn, việc refactor lại code sẽ dễ sàng hơn.

Có ai có thích giải thích khác không ạ? Các dự án mà các bác làm thì thế nào, có hay dùng TRIGGER & PROCEDURE của MySQL không? Trường hợp nào thì nên sử dụng TRIGGER & PROC?

http://i-php.net/2011/04/tai-sao-toi-lai-duoc-khuyen-cao-khong-su-dung-trigger-va-procedure-cua-mysql/

Viết bài trên i-php.net, PHP addslashes có đủ tốt để chống SQL Injection?


http://i-php.net/2011/02/php-addslashes-co-du-tot-de-chong-sql-injection/

Là bài viết trên i-php.net. Một bài viết rất đơn giản dành cho những ai mới tham gia vào cộng đồng PHP.

Design Pattern – Behavior Pattern – Stragety (Policy) Pattern


Là mẫu thiết kế “chiến lược” sử dụng các giải thuật khi chạy chương trình.
Trong các ngôn ngữ lập trình không hỗ trợ tính đa hình, vấn đề liên quan đến Design Pattern này được điều khiển bởi các mẫu phản chiếu (tham chiếu), giống như con trỏ (pointer).

Mẫu này không thấy ngay được trong các ngôn ngữ lập trình hàm (first-class function).

Mẫu này rất hữu dụng trong các tình huống cần phải thay đổi động các giải thuật (sử dụng các giải thuật khác nhau) trên một ứng dụng.

Ví dụ (có thể xem ở link này: http://www.cumps.be/design-patterns-strategy-pattern/) là một ví dụ rất hay về Stragety Pattern. Trong đó mô tả các đối tượng trong một game với chung một phương thức nhưng với cách thực hiện khác nhau.

Hoặc có thể xem http://en.wikipedia.org/wiki/Strategy_pattern có rất nhiều mã nguồn ví dụ bạn có thể tham khảo.

Cấu hình subdomain với DNS, Apache và các sử dụng trong PHP


http://andy.sinaptix.com/2007/08/22/username-as-subdomain-in-codeigniter

http://ma.tt/2003/10/wildcard-dns-and-sub-domains/

I’ve been wondering for a while if I can do automatic subdomain using username, same as WordPress MU does. Some thought come across and all leads to same point , the $base_url() variable.

What makes me a bit wary is that particular variable reside in config file, which suppose to be static. On the other hand, manipulating the variable in controller is easy but redundant. So what the heck…
There are three places to modify for this :

  1. DNS entry
  2. Apache vhost
  3. Codeigniter config.php

Life has been good to me since I have full control over those three, I have my own DNS server, and apache server, so if you are less fortunate than I am, do not hesitate to nag , beg and annoy your hosting company to do changes for you

DNS entry :

make sure you put wildcard entry :
mygreatsite.com. A 123.123.123.001
*.mygreatsite.com. A 123.123.123.001

Apache vhost :

We use separate vhost file for each domain, and include those files using Apache “Include” directive, to keep things tidy and avoid fiddling with main apache config.
<virtualhost>
ServerName mygreatsite.com
ServerAlias *.mygreatsite.com
ServerAdmin superduperadmin@superduperwebcompany.com
#RedirectMatch 301 (.*) http://mygreatsite.com$1
DocumentRoot /var/oi/keepcodeigniterhere
<directory>
Options Indexes FollowSymLinks MultiViews
</directory>
AllowOverride All
Order allow,deny
allow from all
</virtualhost>

the most important part is :
#RedirectMatch 301 (.*) http://mygreatsite.com$1
CodeIgniter config.php :

I test using this simple hack ( on the config.php ) :
$config['base_url'] = “http://”.$_SERVER["HTTP_HOST"];

And wala !! I can test using whatever.mygreatsite.com and codeigniter still working as if there is nothing wrong with $base_url variable, therefore you can use any words ( hence, wildcard ) as subdomain prefix and apache will direct the request to the same codeigniter installation. Next step I will do is using username as subdomain, eliminating ugly url like
http://www.mygreatsite.com/someuser/profile
and make it nicer as in
http://someuser.mygreatsite.com/profile
Nice !!
Yeah I know I have to test rigorously to ensure nothing is broken with codeigniter ( and my application ) but at this moment I think it leads to the right direction.
I also do some search at CodeIgniter’s forum just to verify my method and I’ve found great reference :
http://codeigniter.com/forums/viewthread/51627/

For wildcard DNS, take a look at this guide by WordPress creator :
http://photomatt.net/2003/10/10/wildcard-dns-and-sub-domains/

Nhận ra chuỗi UTF-8


/**
* Nhận ra đoạn mã UTF-8
*
*/

function isUTF8($string) {

// from http://w3.org/International/questions/qa-forms-utf-8.html
return 0 != preg_match('%^(?:

[\x09\x0A\x0D\x20-\x7E]            # ASCII

| [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte

|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs

| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte

|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates

|  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3

| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15

|  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16

)*$%xs', $string);

}

JSON là gì?


1. Tên gọi

Viết tắt của JavaScript Object Notation (dịch sơ sơ là đối tượng JavaScript). Thực ra chỉ là dịch chơi, còn không cứ gọi là JSON.

Xem thêm ở đây http://www.json.org/

2. Nó là gì?

Nó là một chuẩn để định dạng dữ liệu, về mặt này, có thể so sánh JSON với XML, YAML… Nhưng khi JSON đi với JavaScript hoặc ActionScript thì nó có tính ưu việt hơn hẳn.

Tại sao JSON có liên quan đến JavaScript, ActionScript. Đơn giản là vì dữ liệu được định dạng thành chuỗi JSON chính là cách biểu diễn một đối tượng trong các Scripting Language này.

3. Lợi ích của JSON

Khi sử dụng JSON với JavaScript hay ActionScript, không cần phải có các bước phân tích phức tạp như đối với XML. Mà có thể truy vấn trực tiếp giá trị theo tên (khóa) được định nghĩa trong JSON.

Ví dụ:

Bạn có một dữ liệu XML:

<data>
<x>2</x>
<y>3</y>
</data>

Sử dụng JavaScript để đọc dữ liệu này, bạn phải qua một bước phân tích, đưa văn bản XML thành một đối tượng dữ liệu và đọc dữ liệu theo nodes. Giả sử object của bạn là xmlObj, bạn muốn lấy dữ liệu x và y bạn sẽ gọi:

var x = xmlObj.childNodes[0].text;
var y = xmlObj.childNodes[1].text;

Trong trường hợp tương tự, bạn có một dữ liệu JSON:

var jsonStr = '{ data : { x : 2 , y : 3}}';

Sử dụng JavaScript bạn chỉ cần gọi:

eval( 'var jsonObj = ' + jsonStr + ';');
var x = jsonObj.x;
var y = jsonObj.y;

JSON là một chuẩn cực kỳ quan trọng trong lập trình web ở phía client.

Đối với lập trình viên client script. JSON rút ngắn thời gian viết mã JS, AS hơn là sử  dụng XML.

4. Nên sử dụng JSON trong những tình huống nào

  1. Lưu trữ dữ liệu đơn thuần. Đó là khi bạn muốn lưu trữ dữ liệu dưới dạng metadata ở phía server. Chuỗi JSON sẽ được lưu vào database và sau đó khi cần dữ liệu thì sẽ được giải mã. Ví dụ với PHP, cung cấp các hàm liên quan đến JSON để mã và giải mã là json_encode và json_decode.
    • Chú ý: phương pháp này cũng tương tự như sử dụng tính năng serialize và unserialize của PHP. Nhưng trong khi serialize và unserialize sử dụng với cả dữ liệu và biến, tức là phụ thuộc vào ngôn ngữ lập trình là PHP và dĩ nhiên không thể transfer sang ngôn ngữ lập trình khác để unserialize được. Vì vậy, nếu dữ liệu của bạn chỉ đơn thuần là dữ liệu cơ bản (chuỗi kí tự, số…) thì bạn hoàn toàn không nên sử dụng serialize mà nên sử dụng JSON.
  2. Sử dụng JavaScript, ActionScript để xử lý thông tin trả về từ phía server. Rất nhanh và rất dễ dàng.

Ads:

http://www.youbrainy.com cùng xem một dự án phát triển như thế nào với một team cỡ nhỏ!

Cài đặt apache, php, mysql trên windows (cập nhật)


Chú ý: chỉ áp dụng chính xác cho phiên bản apache2.2.x php5.2.x và mysql 5.x, với các phiên bản khác có thể có một chút đổi khác.

Có thể chỉ phù hợp với những người có kinh nghiệm cài đặt Apache, PHP và MySQL. Nếu hướng dẫn dưới đây là không đầy đủ. Bạn có thể tìm một hướng dẫn chi tiết hơn cho từng mục.

0. Chuẩn bị

Chú ý duy nhất là nếu bạn cài đặt đè lên bản apache cũ, bạn hãy xóa file config cũ đi. Vì khi cài đè apache không đè các file config.

1. Các bộ cài

Apache 2.2.x tải về từ  website http://httpd.apache.org/ (chọn bản MSI installer)

MySQL5.xtải về từ website http://dev.mysql.com/downloads/mysql/5.0.html (chọn bản MSI installer)

PHP5.2.x tải bản zip dành cho windows tại http://www.php.net/downloads.php.

2. Cài đặt

Cài đặt Apache2.2.x bình thường với cấu hình cơ bản là localhost, localhost, <admin email>, 8080 hoặc 80. Chú ý một trong hai cổng 8080 hoặc 80 phải tự do, tức là chưa có dịch vụ nào sử dụng nó.

Cài đặt MySQL5.x bình thường. Đến phần cấu hình next cho đến khi được yêu cầu nhập root password. Bạn nên chọn một password. Với server đang phát triển, thường chọn mật khẩu root là 123456.

PHP giải nén và chú ý ghi nhớ đường dẫn đến thư mục PHP của bạn.

3. Cấu hình

Để Apache2.2.x chạy PHP dưới dạng một module bạn làm như sau

Mở file httpd.conf của Apache (nằm trong thư mục conf, nơi bạn đã cài apache)

Thêm vào httpd.conf đoạn cấu hình

LoadModule php5_module “E:\WEBSERVER\php5\php5apache2_2.dll”
AddType application/x-httpd-php .php
PHPIniDir “E:\WEBSERVER\php5″

LoadModule php5_module “PHP_PATH\php5apache2_2.dll”

AddType application/x-httpd-php .php

PHPIniDir “PHP_PATH”

Với chú ý rằng PHP_PATH là nơi bạn đã giải nén PHP.

Để Apache2.2.x chọn index.php làm trang web mặc định để

Tìm tới dòng

DirectoryIndex index.html

Sửa lại thành

DirectoryIndex index.html index.php

Nếu bạn muốn index.php có ưu tiên cao hơn, bạn có thể chuyển nó về trước index.html

DirectoryIndex index.php index.html

Chuẩn bị file php

Tìm trong thư mục bạn đã giải nén PHP file php5ts.dll và copy nó vào thư mục bin của apache.

Trong thư mục bạn đã giải nén PHP, copy toàn bộ các file *.dll bạn nhìn thấy vào trong thư mục Windows/system32 chú ý chỉ copy file bạn nhìn thấy, không cần copy các file trong thư mục

Bước này chỉ là kinh nghiệm của tôi qua việc cài đặt các phiên bản trước. Có thể trong phiên bản này bước này không còn cần thiết nữa. Tuy nhiên, tôi vẫn thường làm theo cách này và không gặp bất cứ trục trặc nào.

Trong thư mục bạn đã giải nén PHP, copy php.ini-dist và sửa tên file bạn vừa copy thành php.ini.

Bạn sửa luôn php.ini-dist thành php.ini cũng không sao cả.

Cấu hình php.ini

1. Mở file php.ini bằng notepad, notepad++ hay wordpad

2. Tìm trong php.ini từ khóa doc_root và sửa thành

doc_root = APACHE_PATH/htdocs

* Trong đó APACHE_PATH là nơi bạn đã cài đặt apache.

* Chú ý rằng

htdocs là nơi mặc định của apache để đặt các public files (html, php). Bạn có thể cấu hình lại, hoặc dùng virtual host, hoặc dùng Script-Alias… Tuy nhiên, nếu bạn mới bắt đầu sử dụng Apache thì bạn không cần phải quá quan tâm đến vấn đề này. Chỉ cần cấu hình mặc định là được.

3. Tìm trong php.ini từ khóa extension_dir và cấu hình thành

extension_dir = PHP_PATH/ext

* extension_dir là đường dẫn đến nơi bạn để các thư viện mở rộng của PHP

4. Tìm các dòng ;extension=php_*.dll đó là các extension mà php cung cấp cho bạn. Chú ý rằng nếu có ; tức là thư viện đó chưa được sử dụng. Nếu bạn muốn sử dụng thư viện nào, chỉ cần bỏ dấu ; . Các thư viện cần đề dev bao gồm

extension=php_curl.dll
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_mcrypt.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_soap.dll

5. Copy các file *.dll trong thư mục PHP_PATH vào thư  mục system32 của windows (WINDOWS/system32) (nhắc lại một câu ở trên vì thao tác này khá là dễ bị quên)

4. Hoàn thành

Khởi động lại apache là hoàn tất.

Syntax của ngôn ngữ lập trình


Về mặt hình thức thì đúng là các ngôn ngữ giống nhau về syntax. Có thể gọi đó là trào lưu cũng được. Trước đây khi ngôn ngữ C ra đời, nó được trào đón và thực sự vượt hẳn lên trên Pascal trong việc phát triển các hệ thống. Và đẩy Pascal trở về đúng vị trí của nó: một cuốn sách giáo khoa về lập trình. Và các ngôn ngữ sau này, thông thường là Like C.

Những phá cách theo kiểu Python không phải là không được chào đón. Tuy nhiên Like C vẫn được ưa thích hơn cả. Theo chủ quan của anh, và có lẽ cũng là của các lập trình viên khác là có lẽ là vì nó “vừa đủ”. Vừa đủ ngắn và vừa đủ dài (hình thức bao gồm keyword, operator …). C cũng vừa đủ giản đơn cho người mới học lập trình, và cũng đủ phức tạp để thể hiện được ý tưởng của các giải thuật cơ bản. Nó khó học hơn pascal một chút (một chút thôi), nhưng viết mã đơn giản hơn Pascal gấp nhiều lần. Vì vậy lựa chọn C là hợp lý.

Các ngôn ngữ sau này hầu hết được sinh ra từ ngôn ngữ C (tức là xây dựng nên từ các dòng code C).

Về mặt nội dung, mỗi ngôn ngữ lập trình là một công cụ với mục đích cụ thể. Không có ngôn ngữ nào ra đời chỉ để “cho vui”. Sự khác nhau và giống nhau của các ngôn ngữ là ở chỗ “nó được sử dụng để làm gì?”.

Và cũng vì đó là một công cụ, một công cụ dành cho con người sử dụng. Cho nên, không nên nghĩ rằng cái này khó lắm, cái kia khó lắm không học được đâu !!! Mà nên nghĩ rằng cái này chưa biết, cái kia biết rồi. Cũng từa tựa như là việc sử dụng MS Word vậy thôi.

So sánh như vậy là hơi khập khiễng, bởi vì MS Word là công cụ ứng dụng dành cho nhân viên văn phòng (rộng hơn là everybody), còn ngôn ngữ lập trình là công cụ đa năng (và chỉ một số đối tượng được chuyên môn hóa mới có thể tiếp cận được).

Quan trọng nhất của việc sử dụng ngôn ngữ lập trình là tư duy logic, tư duy ở cấp độ con số.

Vai trò của PHP trong thế giới công nghệ


Một bài báo viết rằng, trong năm năm tới, một lập trình viên tốt cần phải nắm vững một trong 3 công nghệ Java, .NET hoặc PHP.

Điều này chứng tỏ sức nặng của PHP trong thế giới công nghệ là vô cùng to lớn. Vậy tại sao PHP, với xuất thân là “phiên bản 2″ của perl, lại đóng một vai trò lớn lao đến như vậy ???

1. PHP cực kì dễ tiếp cận, tư duy lập trình của PHP phù hợp cho cả gà lẫn proman.

2. Quá rẻ, ai cũng có thể tiếp cận.

3. Uyển chuyển tới mức… khó lường.

4. Chơi thân với Apache và *nix.

5. So sánh với Java hoặc .NET. Với java hay .NET, microsoft và sun cung cấp cái gì, bạn phải dùng cái đấy. Ở phía ngược lại, bạn có quyền quyết định xem mình sẽ sử dụng module nào, không sử dụng module nào, loại bỏ hàm nào khỏi hệ thống.

6. PHP framework hiện tại có thể làm tất cả những gì ASP.NET framework có thể làm. Còn hơn thế, bạn có thể dễ dàng viết lại một số đoạn code trong PHP Framework để nó hoạt động đúng ý đồ của bạn hơn (interpreter) còn ASP.NET thì sao, MS cho gì, bạn phải xài nấy ^^

Tuy nhiên ở phía ngược lại, trong các hệ thống quan trọng không trọng dụng PHP như .NET, bởi vì mã nguồn mở rất chi là … “mở cửa”. Nếu bạn không phải là Pro về hệ thống, không biết cách cấu hình các tham số chạy, lúc đó chương trình của bạn coi như được… mở tung.

Tôi đã từng phát triển một hệ thống mạng xã hội sử dụng PHP (Symfony) & MySQL & CentOS (Linux). Quả thật công đoạn cài đặt Server chẳng khác nào đánh vật. Mà trong đó google là chỗ dựa duy nhất. Và từ khóa “shell command ….” là hot tag ^^.

Vì thế tôi cũng khuyên rằng, bạn nào muốn trở nên pro về hệ thống thông tin thì xin hãy tập cách xài đồ của mã nguồn mở ngay từ bây giờ.

7. Tập sử dụng mã nguồn mở, cũng có nghĩa là làm quen với tập lệnh (dùng windows thì ít xài lắm), là làm quen với cách cài đặt lạ lẫm, mà tôi có thể liệt kê ra như sau:

+ Bạn phải có kĩ năng sử dụng shell command. Không có giao diện cho bạn mà ấn nút next đâu.

+ Lúc nào cũng phải trong trạng thái sẵn sàng .. config. Các chương trình, dịch vụ trên linux đòi hỏi bạn phải .. config rất nhiều. Ví dụ như để thay đổi default charset của MySQL, trên windows bạn sẽ mở mysql configuration ra và next và next .. Còn trên Linuxx bạn sẽ phải tìm file /etc/my.cnf. Và thêm vào đó dòng default_character_set utf8….

Cài đặt thư viện PHP trên Linux


Lệnh 

> yum install php-<tên thư viện>

Sẽ cho phép bạn cài đặt các thư viện của PHP trên linux.

Ví dụ

> yum install php-gd 

Sẽ cài đặt thư viện gd.

PHP, phân biệt Request và HttpObjectRequest


Đôi khi bạn cần phân biệt một Request bình thường của Browser và một Ajax Request. Với PHP rất đơn giản như sau:

$_SERVER['HTTP_X_REQUESTED_WITH'] == ‘XMLHttpRequest’

Rất đơn giản.

Post Navigation

Follow

Get every new post delivered to your Inbox.

Join 363 other followers