Hiển thị các bài đăng có nhãn PHP and MYSQL. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn PHP and MYSQL. Hiển thị tất cả bài đăng

25 thg 3, 2009

Sử dụng CSDL MySQL

GIỚI THIỆU

CSDL là 1 phần quan trọng không thể thể thiếu được trong các ứng dụng web chuyên nghiệp. MySQL từ lâu đã là hệ CSDL được dùng phổ biến nhất với PHP vì tính gọn nhẹ, nhanh, miễn phí và được PHP hỗ trợ sẵn. Trong bài viết này chúng ta sẽ tìm hiểu cách kết nối vào CSDL MySQL, truy cập và lưu trữ dữ liệu với PHP.

Để thực hành các ví dụ trong bài viết này, bạn cần phải cài MySQL vào máy của bạn. Bạn có thể tham khảo bài viết cài đặt MySQL Server 4.1 trên Windows ở địa chỉ này: http://www.diendantinhoc.net/?cat=database_mysql&article=41cca76d6c. Xem như bạn đã cài đặt MySQL lên cùng server với PHP và account để kết nối vào MySQL Server có username là root và mật mã (password) là rỗng.

Ngoài ra, bài viết này giới thiệu về cách làm việc với CSDL MySQL trong PHP, cho nên xem như là bạn đã có một số kiến thức căn bản về MySQL và ngôn ngữ SQL. Bạn có thể tham khảo bài viết Tự học về ngôn ngữ SQL ở địa chỉ này: http://www.diendantinhoc.net/tute/sql/tuhocsql/.

KẾT NỐI VÀO MYSQL SERVER

PHP cung cấp hàm mysql_connect để kết nối vèo MySQL server. Cú pháp của hàm này như sau:

mysql_connect($server_address, $username, $password)
$server_address là địa chỉ của MySQL server, có thể là domain name hoặc IP address, các ví dụ trong bài viết này sẽ dùng giá trị "localhost" cho $server_address.
$username là tên account dùng để login vào MySQL server, các ví dụ trong bài viết sẽ sử dụng giá trị "root" cho $username.
$password là mật mã để kết nối vào MySQL server, các ví dụ trong bài viết sẽ sử dụng chuỗi rỗng "" làm mật mã.
Hàm mysql_connect sẽ trả về 1 kết nối đến MySQL server nếu như quá trình kết nối thành công, hoặc trả về giá trị FALSE nếu như kết nối không được.

Để đóng kết nối tới MySQL server, PHP cung cấp hàm mysql_close. Đoạn mã sau ví dụ quá trình kết nối vào MySQL server và đóng kết nối.


$SERVER = "localhost";
$USERNAME = "root";
$PASSWORD = "";

$conn = mysql_connect($SERVER, $USERNAME, $PASSWORD);
if ( !$conn ) {
//Không kết nối được, thoát ra và báo lỗi
die("không nết nối được vào MySQL server");
} //end if

//đóng kết nối
mysql_close($conn);
?>

CHỌN CSDL ĐỂ LÀM VIỆC

Sau khi connet vào MySQL server, thao tác tiếp theo là chọn CSDL để làm việc. PHP cung cấp cho ta hàm mysql_select_db để làm việc này. Cú pháp của hàm này như sau:

mysql_select_db($db_name[, $conn])
Với $db_name là tên CSDL cần chọn, $conn là kết nối được thực hiện qua lệnh mysql_connect. Các ví dụ trong bài viết này sẽ sử dụng CSDL có tên là test:

$SERVER = "localhost";
$USERNAME = "root";
$PASSWORD = "";
$DBNAME = "test";

$conn = mysql_connect($SERVER, $USERNAME, $PASSWORD);
if ( !$conn ) {
//Không kết nối được, thoát ra và báo lỗi
die("không nết nối được vào MySQL server");
} //end if

//chọn CSDL để làm việc
mysql_select_db($DBNAME, $conn);

//đóng kết nối
mysql_close($conn);
?>

THỰC THI 1 CÂU LỆNH SELECT VÀ LẤY KẾT QUẢ TRẢ VỀ

PHP cung cấp cho ta 3 hàm hữu dụng để thực hiện công việc này:

  • $result = mysql_query($sql, $conn): thực hiện câu lệnh SQL được cung cấp qua tham số $sql và trả về 1 kết quả kiểu $result (hàm này trả về FALSE nếu như câu lệnh thực hiện không thành công).
  • mysql_num_rows($result): hàm này trả về số lượng row lấy được qua câu lệnh SELECT (được thực thi bởi hàm mysql_query) trước đó.
  • $row = mysql_fetch_row($result), $row = mysql_fetch_assoc($result): trả về dòng kết quả hiện thời của câu lệnh select và chuyển con trỏ tới dòng tiếp theo (như vậy lệnh gọi mysql_fetch_row hoặc mysql_fetch_assoc tiếp đó sẽ trả về dòng tiếp theo); hoặc giá trị FALSE nếu như không còn dòng nào để trả về nữa. Kết quả trả về từ 2 hàm này là 1 array.
  • mysql_error($conn): trả về thông báo lỗi của MySQL server nếu như một lệnh trước đó có lỗi.
Để hiểu rõ hơn công dụng của các hàm trên, đồng thời phân biệt sự khác nhau giữa 2 hàm mysql_fetch_row và mysql_fetch_assoc, ta cung xem xét các ví dụ sau.

Các ví dụ của ta sẽ sử dụng table có tên là member với các trường và dữ liệu như sau:

username password
abc 123
def 456

Ví dụ 1: dùng mysql_fetch_row()


$SERVER = "localhost";
$USERNAME = "root";
$PASSWORD = "";
$DBNAME = "test";

$conn = mysql_connect($SERVER, $USERNAME, $PASSWORD);
if ( !$conn ) {
//Không kết nối được, thoát ra và báo lỗi
die("không nết nối được vào MySQL server: ".mysql_error($conn));
} //end if

//chọn CSDL để làm việc
mysql_select_db($DBNAME, $conn)
or die("Không thể chọn được CSDL: ".mysql_error($conn));

$sql = "SELECT * FROM member";
$result = mysql_query($sql, $conn);
if ( !$result )
die("Không thể thực hiện được câu lệnh SQL: ".mysql_error($conn));

echo "Số lượng row tìm được: ".mysql_num_rows($result)."
\n"
;

while ( $row = mysql_fetch_row($result) ) {
echo "Username = ".$row[0]."
\n"
;
echo "Password = ".$row[1]."
\n"
;
} //end while
//nên luôn giải phóng bộ nhớ sau khi lấy hết các row trả về từ câu lệnh SELECT
mysql_free_result($result);

//đóng kết nối
mysql_close($conn);

?>
Hàm mysql_fetch_row() sẽ trả về 1 array mà phần tử thứ [0] sẽ tương ứng với cột đầu tiên của table, phần tử thứ [1] sẽ tương ứng với cột thứ hai của table...Chương trình trên sẽ in ra ra 4 dòng:
Username = abc
Password = 123
Username = def
Password = 456

Ví dụ 2: dùng mysql_fetch_assoc()


$SERVER = "localhost";
$USERNAME = "root";
$PASSWORD = "";
$DBNAME = "test";

$conn = mysql_connect($SERVER, $USERNAME, $PASSWORD);
if ( !$conn ) {
//Không kết nối được, thoát ra và báo lỗi
die("không nết nối được vào MySQL server: ".mysql_error($conn));
} //end if

//chọn CSDL để làm việc
mysql_select_db($DBNAME, $conn)
or die("Không thể chọn được CSDL: ".mysql_error($conn));

$sql = "SELECT * FROM member";
$result = mysql_query($sql, $conn);
if ( !$result )
die("Không thể thực hiện được câu lệnh SQL: ".mysql_error($conn));

echo "Số lượng row tìm được: ".mysql_num_rows($result)."
\n"
;

while ( $row = mysql_fetch_assoc($result) ) {
echo "Username = ".$row['username']."
\n"
;
echo "Password = ".$row['password']."
\n"
;
} //end while
//nên luôn giải phóng bộ nhớ sau khi lấy hết các row trả về từ câu lệnh SELECT
mysql_free_result($result);

//đóng kết nối
mysql_close($conn);

?>
Hàm mysql_fetch_assoc() sẽ trả về 1 array mà các phần tử sẽ được truy cập qua tên, với tên được lấy từ tên các cột của table. Chương trình ví dụ 2 cũng sẽ in ra ra 4 dòng:
Username = abc
Password = 123
Username = def
Password = 456

THỰC THI 1 CÂU LỆNH UPDATE, INSERT hoặc DELETE

Hàm mysql_query cũng được dùng để thực thi các câu lệnh DELETE, INSERT hoặc UPDATE, nhưng lúc này hàm sẽ trả về TRUE nếu câu lệnh thực hiện thành công và FALSE trong trường hợp ngược lại. Để lấy số lượng các row được chèn với lệnh INSERT hoặc bị thay đổi bởi lệnh UPDATE, PHP cung cấp cho ta hàm mysql_affected_rows. Ta hãy xem ví dụ sau:


$SERVER = "localhost";
$USERNAME = "root";
$PASSWORD = "";
$DBNAME = "test";

$conn = mysql_connect($SERVER, $USERNAME, $PASSWORD);
if ( !$conn ) {
//Không kết nối được, thoát ra và báo lỗi
die("không nết nối được vào MySQL server: ".mysql_error($conn));
} //end if

//chọn CSDL để làm việc
mysql_select_db($DBNAME, $conn)
or die("Không thể chọn được CSDL: ".mysql_error($conn));

$sql = "INSERT INTO member (username, password) VALUES ('xyz', '000')";
$result = mysql_query($sql, $conn); //chèn thêm 1 dòng vào table
if ( !$result )
die("Không thể thực hiện được câu lệnh SQL: ".mysql_error($conn));

echo "Số lượng row được chèn: ".mysql_affected_rows($conn)."
\n"
;
//ta chỉ chèn 1 dòng nên hàm mysql_affected_rows sẽ trả về 1

$sql = "UPDATE member SET password='111' WHERE username='xyz'";
$result = mysql_query($sql, $conn); //đổi password của accoutn xyz
if ( !$result )
die("Không thể thực hiện được câu lệnh SQL: ".mysql_error($conn));

echo "Số lượng row được thay đổi: ".mysql_affected_rows($conn)."
\n"
;
//ta thay đổi 1 dòng nên hàm mysql_affected_rows sẽ trả về 1

$sql = "DELETE FROM member";
$result = mysql_query($sql, $conn); //xoá hết tất cả các account
if ( !$result )
die("Không thể thực hiện được câu lệnh SQL: ".mysql_error($conn));

echo "Số lượng row được xoá: ".mysql_affected_rows($conn)."
\n"
;
//ta xoá tất cả 3 dòng nên hàm mysql_affected_rows sẽ trả về 3

//đóng kết nối
mysql_close($conn);
?>

LƯU Ý VẤN ĐỀ BẢO MẬT VỚI LỖI SQL INJECTION

Nếu bạn cần cung cấp 1 tham số cho câu lệnh SQL, nhất là các tham số từ trình duyệt do người dùng nhập vào, bạn hãy lưu ý đề phòng lỗi bảo mật SQL Injection. Giả sử bạn muốn thay đổi mật mã của account xyz, mật mã mới được người dùng nhập vào và lưu vào trong biến $newPwd, đoạn mã đổi password có thể tương tự như sau:


//...
$sql = "UPDATE member SET password='$newPwd' WHERE username='xyz'";
mysql_query($sql, $conn);
//...
?>

Giả sử người dùng nhập vào mật mã mới là zzz, câu lệnh SQL sẽ trở thành
UPDATE member SET password='zzz' WHERE username='xyz'
Hoàn toàn hợp lệ và đúng đắn, không có gì phải thắc mắc hết.

Nhưng giả sử người dùng nhập vào mật mã mới là zzz'#, câu lệnh SQL sẽ trở thành
UPDATE member SET password='zzz'#' WHERE username='xyz'
Nhưng gì phía sau ký tự # sẽ được MySQL xem là chú thích và sẽ bỏ qua, như vậy câu lệnh SQL của chúng ta trên thực tế sẽ tương đương với:
UPDATE member SET password='zzz'
Vậy là xong! Sau khi chạy câu lệnh này, password của tất cả các account đều là zzz hết, tất hiên là account admin cũng sẽ bị đổi password thành zzz và lúc này hậu quả tiếp theo ra sao chắc bạn cũng đã rõ!

Để tránh bị SQL injection, khi đưa các tham số vào câu lệnh SQL, bạn nên luôn nhớ và áp dụng 2 điều sau:

  • Nếu tham số là số (số nguyên hoặc số thực), cộng thêm 0 vào tham số trước khi đưa vào câu lệnh SQL. Tức là:
    $thamso+=0;
    $sql = "...$thamso...";
  • Nếu tham số là chuỗi, sử dụng hàm mysql_real_escape_string trước khi đưa tham số vào câu lệnh SQL. Tức là:
    $thamso = mysql_real_escape_string($thamso, $conn);
    $sql = "...'$thamso'...";

TRƯỚC KHI KẾT THÚC

Đến đây, bạn đã nắm được các bước cơ bản để làm việc với CSDL MySQL Server:
- Kết nối vào MySQL Server với server address, username và password
- Chọn CSDL để làm việc
- Thao tác với CSDL, Thực thi các lệnh SQL...
- Đóng kết nối khi kết thúc

Trong thực tế, đôi lúc chương trình của bạn cần thực hiện thêm nhiều thao tác nâng cao hơn thế, lúc này bạn đừng quên tham khảo MySQL Manual mục các hàm về MySQL.

CÁC HÀM PHP ĐƯỢC DÙNG TRONG VÍ DỤ

  • die: in ra câu thông báo và kết thúc chương trình.
  • mysql_connect: kết nối vào CSDL MySQL Server.
  • mysql_close: đóng kết nối đã được thiết lập trước đó.
  • mysql_error: lấy câu thông báo lỗi (nếu có) trả về từ MySQL Server.
  • mysql_fetch_row: lấy 1 row kết quả từ câu lệnh SELECT.
  • mysql_fetch_assoc: lấy 1 row kết quả từ câu lệnh SELECT.
  • mysql_free_result: giải phóng bộ nhớ sau khi lấy kết quả trả về từ câu lệnh SELECT.
  • mysql_query: thực thi 1 câu lệnh SQL.
  • mysql_select_db: chọn CSDL để làm việc.
  • mysql_real_escape_string: escale 1 chuỗi trước khi chèn vào câu lệnh SQL.
Sưu Tầm

Gởi email text, HTML và tiếng Việt Unicode

HÀM MAIL() CỦA PHP

Send email trong PHP rất đơn giản, ta chỉ cần dùng duy nhất 1 hàm mail() được PHP cung cấp sẵn là đủ. Cú pháp của hàm mail() như sau:

bool mail(string to, string subject, string message[, string additional_headers])

Các tham số của hàm mail() có ý nghĩa như sau:

  • to - địa chỉ người nhận email, là 1 string. Các giá trị hợp lệ của tham số to có dạng như sau:
    'user@domain.com'
    'user1@domain.com, user2@domain.com'
    'User Name '
    'User Name 1 , User Name 2 '
    'User Name 1 , user2@domain.com, User Name 3 '
  • subject - tiêu đề của email, là 1 string. Tiêu đề của email không được chứa ký tự xuống dòng (\r hoặc \n).
  • message - nội dung email, là 1 string. Nội dung email có thể do nhiều dòng ghép lại với nhau, mỗi dòng được phân cách bằng ký tự \n.
  • additional_headers - (tuỳ chọn) dùng để chèn thêm các header vào email. Các header này không nằm trong phần nội dung của email mà dùng để quản lý việc gởi email (ví dụ chèn thêm các trường CC, BCC khi gởi email). Nhiều header có thể cùng ghép lại thành 1 string trong additional_headers, các header được phân cách nhau bằng chuỗi \r\n.

Hàm mail() sẽ trả về giá trị TRUE nếu như email được chấp nhận gởi đi và FALSE trong trường hợp ngược lại.
Lưu ý: Hàm mail() trả về giá trị TRUE không có nghĩa là email sẽ được gởi đến nơi nhận thành công. Giá trị TRUE được trả về chỉ có ý nghĩa là email được server chấp nhận gởi đi, còn khi nào thì email thực sự được gởi, gởi có tới nơi hay không thì chương trình không biết được (như vậy nếu bạn nhập sau địa chỉ người nhận ở tham số To thì sẽ không có cách nào chương trình biết được địa chỉ To có đúng hoặc tồn tại hay không!).

MỘT VÍ DỤ GỞI EMAIL VỚI HÀM MAIL()

Ta hãy tạo 1 chương trình PHP nhỏ đẻ gởi email như sau:

//nội dung file example1.php

$from = 'from@domain.com';
$to = 'to@domain.com';
$subject = 'Example 1: Send simple text email';
$message = 'A plain text email.';
$header = "From: $from\r\nReply-to: $from";

if ( mail($to, $subject, $message, $header) ) {
echo "Email sent to $to!";
} else {
echo "Error occured while sending email to $to!";
} //end if
?>

Lưu chương trình vào file example1.php và chạy thử. Nếu quá trình gởi email thành công, bạn sẽ nhận được câu thông báo "Email sent to to@domain.com!", nếu có lỗi bạn sẽ nhận được câu thông báo "Error occured while sending email to to@domain.com!"

Lưu ý:

  • Nhớ thay to@domain.comfrom@domain.com thành địa chỉ email của bạn trước khi chạy thử chương trình!
  • Có thể phải mất tới 5-10 phút email mới tới nơi, và bạn nhớ kiểm tra thư mục Bulk email vì nhiều khi email gởi tới bị để trong mục Bulk.

Trong cú pháp của hàm mail(), tham số additional_headers là tuỳ chọn, tức là bỏ qua cũng được. Tuy nhiên, trên thực tế bạn nên cung cấp tham số additional_headers cho hàm mail() với ít nhất 2 header FromReply-to. Lý do thì có nhiều, một trong số các lý do phải cung cấp header FromReply-to là vì nếu phần địa chỉ người gởi (From) là rỗng, các chương trình lọc email có thể cho rằng đây là emai spam và thế là email được tự động chuyển sang "Thùng rác"!.

GỞI HTML EMAIL VỚI HÀM MAIL()

Chúng ta đã gởi được email text với hàm mail(), nhưng nhiều lúc ta cần "trang điểm" màu mè cho nội dung email được bắt mắt hơn. Thử viết 1 chương trình nhỏ gởi email HTML:

//nội dung file example2.php

$from = 'from@domain.com';
$to = 'to@domain.com';
$subject = 'Example 2: Try a simple HTML email';
$message = 'A HTML email: bold, italic, underline.';
$header = "From: $from\r\nReply-to: $from";

if ( mail($to, $subject, $message, $header) ) {
echo "Email sent to $to!";
} else {
echo "Error occured while sending email to $to!";
} //end if
?>

Lưu chương trình vào file example2.php và chạy thử. Email gởi thành công, tới nơi an toàn, nhưng khi mở ra xem thì nội dung email lại như vầy:
A HTML email: bold, italic, underline.
Thế có tức không?

Thực ra bạn chỉ cần sửa lại chương trình "1 chút xíu" là đâu vào đấy ngay:

//nội dung file example3.php

$from = 'from@domain.com';
$to = 'to@domain.com';
$subject = 'Example 3: Send HTML email';
$message = 'A HTML email: bold, italic, underline.';
$header = "Content-type: text/html\r\nFrom: $from\r\nReply-to: $from";

if ( mail($to, $subject, $message, $header) ) {
echo "Email sent to $to!";
} else {
echo "Error occured while sending email to $to!";
} //end if
?>

Lưu chương trình vào file example3.php và chạy thử. Lần này thì nội dung email nhận được như mong muốn:
A HTML email: bold, italic, underline..

Như vậy bạn sẽ nhận thấy rằng gởi HTML email cũng đơn giản không khác gì gởi text email thông thường. Chỉ cần thêm 1 header Content-type: text/html là nội dung email sẽ được hiểu là HTML ngay.

Lưu ý: Riêng phần tiêu đề (subject) của email vẫn phải là text thông thường! Bạn không thể sử dụng mã HTML trong phần tiêu đề (subject) của email được. Vì thực chất phần tiêu đề của email cũng là 1 header đặt biệc chứ không nằm trong phần nội dung chính của email.

GỞI EMAIL VỚI TIẾNG VIỆT UNICODE

Gởi email tiếng Việt Unicode cũng y chang như gởi email HTML vì bản thân HTML đã hỗ trợ Unicode rồi, ta chỉ cần chú ý đặt charset của email cho đúng là được:

//nội dung file example3.php

$from = 'from@domain.com';
$to = 'to@domain.com';
$subject = 'Example 4: Send Unicode email';
$message = 'Email tiếng Việt Unicode: in đậm, in nghiêng, gạch chân.';
$header = "Content-type: text/html; charset=utf-8\r\nFrom: $from\r\nReply-to: $from";

if ( mail($to, $subject, $message, $header) ) {
echo "Email sent to $to!";
} else {
echo "Error occured while sending email to $to!";
} //end if
?>

Lưu chương trình vào file example4.php và chạy thử: email gởi thành công, tới nơi an toàn và khi đọc thì hiển thị...tiếng Ả-rập!!! Có gì sai ở đây chăng?

Thực ra không có gì phải lo lắng cả. Khi gởi email tiếng Việt Unicode bạn cần chú ý một số điểm sau:

  • Đặt charset cho email. Charset này phải nên trùng với charset của file mã nguồn PHP và website của bạn. Trong ví dụ ở trên, ta đặt charset cho email là utf-8 thì bạn cũng phải lưu file example4.php lên đĩa với charset là utf-8. Bạn xem mục "LƯU FILE VỚI TIẾNG VIỆT UNICODE" ở bài viết Giới thiệu - Các bước chuẩn bị cần thiết để tìm hiểu thêm về lưu file mã nguồn PHP lên đĩa với charset utf-8.
  • Cho dù bạn đã đặt charset đúng rồi, vẫn có thể email không hiển thị đúng tiếng Việt khi đọc! Vì quyền hiển thị email như thế nào là do chương trình email client quyết định. Nếu bạn đọc email bằng Outlook chẳng hạn, thì Outlook sẽ tự động nhận biết charset của email và hiển thị đúng tiếng Việt. Nếu bạn đọc email trên web (như Yahoo, Hotmail...) thì có thể bạn phải tự tay chọn lại Encoding là utf-8 trên trình duyệt vì các web email như Yahoo, Hotmail sẽ dùng charset mặc định của mình và bỏ qua charset được thiết lập trong email.
Và tương tự như khi gởi HTML email, bạn đừng nên ghi tiếng Việt vào phần tiêu đề (subject) của email! Vì như đã nói ở phần trước, tiêu đề (subject) của email cũng là 1 header đặt biệc chứ không nằm trong phần nội dung chính của email.

MỘT SỐ LỖI HAY GẶP VỚI HÀM MAIL()

Email gởi không tới nơi
Hàm mail() trả về giá trị TRUE, địa chỉ đúng, nội dung đúng, nói chung mọi thứ đều đúng nhưng email chờ hoài không thấy tới! Kiểm tra Bulk email cũng không thấy luôn! Lỗi ở đâu hè? Nguyên nhân có thể xảy ra ở 3 chỗ:

  • mail server - server của bạn không cho phép account của bạn gởi email, hoặc giới hạn chỉ cho phép gởi số lượng giới hạn email trong 1 khoảng thời gian nào đó. Bạn cần hỏi người quản lý server của bạn về quyền gởi email với PHP trên server.
    Nếu vấn đề không phải nằm ở chỗ server không cho phép bạn gởi email, hoặc chính bạn là người quản lý server thì bạn kiểm tra tiếp 1 trong 2 nguyên nhân sau:
  • *NIX server (server chạy các hệ điều hành UNIX hoặc Linux) - PHP mặc định sẽ sử dụng lệnh sendmail có sẵn trên hệ thống để gởi email (với tham số -t -i). Mặc định lệnh sendmail sẽ nằm trong /usr/sbin/sendmail hoặc trong 1 thư mục nào đó trong PATH của hệ thống. Nếu trên server của bạn lệnh sendmail nằm ở chỗ khác với thư mục mặc định (ví dụ trên server của bạn sendmail nằm ở /usr/local/secretbin/sendmail) thì bạn có thể làm như sau:
    - Tìm và mở file php.ini ra.
    - Tìm chuỗi "sendmail", bạn sẽ thấy 2 dòng tương tự như sau:
    ; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
    ;sendmail_path =

    - Bạn sửa lại 2 dòng đó như sau:
    ; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
    sendmail_path = /usr/local/secretbin/sendmail -t -i

    Nhớ bỏ ký tự chấm phảy (;) ở đầu dòng sendmail_path =!
    Lưu ý: Cấu hình của PHP tới đây đã đúng và đủ để gởi email trên server *NIX. Tuy nhiên vẫn có thể server không gởi email được! Lỗi lúc này là do bản thân cấu hình của server hoặc quá trình cài đặt và cấu hình chương trình sendmail bị lỗi. Cách kiểm tra nguyên nhân và sửa lỗi nằm ngoài phạm vi của PHP, bạn có thể đặt câu hỏi lên diễn đàn CLB người sử dụng Linux để được giúp đỡ!
  • Windows server - Trên Windows, PHP cần phải dùng 1 SMTP server để gởi email. Bạn tìm và mở file php.ini ra, tìm chuỗi sendmail, gần đó bạn sẽ thấy vài dòng như sau:
    [mail function]
    ; For Win32 only.
    SMTP = localhost
    smtp_port = 25;

    Các dòng trên cho ta biết PHP sẽ dùng SMTP server localhost trên port 25 để gởi email. Rất có thể bạn chưa cài đặt và cấu hình đúng 1 SMTP trên localhost để PHP có thể sử dụng và gởi email. Bạn hãy tham khảo bài viết này để cài đặt 1 SMTP server trên localhost và dùng nó để gởi email với PHP.

Nội dung email bị đứt đoạn
Nếu bạn nhận được email nhưng nội dung bị đứt đoạn không đầy đủ thì có thể do 2 nguyên nhân sau:

  • Mã HTML trong email bị sai - Nếu bạn gởi email HTML thì bạn nên chú ý kiểm tra cú pháp HTML của nội dung email. Giả sử bạn định gởi email với nội dung:
    in đậm
    Nhưng chẳng may bạn ghi sai thành
    thì khi đọc, email sẽ hiển thị bị sai (có thể là mất chữ, đứt đoạn, v.v...).
  • Có 1 dòng chứa 1 dấu chấm (.) ở đầu - Khi bạn gởi email trên Windows dùng SMTP server, nếu nội dung email có 1 dòng nào đó chứa 1 dấu chấm (ký tự .) ở đầu dòng thì ký tự đó sẽ bị bỏ qua, dòng đó sẽ bị bỏ qua, hoặc toàn bộ nội dung email từ dòng đó trở đi sẽ bị bỏ qua. Lý do là vì dòng chứa 1 dấu chấm ở đầu chính là dấu hiệu báo cho SMTP server biết đã kết thúc nội dung của email. Để khắc phục, trước khi gởi email, ta thay thế dấu chấm ở đầu dòng bằng 2 dấu chấm:
    $message = str_replace("\n.", "\n..", $message);
Sưu Tầm

22 thg 3, 2009

Cài đặt AppServ để chạy Localhost!

Việc đầu tiên là download lấy 1 phiên bản APpserv tại đây: http://sourceforge.net/project/showfiles.php?group_id=37459 ver nào cũng được, 2.5.8 2.5.9 thậm chí tìm cái cũ hơn 1 tí thôi 2.5.7 cũng được!
down về xong thì install!
giao diện install khá đơn giản! chỉ việc next next hay install thôi 10.gif
tuy nhiên đến đây!

thì điền vào thế này:
Server name: nhập vào là localhost
Administrator Email: thế nào cũng được admin@localhost chẳng hạn
port để default là 80 nếu như bạn chưa cài bất kỳ apache nào! à nếu đã cài IIS trên windown ở port 80 thì đổi cái port này thành 8080 gì đó!
khi đó nếu chạy http://localhost thì default sẽ là 80 còn nếu chạy apache thì chạy http://localhost:8080 thế này:
đặt xong hết next tiếp thì ra bản enter root password:

ở đây username sẽ là root!
còn password bạn đặt cho cả 2 trường thì tùy ý! tuy nhiên ở đây nên đặt là root lun cho phẻ! còn nếu đặt là thứ khác thì chút nhớ sửa lại cho phù hợp! các tùy chọn khác cứ để mặc định.
xong hết thì tiến hành install! ngồi chờ! 105.gif
xong xuôi nhé! nhấn vào finish để start apache và start mysql!
mở IE hay gì gì đó lên! gõ vào http://localhost <= nếu để port 80, nếu để port khác thì gõ vào: http://localhost:8080 hay gì gì đó! okie nếu nó hiện ra phiên bản Appserv Open ver mấy mấy đó thì đúng còn trắng chạch thì tiêu! phải coi rồi cài lại từng bước ở trên dùm với!. vậy là đã hoàn thành! có thể up forum hay mã nguồn php gì đó lên để install! tuy nhiên phần PHPMYADMIN còn chút chỉnh sửa: có thể khi bạn vào tạo database trong phpmyadmin: http://localhost/phpMyAdmin/ nó sẽ yêu cầu bạn nhập vào username và password thì bạn gõ vào root và pass là cái bạn nhập vào ví dụ tôi nhập là root lun! tuy nhiên cũng 1 số trường hợp nó sẽ hiện ra cái thông báo :
vậy cần phải tạo lại file config.inc.php trong phpMyAdmin: cách tạo như sau:
đầu tiên mở 1 thư mục với tên là config trong thư mục phpMyadmin! sau đó chạy liên kết:
http://localhost/phpMyAdmin/scripts/setup.php
ở đó bạn chọn add thêm server! ở đó bạn điền đầy đủ và đúng thông tin như:
server hostname
server port
user for config thường là root
pass: root hoặc gì đó bạn đặt khi install
xong chọn add
khi đó trong folder config sẽ có thêm 1 file config.inc.php và bạn lưu lại file này ra ngoài thư mục phpMyadmin! có thể chép đè lên file cũ hoặc lưu file cũ ở đâu đó rồi mới chép file này ra!
vậy là ổn! giờ đã có thể chạy song song localhost và cái site của mình rồi! data của cả 2 bên nên thường xuyên backup restore qua lại để đảm bảo!
thêm cái phpmybackup pro đặt schedule backup daily để an toàn hơn!
Sưu Tầm

21 thg 3, 2009

Kinh nghiệm để học PHP

Để học bất cứ một ngôn ngữ lập trình nào những người mới bao giờ cũng phải trải qua 6 giai đoạn. 1. Quan niệm 2. Thử nghiệm 3. Trải nghiệm 4. Kiểm nghiệm 5. Chiêm nghiệm 6. Sáng tạo

Quan niệm

Hãy xác định nhiệm vụ học cho các bạn. Không có định hướng, không còn tầm nhìn bao quát về thế giới phần mềm và không có cá tính, bạn chắc rồi cũng rời bỏ sớm ngành phần mềm nếu không thì cũng chỉ là một coder hay tester ba phải, người mà lúc nào cũng chỉ được coi là một nhân vật bình thường về mọi mặt, không có sự nổi bật và luôn đứng đầu trong đề cử danh sách về hưu non.

Tiêu chuẩn số 1 của một nhà phát triển phần mềm giỏi là sự đề cao tự học. Trường lớp hay trung tâm không phải là nơi đáng tin cậy để học vì người giỏi ko bao giờ chịu mài đũng quần trên ghế bục giảng để giảng đi giảng lại một thứ kiến thức liên tục cũ đi sau vài tháng. Nếu người giỏi thích nói chuyện thì conference là chỗ của họ vì họ thích trao đổi với các industry expert chứ không phải là dọa dẫm học viên.

Diễn đàn này cũng có thể là nơi để học hỏi nhưng đừng nghĩ là người có hiểu biết sẽ trả lời bạn một cách tường tận và chi tiết như thể họ là ông nội của bạn vậy. Muốn họ trả lời hãy học cách hỏi, trước khi hỏi hãy search. Sau khi nhận được câu trả lời hãy search.

Thử nghiệm
PHP là một công nghệ bao gồm có 6 bộ phận:
+ Bộ thông dịch
+ Ngôn ngữ
+ Cấu trúc dữ liệu
+ Các thuật toán trên dữ liệu hay còn gọi là các API
+ Các công nghệ đi kèm hoặc có thể giao tiếp được với PHP.
+ Các best practice đặc thù của riêng công nghệ đó.

Hãy tập cài đặt bộ thông dịch PHP, Apache, MySQL và chạy triển khai các ứng dụng PHP có sẵn.
Hãy thử nghiệm ngôn ngữ PHP với các vòng lặp, điều kiện, in, nhúng HTML, làm quen function, method, class
Cấu trúc dữ liệu là một phần khác của PHP. Ở công nghệ này Hash, Array và Map đều được gộp vào kiểu array. Rất dễ chịu cho bạn khi bạn đã từng làm quen với các cấu trúc dữ liệu của C# hay Java.
Cấu trúc dữ liệu không phải là một cấu trúc chết. PHP cung cấp khoảng hơn 1000 function (API) xử lý nó. Array là một kiểu như vậy. DOM là một kiểu khác. Làm bài tập trên các API dạng này là một cách tốt để làm quen với ngôn ngữ và bộ thông dịch. Các bài tập có thể chỉ là in ra một cái resume, tạo một cái layout đơn giản nhất từ việc sử dụng include, tạo một form nhập liệu đơn giản, tạo một form upload đơn giản…

Tài liệu sách vở thì có rất nhiều. Bạn nên đọc các chương trong PHP Manual. Đọc các tutorial trên mạng và luyện tiếng Anh. Các ebook đáng chú ý:

Trích:
++ Apress Beginning PHP and MySQL 5 From Novice to Professional 2nd Edition (2006)
++ Apress Beginning PHP and PostgreSQL E.Commerce (2006)
++ Prentice Hall PHP 5 Power Programming (2004)
++ O’reilly Programming PHP 2nd Edition (2006)
Các công nghệ đi kèm với PHP là một thế giới cực kì phức tạp. Bạn có thể sẽ làm quen với các công nghệ opcode hay biên dịch mã PHP ra mã nhị phân để chạy thay vì nhìn nó dưới dạng text. Nó là một extension nguồn mở của công nghệ PHP. Bạn cũng có thể quan tâm đến việc sử dụng PHP để giao tiếp với các hệ thống con trong Linux như shared memory, gettext, socket, stream… Socket và stream là các công cụ vạn năng để PHP giao tiếp với các hệ thống phần cứng và phần mềm. Bạn cũng có thể quan tâm đến sử dụng PHP và C trên cùng một file PHP thông thường hay nhúng mã dll của các thư viện trên Windows vào PHP và sử dụng lại. PHP làm việc này thông qua việc sử dụng một ext. mã nguồn mở do Wez viết có thể tải về PECL. Bạn cũng có thể quan tâm đến việc sử dụng PHP để viết các ứng dụng desktop mà bạn có lẽ vẫn dùng VB để viết bằng cách sử dụng thư viện GTK.

Tuy nhiên điều bạn có thể sẽ quan tâm hơn cả là liệu PHP được hỗ trợ như thế nào để giao tiếp với các hệ thống khác. PHP có thư viện để giao tiếp với Active Directory, LDAP, các hệ thống hỗ trợ SMTP/POP3/IMAP/FTP/SSL, SMS Gateway, GIS server, Router… PHP được Java hỗ trợ tốt để trở thành một công nghệ trên Java platform và nhờ đó bạn có thể gọi các gói Java để sử dụng lại hay sử dụng các application server của Java như Sun One Webserver, Glassfish application server thay cho Apache server hoặc sử dụng các dịch vụ Java khác như OpenSSO. JSON và XML được hỗ trợ buit-in trong PHP cũng là phần rất đáng tìm hiểu vì các nhà công nghiệp phần mềm ở các tổ chức chuẩn công nghiệp như OASIS, ECMA hay W3C sử dụng các gọi này để giúp PHP hỗ trợ kiến trúc Webservice/SOA, SDA, MDA (phần này do IBM đóng góp cho cộng đồng PHP)…..

Phần PHP giao tốt tốt nhất có lẽ là database. OCI do Oracle đóng góp, DB2 do IBM đóng góp, libmysql do MySQL AB đóng góp và pgsql do cộng đồng PostgreSQL đóng góp và luôn hỗ trợ các bản database mới nhất. Ngoài ra PHP có sẵn một database server SQLite nhúng đi kèm với mọi bản PHP 5.0+ có thể giúp bạn tiện trong việc xử lý các nhóm data nhỏ nhưng đủ mạnh mẽ như Access.

PHP là một công nghệ đặc biệt và nó có các đặc trưng riêng như share nothing. Điều này làm cho PHP có tính scalability rất tốt và được các mạng xã hội rất chuộng. Không phải ngẫu nhiên mà Tim Bray, giám đốc các công nghệ Web của Sun lại cho là PHP có tính scalable hơn Java trên tầng presentation (http://www.tbray.org/talks/php.de.pdf) trong khi từ trước đến nay họ vẫn tự hào là công nghệ Java cho họ thống trị thế giới web doanh nghiệp, các phần mềm ngân hàng và thị trường viễn thông, vượt trội cho với công nghệ .NET của Microsoft. Đặc điểm này của PHP cũng là tâm điểm tạo ra các best practice mà bạn cần khai thác khi lập trình với PHP.


Trải nghiệm
Là giai đoạn bạn bắt đầu quan tâm đến việc dùng PHP để code các ứng dụng sản xuất bằng việc tự tin sử dụng các API. Giai đoạn này hoàn toàn phù hợp với việc lấy một chứng chỉ Zend nếu bạn muốn. Tuy nhiên Zend chỉ chứng nhận bạn là có kĩ năng để nhớ API, một điều khá cần để code API với notepad Đặc trưng của giai đoạn này là thực hành để có các cảm nhận chung về kĩ năng code. Giai đoạn này sẽ đem lại cho bạn một niềm tự hào trẻ con nhưng rất cần thiết. Giai đoạn này bạn sẽ phải kết hợp PHP với CSS/XHTML, graphic design, SQL, web authoring, Javascript, web hosting, system scripting… Là một lập trình PHP, bạn tự biết mình phải đa tài hơn các lập trình viên ASP.NET, nơi tooling thống trị kĩ năng handcode, hơn Java, nơi mà kĩ năng viết business logic được chú trọng hơn

Kiểm nghiệm
Nếu như giai đoạn trải nghiệm là giai doạn code bung bét, bug tùm lum, bảo mật bằng không thì đây chính là lúc bạn quan tâm đến việc refactor lại code. Bạn có thể tạo ra nhiều function và class hơn trong một nỗ lực cố gắng làm cho chúng modular hơn. Bạn sẽ cố áp dụng các thư viện như PEAR hay Smarty, PHPSavant vào ứng dụng của bạn để làm cho cách code của bạn đi vào chiều hướng ổn định. Lúc này bạn đã thấy được sự cần thiết phải có một coding convention nhất quán ([url=http://pcdinh.googlepages.com/phpvietnamcodingstandards]Reference[/url). Bạn sẽ quan tâm đến bảo mật hơn. Giai đoạn này sẽ giúp bạn có một lối tư duy chín chắn hơn nhưng nhiều lo ngại hơn vì bạn cho rằng bạn vẫn chưa thực sự hiểu PHP.

Chiêm nghiệm
Đây là giai đoạn bạn đã tiến đến mức cao. Bạn đã nắm được bản chất của PHP. Bạn quan tâm đến cơ chế PHP vận hành ở mức compiler hơn. Bạn bắt đầu học UML, design pattern, tìm hiểu về các hệ thống lớn. Bạn đã vững vàng trong việc tạo ra các lớp và muốn tổ chức các lớp đó cho khoa học hơn. Bạn quan tâm đến các software engineering processes và tự hỏi làm sao để áp dụng XP, Scrum hay các agile methodology khác. Bạn sẽ quan tâm đến performance, object oriented engineering, database design, system architect, code review. Bạn sẽ bắt đầu chán Pear và ghét Smarty. Việc tương tác giữa PHP và các hệ thống khác như Python, Ruby, Jaav, Erlang .. trở nên quan trọng hơn với bạn lúc này vì cuối cùng thì bạn đã nhận ra PHP có nhiều điểm yếu nhưng không tới mức phải thay thế PHP bằng 1 giải pháp khác. Các công nghệ mã nguồn mở và tự do sử dụng phân phối như Java, Perl, Python, Ruby, JRuby, Groovy, Erlang, Lua… cho phép chúng tận dụng các thư viện của nhau cũng như các điểm mạnh riêng của nhau. Đó là thời gian bạn thấy sung sướng vì đã chọn 1 công nghệ nguồn mở như Java hay PHP hay Python.

Sáng tạo
Là giai đoạn cao nhất và cũng phức tạp nhất vì lúc này bạn đã hiểu công nghệ đến mức có thể triển khai các hệ thống lớn, customize và migrate các ứng dụng phức tạp. Có đủ tư duy và kiến trúc cũng như độ trải nghiệm thực tế để thiết kế hệ thống . Lúc này bạn đã có thể tự đặt cho mình mục tiêu làm các ứng dụng lớn với PHP kiểu như
+ Flickr: 60 000 LOC
+ Digg: 200 000 LOC
Bạn cũng có thể hoàn toàn tự tin dùng PHP để tạo ra các ứng dụng ERP, CRM, Forecast System vốn thường được code bằng Java, ASP.NET hay Delphi có truyền thống đắt đỏ, kén server, đòi hỏi nhiều tài nguyên. Lúc đó, PHP trong tay bạn đã vượt ra khỏi phạm vi của một công nghệ web vì bạn đã biết đủ PHP và mối quan hệ với các công nghệ bổ sung cũng như kinh nghiệm triển khai các công nghệ đó.

Bạn đột nhiên quan tâm nhiều đến các cuộc hội thảo. Bạn thấy kinh nghiệm của các industry expert thật cần thiết và gần gũi với khả năng của bạn. Có thể một lúc nào đó, bạn thấy mình gần như là một thought leader. Một lúc khác, bạn lại muốn nhập vai một C hacker.

Lúc này bạn đã lớn rồi. Ai dám khuyên bạn nữa chứ Cẩn thận, bạn có thể là một PHP Dictator đấy.

Sưu Tầm