Học PHP, Phần 1: Đăng ký một tài khoản, tải lên các tệp để phê duyệt, xem và tải về tệp đã được phê duyệt

Hướng dẫn này là Phần 1 của một loạt bài gồm ba phần "Học PHP" dạy bạn cách sử dụng PHP thông qua việc xây dựng một ứng dụng tiến trình công việc đơn giản. Hướng dẫn này dẫn bạn qua việc tạo một trang PHP cơ bản dùng các biểu mẫu HTML trình bày việc truy cập cơ sở dữ liệu.

Nicholas Chase, Tác giả tự do, Site Dynamics Interactive Communications

Nicholas Chase đã phát triển trang web cho các công ty lớn như Lucent Technologies, Sun Microsystems, Oracle, và Tampa Bay Buccaneers. Nick đã từng là một giáo viên vật lý ở trường phổ thông, một nhà quản lý thiết bị phóng xạ mức thấp, một nhà biên tập tạp chí khoa học viễn tưởng trực tuyến, một kỹ sư đa phương tiện, một hướng dẫn của Oracle, và một trưởng phòng công nghệ của một công ty tương tác truyền thông. Nick là tác giả của một số sách



Tyler Anderson, Kỹ sư, Backstop Media

Tyler's photoTyler Anderson đã tốt nghiệp chuyên ngành Khoa học Máy tính tại trường Đại học Brigham Young năm 2004 và hiện đang tham gia học kỳ cuối chương trình đào tạo Thạc sỹ khoa học chuyên ngành Công nghệ Máy tính. Trước đó, anh đã làm việc như là một lập trình viên cơ sở dữ liệu cho DPMG.COM, và hiện tại anh đang là kỹ sư cho tập đoàn Stexar, dựa trên nền tảng Beaverton, Oregon



30 09 2010

Trước khi bạn bắt đầu

Về hướng dẫn này

Hướng dẫn này dẫn bạn qua việc xây dựng một ứng dụng tiến trình công việc đơn giản với PHP. Người dùng sẽ đăng ký một tài khoản, tải lên các tệp để phê duyệt, xem và tải về tệp đã được phê duyệt. Những người dùng là quản trị viên có thể xem các tệp được tải lên và phê duyệt chúng để tạo các tệp có sẵn cho tất cả người dùng. Phần 2Phần 3 của loạt bài này nghiên cứu việc bảo vệ mật khẩu HTTP và các vấn đề liên quan khác.

Hướng dẫn này bao gồm những phần sau đây:

  • Tạo một trang cơ bản.
  • Các biến, các vòng lặp và các câu lệnh if-then.
  • Các hàm.
  • Kết nối đến cơ sở dữ liệu.
  • Sử dụng các tệp kèm theo (include).
  • Các công cụ.

Ai nên sử dụng hướng dẫn này?

Nếu bạn là một lập trình viên, muốn học cách sử dụng PHP để xây dựng các ứng dụng trên nền Web, bắt đầu từ đây với Phần 1 của một loạt bài hướng dẫn ba phần. PHP là một ngôn ngữ dựa trên kịch bản dễ học, nhưng vẫn cho phép bạn xây dựng các ứng dụng phức tạp với chức năng mạnh. Hướng dẫn này dẫn bạn qua việc tạo một trang PHP cơ bản sử dụng các biểu mẫu HTML và trình bày việc truy cập cơ sở dữ liệu.

Các điều kiện cần trước

Hướng dẫn này giả định bạn chưa có kinh nghiệm gì về PHP. Trong thực tế, trong khi để làm quen với các khái niệm HTML thật có ích cho bạn, thì không việc lập trình khác nào cần thiết cho hướng dẫn này.

Các yêu cầu hệ thống

Bạn cần có một máy chủ Web, PHP và một cơ sở dữ liệu đã được cài đặt và sẵn sàng để sử dụng. Nếu có một tài khoản trên máy chủ, bạn có thể sử dụng nó miễn là máy chủ đã cài đặt phiên bản V5 của PHP và đã truy cập vào một cơ sở dữ liệu MySQL. Nếu không, hãy tải về và cài đặt các gói sau:

Web server (máy chủ Web)
Cho dù bạn đang ở trong Windows hay Linux (hay Mac OS X cũng vậy), bạn có tùy chọn sử dụng các máy chủ Web Apache. Xin tự do chọn một trong hai phiên bản v1.3 hoặc 2.0, nhưng các hướng dẫn trong phần này tập trung vào V2.0. Nếu đang ở trong Windows, bạn cũng có tùy chọn sử dụng Các dịch vụ thông tin Internet (Internet Information Services), là một phần của Windows.
PHP V5 (Phiên bản V5 của PHP)
Bạn sẽ cần một bản phân phối của PHP. Cả hai phiên bản V4 và V5 của PHP đang sử dụng tại thời điểm viết bài này, nhưng do những thay đổi trong V5, chúng tôi sẽ tập trung vào phiên bản đó. (Phiên bản này không phải rất quan trọng trong hướng dẫn này, nhưng nó tạo một sự khác biệt cho phần sau của loạt bài này).
MySQL
Một phần của dự án này liên quan đến việc lưu dữ liệu vào cơ sở dữ liệu, do đó bạn sẽ cũng cần một trong những cơ sở dữ liệu đó. Trong hướng dẫn này, chúng tôi sẽ tập trung vào cơ sở dữ liệu MySQL vì nó thường được sử dụng với PHP.

Cú pháp PHP cơ bản

Một trang PHP cơ bản

Chúng ta hãy xem những cơ sở của việc tạo một trang với PHP. Trong phần tiếp theo, bạn sẽ xem việc sử dụng một biểu mẫu HTML để gửi thông tin tới PHP, nhưng trước tiên bạn cần biết cách thực hiện một số nhiệm vụ cơ bản.

Hãy bắt đầu bằng cách tạo trang PHP cơ bản nhất:

<html>
 <title>Workflow Registration</title> 
 <body> 
     <p>You entered:</p> 
     <p><?php echo "Some Data"; ?></p>
 </body> 
</html>

Nói chung, bạn có một trang HTML đơn giản với một phần PHP duy nhất in đậm. Khi máy chủ gặp kí hiệu <?php , nó biết đánh giá các lệnh tiếp theo, thay vì chỉ đơn giản gửi các lệnh đó tới trình duyệt. Máy chủ tuân theo các hướng dẫn sau -- sẽ được thảo luận sau đây -- cho đến khi kết thúc phần này, như được biểu thị bằng kí hiệu ?>.

Trong trường hợp này, bạn chỉ có một lệnh, echo, bảo cho máy chủ xuất văn bản đã chỉ thị. Điều đó có nghĩa là nếu bạn lưu trang đó và gọi nó bằng trình duyệt của bạn, trình duyệt đó sẽ nhận được:

 <html>
     <title>Workflow Registration</title> 
     <body> 
         <p>You entered:</p> 
         <p>Some Data</p> 
     </body> 
</html>

Để thấy trình duyệt này đang hoạt động, hãy lưu tệp là registration_action.php và di chuyển nó vào thư mục gốc tài liệu của máy chủ của bạn. Đối với Apache, thư mục này có thể sẽ là /var/www/html. Đối với Internet Information Services, thư mục này sẽ là C:\Inetpub\wwwroot.

Mở trình duyệt của bạn và chỉ tới địa chỉ http://localhost/registration_action.php. Bạn sẽ thấy giống như Hình 1.

Hình 1. Đầu ra từ lệnh echo
Đầu ra từ lệnh echo

Bây giờ bạn đã viết trang PHP đầu tiên của bạn.

Các biến

Một biến là nơi chứa dữ liệu. Bạn có thể gán giá trị cho biến và từ đó về sau, bất kỳ lúc nào PHP gặp biến của bạn, nó sẽ sử dụng giá trị đó để thay thế. Ví dụ, thay đổi trang của bạn để đọc:

<html> 
<title>Workflow Registration</title>
<body> 
     <p>You entered:</p> 

<?php 
    $username = "tyler"; 
    $password = "mypassword"; 

    echo " <p>Username = " . $username . "</p>"; 
    echo "<p>Password = " . $password . " </p>";
?> 

</body> 
</html>

Lưu tệp (và tải nó lên nếu cần thiết) và làm mới trình duyệt của bạn. Bạn sẽ thấy vài thứ tương tự như Hình 2.

Hình 2. Trình duyệt sau khi làm mới
Làm mới trình duyệt

Trước tiên, hãy lưu ý rằng mỗi dòng được kết thúc bằng dấu chấm phẩy. Ngoài ra, hãy lưu ý rằng bạn sử dụng một khoảng thời gian để kết nối văn bản hoặc đặt nó lại với nhau. Bạn có thể đặt lại bất kỳ số lượng các chuỗi hoặc các đoạn văn bản nào với nhau, theo cách này.

Một lưu ý thêm về các biến: Trong PHP, các tên biến phân biệt chữ hoa, chữ thường, do đó $UserName là một biến khác biến $username.

Một quy ước đặt tên nhất quán, chẳng hạn như việc quyết định rằng tất cả các biến sẽ là chữ thường, có thể tồn tại lâu mà tránh được lỗi khó nắm bắt.

Trước khi tiếp tục, chúng ta hãy xem một loại biến đặc biệt.

Các hằng số

Bạn có thể thay đổi giá trị của một biến nhiều lần như bạn muốn, nhưng đôi khi bạn muốn thiết lập một biến với hy vọng rằng giá trị sẽ không thay đổi. Các mục này không được gọi là biến -- chúng là các hằng số. Ví dụ, bạn có thể muốn định nghĩa một hằng số thể hiện tiêu đề của mỗi trang:

<?php 
   define("PAGE_TITLE", "Workflow Registration"); 
?>
        
<html> 
<title><?php echo PAGE_TITLE ?></title>
<body> 
  <p>You entered:</p>
...

(Bây giờ nó có thể dường như không quan trọng lắm, nhưng sau đó bạn sẽ thấy đinh nghĩa này có thể được sử dụng trên nhiều trang như thế nào).

Lưu ý rằng bạn đang định nghĩa tên của hằng số và giá trị của nó. Nếu bạn cố gắng thay đổi giá trị của nó sau khi nó được định nghĩa, bạn sẽ bị lỗi.

Cũng lưu ý rằng khi bạn tham chiếu hằng số, như trong phần tử title (tiêu đề), bạn không sử dụng một dấu hiệu đô la, chỉ tên hằng số. Bạn có thể đặt tên một hằng số theo bất cứ tên nào bạn thích, nhưng theo thông lệ người ta sử dụng các chữ hoa.

Xuất ra dễ hơn

Cho đến nay, bạn đã sử dụng lệnh echo để xuất thông tin, nhưng khi bạn chỉ có một đoạn dữ liệu để xuất, lệnh này có thể hơi cồng kềnh một chút.

May mắn thay, PHP cung cấp một cách đơn giản hơn. Bằng cách sử dụng cấu trúc <?= ?> bạn có thể xác định thông tin cho đầu ra:

<?php 
    define("PAGE_TITLE", "Workflow Registration"); 
?> 
<html> 
<title><?= PAGE_TITLE ?> </title> 
<body> 
  <p>You entered:</p> 
...

Lưu ý rằng khi sử dụng toán tử xuất, bạn sẽ không dùng dấu chấm phẩy sau thông tin.

Sau đó, bạn sẽ học các cấu trúc cơ bản khác PHP, chẳng hạn như lệnh if-then, vì bạn sẽ cần chúng để xây dựng ứng dụng.


PHP và các biểu mẫu

Việc tạo và sử dụng các biểu mẫu trong PHP

Các nhà phát triển đã tạo PHP như là một ngôn ngữ lập trình Web. Trong thực tế, trong khi bạn có thể chạy PHP từ dòng lệnh, thì hiếm có ai sử dụng ngôn ngữ này bên ngoài lĩnh vực ứng dụng Web. Kết quả là đối với lập trình viên PHP một trong nhiệm vụ phổ biến sẽ là sử dụng các biểu mẫu Web.

Bạn tạo các biểu mẫu Web bằng HTML và khi người dùng đệ trình biểu mẫu này, trình duyệt sẽ gửi một mảng thông tin đến máy chủ.

Trong phần này, bạn sẽ xem xét các mảng và các cách mà bạn có thể làm với dữ liệu biểu mẫu. Bạn cũng sẽ xem các cách kiểm soát tiến trình của một kịch bản lệnh PHP, chẳng hạn như các vòng lặp và các lệnh if-then.

Tạo một biểu mẫu trong HTML

Bắt đầu bằng cách tạo trang đăng ký cho ứng dụng của bạn. Sau đó người dùng sẽ nhập thông tin của họ và bạn sẽ xác nhận hiệu lực thông tin đó hoặc kiểm tra tính đầy đủ của thông tin đó, trước khi lưu thông tin trong một cơ sở dữ liệu. Bây giờ, chỉ cần tạo biểu mẫu cơ bản. Hãy tạo một tệp mới gọi là tệp registration.php và thêm vào như sau:

<html> 
<head>
<title>Workflow System</title> </head> 
<body> 
<h1>Register for an Account:</h1>       
<form action="registration_action.php" method="GET"> 
           
Username: <input type="text" name="name" /> <br/> 
Email: <input type="text" name="email" /><br /> 
Password: <input type="password" name="pword" /><br /> 
<input type="submit" value="GO" /> 
</form> 
     
</body> 
</html>

Ở đây bạn có một biểu mẫu đơn giản (chứa trong phần tử form có hai đầu vào văn bản: đầu vào mật khẩu và một nút đệ trình. Nếu bạn lưu tệp này trong thư mục tài liệu gốc (với tệp registration_action.php) và gõ vào từng trường, bạn sẽ thấy vài thứ giống như Hình 3.

Hình 3. Đăng ký cho một biểu mẫu tài khoản
Đăng ký cho một biểu mẫu tài khoản

Lưu ý rằng hộp mật khẩu không hiển thị nội dung thực tế mà bạn đang gõ. Nhưng điều gì sẽ xảy ra khi bạn nhấn vào nút GO?

Đệ trình một biểu mẫu

Khi tạo biểu mẫu này, bạn đã tạo phần tử form thực tế như sau:

 <form action="registration_action.php" method="GET">

Phần tử này có hai mẩu thông tin. Đầu tiên, action, cho trình duyệt biết nơi gửi thông tin. Trong trường hợp này, nó sẽ gửi đến trang mà bạn đã tạo trước đó, tệp registration_action.php. Thứ hai, method, cho trình duyệt biết cách gửi dữ liệu.

Hãy xem cách trình duyệt hoạt động. Điền vào một số dữ liệu và nhấn nút GO. Bạn sẽ thấy vài thứ tương tự như Hình 4.

Hình 4. Xuất dữ liệu
Xuất dữ liệu

Trong trường hợp này, bạn đã không đệ trình thông tin đó để nói rằng bạn đã làm, nhưng đó là vì bạn vẫn chưa điều chỉnh trang này để xem dữ liệu đang được đệ trình. Nhưng hãy xem URL.

http://localhost/registration_action.php?name=roadnick&email=
ibmquestions%40nicholaschase.com&pword=supersecretpassword

Lưu ý rằng đối với mỗi phần tử biểu mẫu có một tên, bạn có một cặp giá trị-tên trong URL, được phân tách bằng các ký hiệu &. URL trông như thế này vì bạn đã sử dụng phương thức GET. Bạn cũng xem Sử dụng POST, nhưng trước tiên hãy xem thực tế lấy dữ liệu này từ bên trong trang PHP.

Truy cập dữ liệu biểu mẫu

Bây giờ bạn đã đệ trình biểu mẫu, bạn đã bắt đầu thu được những dữ liệu trong trang đáp ứng thực tế, tệp registration_action.php. Thực hiện các thay đổi sau cho tệp đó:

... 
<body> 
     <p>You entered:</p> 
     
<?php 
   $username = $_GET['name']; 
   $password = $_GET['pword']; 
     
   echo " <p>Username = " . $username . "</p>"; 
   echo " <p>Password = " . $password . "</p>"; 
?>

</body> 
</html>

Điều bạn sắp làm là kéo giá trị có tên ra ngoài mảng $_GET. Sẽ có thêm nhiều hơn về các mảng lúc này, nhưng bây giờ hãy lưu ý rằng nếu bạn làm mới trình duyệt, các câu trả lời thực sự của bạn xuất hiện như trong Hình 5.

Hình 5. Thông tin đúng trong trình duyệt
Thông tin đúng trong trình duyệt

Bạn có thể kéo bất cứ mẩu thông tin đã đệ trình nào theo tên của nó, nhưng vì đây là một mảng, nên bạn còn có các tùy chọn khác.

Các mảng

PHP cho bạn khả năng tạo các mảng hoặc danh sách các giá trị, cho phép bạn di chuyển một nhóm các giá trị tại một thời điểm khá dễ dàng. Ví dụ, bạn có thể tạo một mảng các giá trị và đưa chúng vào trang này:

$formnames = array("name", "email", "pword"); 
echo "0=".$formnames[0]."<br />"; 
echo "1=".$formnames[1]."<br />"; 
echo "2=".$formnames[2]."<br />";

Hàm array() trả về giá trị, trong trường hợp này, là một mảng. (Các hàm này sẽ được đề cập sau, nhưng bây giờ, hãy hiểu rằng bạn gọi nó và nó trả về một giá trị mà bạn gán cho một biến).

Kịch bản lệnh này tạo đầu ra sau:

0=name<br /> 
1=email<br />
2=pword<br />

Lưu ý rằng giá trị đầu tiên có chỉ số là 0, thay vì 1. Cũng lưu ý rằng bạn đã xác định giá trị nào bạn muốn bằng cách thêm chỉ số trong các ngoặc đơn sau tên của biến mảng. Hành động này cũng tương tự như cách mà bạn truy cập các giá trị biểu mẫu và không gây tai nạn nào. Biến $_GET là một loại đặc biệt của một mảng được gọi là mảng kết hợp, có nghĩa là thay vì một chỉ số bằng số, mỗi giá trị có một khóa.

Khi đệ trình biểu mẫu, chủ yếu bạn tạo một mảng như sau:

 $_GET = array("name" => "roadnick", 
               "email" => "ibmquestions@nicholaschase.com", 
               "pword" => "supersecretpassword");

Đó là những gì cho phép bạn trích xuất các giá trị cá nhân, chẳng hạn như $_GET["name"]. Tuy nhiên, nó không cần được thực hiện riêng tư.

Thu thập thông tin mảng

Các mảng kết hợp có thể vô cùng tiện dụng trong việc xử lý dữ liệu, nhưng các tình huống thường xuyên phát sinh trong đó bạn thực sự không biết cấu trúc của mảng như thế nào. Ví dụ, bạn có thể đang xây dựng một thường trình cơ sở dữ liệu chung để thu nhận một mảng kết hợp thông qua một truy vấn.

Thật may mắn, PHP cung cấp hai hàm làm cho cuộc sống dễ chịu hơn một chút:

<body> 
    <p>You entered:</p>
    
<?php 
    $form_names = array_keys($_GET); 
    $form_values = array_values($_GET);

    echo "<p>" . $form_names[0] . " = " . $form_values[0] . "</p>"; 
    echo "<p>" . $form_names[1] . " = " . $form_values[1] . "</p>"; 
    echo "<p>" . $form_names[2] . " = " . $form_values[2] . "</p>"; 
?>
  
</body>
</html>

Hàm array_keys() và hàm array_values() trả về các mảng thông tin số thông thường, do đó bạn có thể sử dụng các mảng đó để kéo dữ liệu ra bằng cách sử dụng các chỉ số bằng số, như trong Hình 6.

Hình 6. Các mảng để kéo dữ liệu ra bằng cách sử dụng các chỉ số bằng số
Sử dụng các chỉ số bằng số để kéo ra dữ liệu

Tuy nhiên, có thể có cách thuận tiện hơn. Ví dụ, điều gì sẽ xảy ra nếu bạn chưa thực sự biết có bao nhiêu các giá trị? PHP cung cấp một số cách để xử lý các mảng kết hợp, cách thuận tiện nhất là xác định xem bạn đã có những thông tin nào rồi. Hãy xem hai cách khác nhau nhằm thực hiện cùng nhiệm vụ tiếp sau đây.

Sử dụng vòng lặp for-next

Một nhiệm vụ rất phổ biến trong PHP là lặp theo một số giá trị. Bạn có thể thực hiện dễ dàng nhờ vòng lặp for-next. Một vòng lặp for-next chạy qua một số các giá trị dựa trên định nghĩa của nó. Ví dụ, vòng lặp:

 for ($i = 0; $i < 10; $i++) { echo $i . " "; }

tạo đầu ra:

 0 1 2 3 4 5 6 7 8 9

PHP ban đầu gán một giá trị là 0 cho $i vì đó là những gì được quy định lúc bắt đầu vòng lặp. Vòng lặp tiếp tục miễn là $i nhỏ hơn 10 và mỗi lần vòng lặp thực hiện, PHP sẽ tăng giá trị của $i thêm một.

Điều này có nghĩa nếu bạn có thể tìm ra bao nhiêu giá trị trong mảng $_GET GET -- mà bạn có thể làm được – thì bạn có thể dễ dàng tạo vòng lặp qua tất cả các giá trị được biểu mẫu đó cung cấp:

<body> 
   <p>You entered:</p>
   
<?php 
   $form_names = array_keys($_GET); 
   $form_values = array_values($_GET);
   for ($i = 0; $i < sizeof($_GET); $i++) { 
     echo "<p>".$form_names[$i]." = " . $form_values[$i] . "</p>"; 
   } 
?> 
  
</body> 
</html>

Hàm sizeof() cung cấp cho bạn một số các giá trị trong mảng $_GET.Bạn có thể sử dụng dữ liệu đó để cho bạn biết khi nào dừng vòng lặp, như trong Hình 7.

Hình 7. Sử dụng hàm sizeof để dừng vòng lặp
Sử dụng hàm sizeof để dừng vòng lặp

Với $_GET là một mảng kết hợp, bạn thực sự có một tùy chọn khác nữa: vòng lặp foreach.

Sử dụng vòng lặp foreach

Các mảng kết hợp phổ biến trong PHP đến mức mà ngôn ngữ này cũng cung cấp một cách dễ dàng để lấy dữ liệu mà không cần trải qua quá trình trích xuất các khóa và giá trị. Thay vào đó, bạn có thể sử dụng một vòng lặp foreach, trực tiếp thao tác mảng. Ví dụ, hãy xem mã này:

... 
<?php 
  foreach ($_GET as $value) { 
     echo "<p>" . $value . "</p>"; 
  } 
?>

Lần đầu tiên PHP thực hiện vòng lặp này, nó lấy giá trị đầu tiên trong mảng $_GET và gán giá trị đó cho $value, mà nó xuất ra. Rồi PHP trở lại đầu vòng lặp và gán giá trị tiếp theo cho $value, thực hiện điều này đối với mỗi giá trị trong $_GET (ở đây là name). Kết quả cuối cùng là đầu ra:

<p>roadnick</p>
<p>ibmquestions@nicholaschase.com</p>
<p>supersecretpassword</p>

Tuy nhiên, dễ sử dụng hơn là khả năng trích xuất giá trị khóa:

 ...
<?php 

  foreach ($_GET as $key=>$value) { 
     echo "<p>".$key." = " . $value . "</p>"; 
  } 
?>
 ...

Điều này làm cho chúng ta trở lại kết quả ban đầu của mình:

Hình 8. Kết quả ban đầu
Kết quả ban đầu

Các giá trị của nhiều biểu mẫu

Trong chủ đề các giá trị biểu mẫu, bạn cần đối phó với một tình huống đôi khi xảy ra: khi bạn có nhiều giá trị biểu mẫu với một tên duy nhất. Ví dụ, do những người dùng không thể thấy họ đang gõ mật khẩu nào, bạn có thể muốn làm cho họ gõ mật khẩu hai lần để xác nhận rằng họ đã không phạm sai lầm:

... 
Username: <input type="text" name="name" /><br /> 
Email: <input type="text" name="email" /><br /> 
Password: <input type="password" name="pword[]" /><br /> 
Password (again): <input type="password" name="pword[]" /><br /> 
<input type="submit" value="GO" /> 
...

Lưu ý rằng tên của trường pword đã thay đổi một chút. Vì sắp tìm nhiều giá trị, bạn cần tự xử lý mật khẩu này như là một mảng. Đúng, điều đó có nghĩa là bạn có một giá trị mảng là một mảng khác. Vì vậy, nếu bạn đệ trình biểu mẫu đó bây giờ, nó tạo một URL sau:

http://localhost/registration_action.php?name=roadnick&email=ibmquestions%40nicholas
chase.com&pword[]=supersecretpassword&pword[]=supersecretpassword

Đệ trình biểu mẫu giống như việc tạo các mảng, chẳng hạn như:

$passwords = array("supersecretpassword", "supersecretpassword"); 
$_POST = array("name"=>"roadnick", 
               "email"=>"ibmquestions@nicholaschase.com", 
               "pword"=>$passwords);

Tất cả điều này có nghĩa là nếu bạn muốn xem các giá trị mật khẩu, bạn sẽ cần truy cập chúng như là một mảng số, như trong:

... 
  foreach ($_GET as $key=>$value) { 
    echo "<p>".$key." = " . $value . "</p>"; 
  } 

  $passwords = $_GET["pword"]; 
  echo "First password = ".$passwords[0]; 
  echo "<br />"; 
  echo "Second password = ".$passwords[1];
...

Nếu bạn đệ trình biểu mẫu đó (hoặc làm mới trang đó), bạn có thể thấy sự khác biệt, như trong Hình 9.

Hình 9. Đệ trình biểu mẫu
Đệ trình biểu mẫu

Lưu ý rằng trường mật khẩu bây giờ có kết quả là Array (mảng), nhưng bạn có thể truy cập trực tiếp các giá trị của nó.

GET so với POST

Cho đến nay, bạn đang sử dụng phương thức GET để đệ trình dữ liệu, mà như bạn đã thấy, phương thức đặt đúng dữ liệu trong URL. Bây giờ, đôi khi điều này thích hợp và đôi khi không. Ví dụ, bạn có thể sử dụng kỹ thuật này để mô phỏng việc đệ trình một biểu mẫu bằng cách dùng một liên kết, nhưng nếu bạn có một lượng lớn dữ liệu -- ít nhất là, đến từ một textarea - vùng văn bản, trong đó những người dùng có thể nhập các ý kiến -- kỹ thuật này không phải là cách tốt nhất hoàn thành mục tiêu của bạn. Có một điều là, các máy chủ Web thường hạn chế số ký tự mà chúng sẽ chấp nhận trong một yêu cầu GET.

Có một điều khác là, các yêu cầu kỹ thuật và các tiêu chuẩn tốt cho rằng bạn không bao giờ sử dụng GET cho một hoạt động mà có "các hiệu ứng phụ" hoặc là thực sự làm cái gì khác. Ví dụ, ngay bây giờ bạn chỉ cần xem dữ liệu, do đó không có tác dụng phụ nào ảnh hưởng đến hoạt động đó. Nhưng, về sau bạn sẽ thêm dữ liệu vào cơ sở dữ liệu, theo định nghĩa sẽ có hiệu ứng phụ.

Nhiều lập trình viên Web không ý thức về sự hạn chế cụ thể này, có thể sinh ra các vấn đề. Việc sử dụng GET, cụ thể một URL, có thể dẫn đến các tình huống trong đó các hệ thống thực hiện hoạt động nhiều lần vì một người sử dụng đã đánh dấu trang đó hoặc vì một máy tìm kiếm đang đánh chỉ mục URL, không biết nó thực sự đang cập nhật một cơ sở dữ liệu hoặc thực hiện một số hành động khác.

Vì vậy, trong những trường hợp này, bạn sẽ phải sử dụng POST để thay thế.

Sử dụng POST

Sử dụng phương thức POST thay cho phương thức GET thực sự khá dễ dàng. Trước tiên, bạn cần thay đổi trang registration.php:

... 
<h1>Register for an Account:</h1> 
<form action="registration_action.php" method="POST"> 
     
Username: <input type="text" name="name"/><br /> 
...

Bây giờ khi bạn đệ trình biểu mẫu đó, URL chỉ vừa đủ:

http://localhost/registration_action.php

.

Để lấy ra dữ liệu, bạn cần sử dụng mảng $_POST hơn là mảng $_GET trong tệp registration_action.php:

... 
<body> 
   <p>You entered:</p> 

<?php 
    foreach ($_POST as $key=>$value) { 
       echo "<p>".$key." = " . $value . "</p>"; 
    } 
    $passwords = $_POST["pword"]; 
    echo "First password = ".$passwords[0]; 
    echo "<br />"; 
    echo "Second password = ".$passwords[1]; 
?> 

</body>
</html>

Bạn có thể làm việc với mảng $_POST theo cách chính xác giống như bạn đã làm với mảng $_GET.

Kiểm tra lỗi: Câu lệnh if-then

Trước khi tiếp tục, thực ra không tạo bất kỳ ý nghĩa nào khi yêu cầu người sử dụng gõ mật khẩu hai lần nếu bạn không chắc chắn rằng cả hai lần đều khớp . Để làm điều đó, bạn sẽ sử dụng một câu lệnh if-then:

... 
  $passwords = $_POST["pword"]; 
  echo "First password = ".$passwords[0]; 
  echo "<br />"; 
  echo "Second password = ".$passwords[1]; 

  if ($passwords[0] == $passwords[1]) { 
       echo "<p>Passwords match. Thank you.</p>"; 
   } else { echo "<p>Passwords don't match. Please try again.</p>"; } 
...

Trong một câu lệnh if-then, nếu biểu thức trong các ngoặc đơn (trong ví dụ này, $passwords[0] == $passwords[1]) là đúng, PHP thực hiện các câu lệnh trong tập đầu tiên của các dấu móc. Nếu nó sai, nó sẽ không thực hiện. Trong trường hợp này, bạn cũng đã có loạt hành động thay thế để dùng nếu câu lệnh là sai.

Lưu ý rằng $passwords[0] = $passwords[1] với một ký hiệu dấu bằng đơn, bạn đã đưa $passwords[0] == $passwords[1] với một ký hiệu hai dấu bằng. Dấu bằng kép là toán tử so sánh. Nó thực sự phát hiện xem cả hai có bằng nhau không. Ký hiệu dấu bằng đơn là một toán tử gán. Với một ký hiệu dấu bằng đơn, khi bạn thực hiện câu lệnh đó, PHP sẽ gán giá trị $passwords[1] vào $passwords[0], mà rõ ràng không phải điều bạn muốn.

Trong trường hợp này, trang này cung cấp cho người dùng một cảnh báo nếu các mật khẩu không phù hợp, như trong Hình 10.

Hình 10. Cảnh báo hiện ra nếu mật khẩu không khớp
Các mật khẩu không khớp

Hai toán tử dễ sử dụng hơn là toán tử and - và (&&) và hoặc toán tử or - hoặc (||). Ví dụ, bạn có thể cho:

if (($today == "Monday") && ($status == "Not a holiday")) { 
   echo "GO TO WORK!!!"; 
}

Trong trường hợp này, biểu thức trên là đúng chỉ khi hôm nay là Monday (Thứ hai) nó không phải là một ngày nghỉ. Toán tử or trả về đúng nếu có bất kỳ một trong các thành phần nào là đúng.


Các hàm

Tạo một hàm

Khi bạn xây dựng một ứng dụng với bất kỳ kích thước có nghĩa nào, nó thường chạy qua các hành động, các tính toán hoặc các phần khác của mã mà bạn sử dụng lặp đi lặp lại.

Trong những trường hợp đó, lấy mã và sử dụng chúng để tạo một hàm là rất có ích. Ví dụ, bạn có thể chọn việc xác nhận mật khẩu và đặt nó vào một hàm riêng biệt, như:

...
<body> 
     <p>You entered:</p> 
     
<?php 
function checkPasswords($firstPass, $secondPass){ 
      if ($firstPass == $secondPass) {
          echo "<p>Passwords match. Thank you.</p>"; 
      } else { 
          echo "<p>Passwords don't match. 
          \ Please try again.</p>"; 
      } 
 }
       foreach ($_POST as $key=>$value) { 
           echo "<p>".$key." = " . $value . "</p>"; 
       } 
       $passwords = $_POST["pword"]; 
       echo "First password = ".$passwords[0]; 
       echo "<br />"; 
       echo "Second password = ".$passwords[1];
      
?> 
    
</body> 
</html>

Khi máy chủ xử lý trang này, nó nhận từ khóa function và biết không thực hiện phần mã đó cho đến khi có yêu cầu đặc biệt. Vì vậy, vòng lặp foreach vẫn là điều đầu tiên được thực hiện trên trang này, như bạn có thể thấy trong Hình 11.

Hình 11. Thực hiện vòng lặp foreach
Thực hiện vòng lặp foreach

Vì vậy, bạn thực sự sử dụng hàm đó ra sao?

Gọi một hàm

Để gọi một hàm, bạn sử dụng tên của nó và theo sau nó với một cặp dấu ngoặc đơn. Nếu bạn muốn có các đối số, như trong trường hợp này, thì các đối số đó phải ở trong các dấu ngoặc đơn, như sau:

 ... 
<body> 
      <p>You entered:</p> 
      
<?php
     function checkPasswords($firstPass, $secondPass){ 
        if ($firstPass == $secondPass){ 
             echo "<p>Passwords match. Thank you.</p>"; 
        } else { 
          echo "<p>Passwords don't match. Please try again.</p>"; 
        } 
     } 

     foreach ($_POST as $key=>$value) { 
        echo "<p>".$key." = " . $value . "</p>"; 
     } 

     $passwords = $_POST["pword"]; 
     echo "First password = ".$passwords[0]; 
     echo "<br />"; 
     echo "Second password = ".$passwords[1];

     checkPasswords($passwords[0], $passwords[1]); 
?> 
   
</body>
</html>

Khi PHP thực hiện trang này, nó bắt đầu với vòng lặp foreach, đưa ra mật khẩu, sau đó thực hiện hàm checkPasswords(), chuyển qua hai lần gõ mật khẩu như các đối số. (Bạn cũng có thể đã chuyển qua mảng và lấy ra các giá trị riêng từ bên trong hàm đó).

Hình 12. Thực hiện hàm checkPasswords() sau vòng lặp foreach
Thực hiện hàm checkPasswords()

Nếu bạn đã lập trình bằng ngôn ngữ khác nào đó, bạn có thể xem điều này chi tiết hơn về một thường trình con vì mục tiêu là để thực thi một đoạn mã, thay vì trả về một giá trị. Bạn có thể sử dụng các chức năng theo cách nào cũng được, như bạn sẽ thấy tiếp sau.

Trả về một giá trị

Ngoài việc sử dụng một hàm để thực thi một đoạn mã, sử dụng một hàm thường có ích để thực hiện một số loại hành động và trả về một giá trị. Ví dụ, bạn có thể tạo một hàm xác nhận hợp lệ, thực hiện một số hành động, sau đó trả về một giá trị biểu thị liệu có một vấn đề hay không:

 ... 
<body> 
      <p>You entered:</p> 
      
<?php

function validate($allSubmitted){ 
     $message = ""; 

     $passwords = $allSubmitted["pword"]; 
     $firstPass = $passwords[0]; 
     $secondPass = $passwords[1]; 
     $username = $allSubmitted["name"]; 
            
     if ($firstPass != $secondPass) { 
              $message = $message."Passwords don't match<br />"; 
     } 
     if (strlen($username) < 5 || strlen($username) > 50){ 
           $message = $message."Username must be \ 
           between 5 and 50 characters<br />"; 
     } 
     if ($message == ""){ 
           $message = "OK"; 
     } 
     return $message; } 
...

Hàm này lấy mảng $_POST làm một đối số và lấy ra thông tin mà nó cần xem. Bạn bắt đầu với một chuỗi $message rỗng và nếu mật khẩu không khớp hoặc nếu độ dài của tên người dùng (như do hàm strlen() hoặc hàm string length) trả về là sai, bạn thêm văn bản vào chuỗi $message. Nếu mật khẩu khớp và độ dài tên người dùng là đúng, bạn kết thúc với một chuỗi rỗng được bạn gán cho một giá trị là "OK" để bạn có thể kiểm tra nó trong phần thân của trang tiếp theo.

Xác nhận hợp lệ dữ liệu

Bạn đã tạo một hàm trả về một giá trị dựa trên việc nhập phù hợp của người sử dụng, vì vậy bây giờ bạn có thể thử nghiệm với giá trị đó:

... 
  echo "<br />";
  echo "Second password = ".$passwords[1]; 

  if (validate($_POST) == "OK") { 
           echo "<p>Thank you for registering!</p>"; 
  } else { echo "<p>There was a problem with your registration:</p>"; 
           echo validate($_POST); 
           echo "<p>Please try again.</p>"; 
  } 

?>
...

Trong câu lệnh if-then, hàm validate() kiểm tra giá trị trả về được . Nếu nó bằng "OK", một thông báo cảm ơn bạn đơn giản được tạo; nếu không, thông báo tự nó được hiển thị, như trong Hình 13.

Hình 13. Hiển thị thông báo cảnh báo
Hiển thị thông báo cảnh báo

Lưu ý đầu tiên là kỹ thuật này thuận tiện hơn nhiều so với việc thử nghiệm một kết quả cụ thể. Bạn có thể tưởng tượng ra sự hỗn loạn nếu bạn muốn cố gắng để đưa tất cả các điều kiện vào câu lệnh if-then không? Ngoài ra, lưu ý rằng hàm này đang được gọi hai lần ở đây, mà lại không hiệu quả. Trong ứng dụng sản xuất, bạn muốn gán giá trị trả về cho một biến, sau đó kiểm tra lại giá trị đó thay cho các hoạt động lặp lại không cần thiết.

Bây giờ điều bạn biết là tất cả dữ liệuđã đúng, bạn có thể nhập nó vào cơ sở dữ liệu.


Kết nối đến và sử dụng MySQL

Thiết lập

Trước khi tiếp tục, bạn cần chuẩn bị một chút trong MySQL. Bạn cần tạo một cơ sở dữ liệu, thêm một bảng và tạo một người dùng mới có quyền truy cập vào nó.

Từ bàn điều khiển của MySQL, hãy gõ như sau:

create database workflow; 

use workflow; 

create table users (id int auto_increment primary key, username varchar(50), 
          email varchar(255), password varchar(50)); 

show tables;

Kết quả cuối cùng cần trông giống như sau:

+--------------------+
| Tables_in_workflow |
+--------------------+ 
|       users        |
+--------------------+ 
1 row in set (0.00 sec)

Cuối cùng, thêm người sử dụng mới, wfuser, với một mật khẩu của wfpass:

GRANT ALL PRIVILEGES ON *.* TO 'wfuser'@'localhost' 
IDENTIFIED BY 'wfpass' WITH GRANT OPTION;

Bây giờ bạn có thể chuyển sang thực sự sử dụng cơ sở dữ liệu.

Kết nối với MySQL

Hầu như không thể tạo một ứng dụng Web với bất kỳ kích thước có nghĩa nào mà không phải tương tác với cơ sở dữ liệu thuộc loại nào đó. Trong ứng dụng thí dụ của bạn, bạn đang sử dụng một cơ sở dữ liệu MySQL để lưu tên người dùng và thông tin mật khẩu. Trong phần này, bạn sẽ thêm chức năng vào trang đăng ký để nó kiểm tra xem tên người dùng đã đệ trình lên là duy nhất không và chèn các dữ liệu vào trong bảng nếu có. Bạn cũng sẽ xem việc hiển thị thông tin đã có trong một cơ sở dữ liệu. Cuối cùng, bạn sẽ tạo trang đăng nhập của ứng dụng.

Bạn sẽ bắt đầu bằng cách kết nối tới cơ sở dữ liệu. PHP có một số hàm tồn tại độc lập liên quan đến các cơ sở dữ liệu MySQL và bạn sẽ sử dụng chúng trong phần này.

Bước đầu tiên là tạo một hàm để kết nối tới cơ sở dữ liệu tiến trình công việc mà bạn đã tạo trong phần Thiết lập:

... 
    return $message; 
} 
function db_connect($user='wfuser', 
                     $password='wfpass', $db='workflow'){ 
    mysql_connect('localhost', $user, $password) or 
                   die('I cannot connect to db: ' . mysql_error()); 
} 

foreach ($_POST as $key=>$value) { 
   echo "<p>".$key." = " . $value . "</p>"; } 
... 
if (validate($_POST) == "OK") { 
   echo "<p>Thank you for registering!</p>"; 
   db_connect(); 
} else { 
   echo "<p>There was a problem with your registration:</p>"; 
...

Tại đây, bạn đang tạo một hàm, db_connect(), cố gắng để mở một kết nối giữa PHP và cơ sở dữ liệu MySQL. Lưu ý rằng trong định nghĩa của hàm này, bạn đã bao hàm các giá trị cho các đối số. Đây là những giá trị mặc định, có nghĩa là nếu bạn không cung cấp một tên người dùng, mật khẩu và tên cơ sở dữ liệu, PHP sẽ sử dụng các giá trị này. (Trong thực tế, bạn sẽ làm việc đó ngay).

Hàm này thử kết nối đến cơ sở dữ liệu trên máy cục bộ, localhost. Có nghĩa là máy cục bộ so với máy chủ PHP, do đó bạn đang nói về máy chủ Web và chứ không phải là máy khách.

Nếu PHP không thể mở một kết nối, việc xử lý dừng lại (hoặc tắt) và PHP chỉ cần hiển thị một thông báo giải thích điều xảy ra.

Giả sử tất cả mọi việc diễn ra tốt đẹp, kết nối này sẽ vẫn mở cho đến khi bạn đóng nó hoặc cho đến khi kết thúc xử lý trang Web. Bất kỳ các lệnh cơ sở dữ liệu khác mà bạn đưa ra sẽ được hướng vào kết nối đó.

Cuối cùng, gọi hàm này để làm cho tất cả điều này xảy ra.

Lựa chọn một cơ sở dữ liệu

Một máy chủ cơ sở dữ liệu MySQL có thể chứa nhiều cơ sở dữ liệu, vậy một khi bạn đã mở một kết nối đến máy chủ đó, bạn sẽ cần xác định bạn muốn cơ sở dữ liệu nào:

... 
function db_connect($user='wfuser', 
                    $password='wfpass', $db='workflow'){ 
   mysql_connect('localhost', $user, $password) 
            or die('I cannot connect to db: ' . mysql_error()); 
   mysql_select_db($db); 
} 
...

Tại thời điểm này, bạn có một hàm có thể tái sử dụng để kết nối với bất kỳ cơ sở dữ liệu MySQL nào trên máy chủ cục bộ. Thực tế, điều tốt đẹp về hàm này là ở chỗ, theo một nghĩa nào đó, nó độc lập với cơ sở dữ liệu; bạn có thể dễ dàng thay đổi không chỉ tên mà còn kiểu cơ sở dữ liệu đang truy cập và hàm này là nơi duy nhất bạn muốn thực hiện các thay đổi.

Bây giờ bạn đã sẵn sàng chèn dữ liệu của người dùng.

Chèn bản ghi

Bây giờ là lúc để thêm dữ liệu vào bảng users mà bạn đã tạo trước đó. Để thêm dữ liệu, bạn sẽ tạo một câu lệnh SQL để chèn dữ liệu vào trong bảng đó, sau đó bạn sẽ thực hiện câu lệnh đó.

Câu lệnh có dạng:

insert into users (username, email, password) values
('roadnick', 'ibmquestions@nicholaschase.com', 'supersecretpassword')

Bây giờ, nếu bạn đã chú ý đặc biệt lúc tạo bảng, bạn có thể tự hỏi điều gì đã xảy ra với cột id. Bạn đã xác định rằng cột đầu tiên là AUTO_INCREMENT, Bây giờ, nếu bạn đã chú ý đặc biệt lúc tạo bảng, bạn có thể tự hỏi điều gì đã xảy ra với cột id. Bạn đã xác định rằng cột đầu tiên là AUTO_INCREMENT, vậy nếu bạn bỏ sót nó, khi bạn đang làm ở đây, MySQL sẽ tự động điền nó vào với số nguyên có sẵn tiếp theo. Vì vậy, tất cả mọi thứ mà bạn phải làm ở đây là thay thế các dữ liệu do người dùng đệ trình lên các nơi chứa của bạn và thực hiện câu lệnh đó:

... 
if (validate($_POST) == "OK") { 
  echo "<p>Thank you for registering!</p>"; 

  db_connect(); 

  $sql = "insert into users (username, email, password) values 
            ('".$_POST["name"]."', '".$_POST["email"]."', \ 
            '".$passwords[0]."')"; 
  $result = mysql_query($sql);

  if ($result){ 
     echo "It's entered!"; 
  } else { 
     echo "There's been a problem: ".mysql_error(); 
  } 
} else { 
    echo "<p>There was a problem with your registration:</p>"; 
...

Lưu ý rằng khi bạn gọi hàm mysql_query(), nó sẽ trả về một giá trị đang được lưu trong biến $result. Giá trị đó sẽ là đúng nếu hoạt động đã diễn ra trôi chảy và sai nếu có bất kỳ vấn đề phát sinh. Sau đó bạn có thể sử dụng giá trị đó như là biểu thức trong một câu lệnh if-then để đưa ra hành động tùy thuộc vào các kết quả này.

Nếu có vấn đề nào xảy ra, MySQL sẽ thiết lập một giá trị cho hàm mysql_error() để trả về, sau đó bạn có thể xuất giá trị này tới trang đó.

Bây giờ bạn đã thêm thông tin vào cơ sở dữ liệu, đây là lúc xem nó lại.

Lựa chọn các bản ghi

Lúc này, bạn có thể thêm dữ liệu vào cơ sở dữ liệu, nhưng làm sao bạn biết được tên người dùng là duy nhất ? Hiện tại, bạn không biết, nhưng bạn có thể khắc phục điều đó bằng cách kiểm tra bảng users trước khi bạn thực hiện công việc chèn thực sự này:

... 
if (validate($_POST) == "OK") { 
  echo "<p>Thank you for registering!</p>";
 
  db_connect(); 

  $sql = "select * from users where username='".$_POST["name"]."'"; 
  $result = mysql_query($sql); 
  if (!$result) { 
     $sql = "insert into users (username, email, password) values
        ('".$_POST["name"]."', '".$_POST["email"]."', '".$passwords[0]."')"; 
     $result = mysql_query($sql); 

     if ($result){ echo "It's entered!"; 
     } else { echo "There's been a problem: ".mysql_error(); } 
 } else { 
      echo "There is already a user with that name: <br />"; 
      $sqlAll = "select * from users"; 
      $resultsAll = mysql_query($sqlAll); 
  } 
} else { 
    echo "<p>There was a problem with your registration:</p>"; 
...

Bắt đầu bằng cách tạo một câu SQL để chọn bất kỳ bản ghi nào có tên người dùng khớp với tên bạn đang nghĩ để chèn vào. Sau đó bạn có thể thực hiện câu lệnh đó trên cơ sở dữ liệu, cũng như bạn đã làm với câu lệnh insert. Nếu câu lệnh trả về các kết quả bất kỳ, mysql_query() trả về một giá trị đánh giá là đúng và nếu không, nó sẽ trả về sai.

Bây giờ, những gì bạn muốn là không có kết quả nào đối với tên người dùng này, vì vậy bạn muốn giá trị của $result là sai. Nhưng khi bạn sử dụng một câu lệnh if-then, bạn sẽ tìm kiếm câu lệnh true, chứ không phải câu lệnh sai. Vi vậy, bạn sử dụng toán tử negation, dấu chấm than, để nói về bản chất, "Nếu giá trị ngượccủa giá trị này là đúng, thì hãy thực hiện điều này". Và "điều này" trong trường hợp này là chèn dữ liệu vào cơ sở dữ liệu.

Nhưng điều gì sẽ xảy ra nếu $result là đúng để bắt đầu với nó? Sau đó, giá trị ngược của $result sẽ là sai và bạn sẽ thực hiện các câu lệnh khác. Về sau, bạn sẽ liệt kê các tên người dùng và địa chỉ e-mail hiện có, do đó hãy bắt đầu bằng cách tạo và thực hiện câu lệnh SQL đó.

Bạn sẽ lấy ra các kết quả tiếp theo.

Lấy ra các kết quả

Tất nhiên, trong thế giới thực, bạn sẽ không bao giờ hiển thị tên của tất cả người dùng hiện có nếu ai đó đăng nhập một tên người dùng hiện có, nhưng ở đây bạn sẽ nhập tên đó để xem hoạt động này sẽ diễn ra như thế nào.

Trước đây, bạn tạo một câu lệnh SQL để chọn tất cả các bản ghi trong bảng những người dùng và biểu diễn các kết quả trong biến $resultsAll . Bây giờ bạn sắp lấy ra dữ liệu từ biến đó:

 ... 
} else { 
    echo "There is already a user with that name: <br />"; 
    $sqlAll = "select * from users"; $resultsAll = mysql_query($sqlAll); 
    $row = mysql_fetch_array($resultsAll); 

    echo $row["username"]." -- ".$row["email"]."<br />"; 
} 
...

Bước đầu tiên lấy ra các dữ liệu là trích một hàng đơn từ $resultsAll, thực sự là một nguồn tài nguyên thể hiện toàn bộ tập hợp dữ liệu. Hàm mysql_fetch_array(), như tên của nó ngụ ý, trả về một mảng kết hợp bao gồm dữ liệu cho một hàng đơn. Các khóa giống như tên cột, vì thế bạn có thể xuất dữ liệu cho hàng đó rất dễ dàng bằng cách yêu cầu các giá trị thích hợp từ mảng $row.

Nhưng ví dụ này đúng là một hàng đơn. Làm thế nào để truy cập vào tất cả các dữ liệu?

Xem tất cả các kết quả: Vòng lặp while

Nếu, trong lúc tìm đầu tiên, lấy được ít nhất một hàng, $row sẽ thể hiện đúng trong câu lệnh if-then -- hoặc vòng lặp while, mà bạn đang sử dụng ở đây. PHP bắt đầu câu lệnh while ($row) và nói "OK, giá trị biểu thức này đúng, hãy đi tiếp và thực hiện các câu lệnh trong khối này". Nó xuất dữ liệu cho hàng đó, rồi cố gắng tìm nạp sang hàng khác. Sau đó nó quay lại phía đầu vòng lặp.

 ... 
} else { 
    echo "There is already a user with that name: <br />"; 
    $sqlAll = "select * from users"; 
    $resultsAll = mysql_query($sqlAll); 
    $row = mysql_fetch_array($resultsAll); 
    while ($row) { 
         echo $row["username"]." -- ".$row["email"]."<br />"; 
         $row = mysql_fetch_array($result); 
     } 
} 
...

Nếu ý định tìm dòng khác thành công, $row sẽ lại đánh giá là đúng và vòng lặp lại thực hiện. Điều này cứ diễn ra cho đến khi không còn hàng nào nữa và mysql_fetch_array() trả về sai. Vào lúc đó, PHP biết bỏ qua vòng lặp này và chuyển tới phần còn lại của kịch bản lệnh.

Một lưu ý có ích: Nếu bạn bỏ qua bước cuối cùng, ở đó bạn cố gắng lấy một hàng khác, $row sẽ luôn luôn đúng và máy chủ của bạn sẽ tiếp tục chạy vòng lặp này cho đến khi nó chạy hết bộ nhớ hoặc vượt quá thời gian. Vì vậy, khi bạn tạo một vòng lặp loại này, ngay ở câu lệnh đầu tiên bạn nên thêm vào đó thành phần gia tăng khi bạn xem xét.

Đóng kết nối cơ sở dữ liệu

Trước khi tiếp tục, bạn chắc chắn rằng kết nối cơ sở dữ liệu đã mở cần được đóng lại:

 ... 
   if (validate($_POST) == "OK") { 
     echo "<p>Thank you for registering!</p>"; 

     db_connect(); 

     $sql = "select * from users where username='".$_POST["name"]."'"; 
     $result = mysql_query($sql); 
     if (!$result) { 
...
     } 
     mysql_close(); 
   } else { 
...

Bây giờ là lúc xóa sạch mọi thứ.


Xóa sạch: các tệp kèm theo

Tại sao là các tệp kèm theo?

Cho đến nay, mỗi kịch bản lệnh mà bạn đã viết đã hoàn toàn độc lập, với tất cả các mã trong tệp PHP đơn. Trong phần này, bạn sẽ xem việc tổ chức mã của bạn thành nhiều tệp. Bạn sẽ lấy các phần mã mà bạn sử dụng trên nhiều trang và đặt chúng vào trong một tệp riêng biệt, sau đó bạn sẽ kèm theo tệp đó trong các trang gốc.

PHP cung cấp hai cách để kèm theo các tệp. Một là kèm theo các tệp trợ giúp, chẳng hạn như các thành phần giao diện; và hai là kèm theo các tệp quan trọng, chẳng hạn như các hàm được gọi bên trong trang.

Kèm theo các định nghĩa

Hãy bắt đầu bằng việc tạo các tệp mà bạn sẽ kèm theo. Bất cứ khi nào bạn tạo trang Web, một trong những điều đầu tiên bạn cần làm là tạo một tệp đầu trang và cuối trang có chứa các thành phần giao diện chính. Bằng cách đó, bạn có thể xây dựng bao nhiêu trang như bạn muốn mà không cần lo lắng về các trang trông giống như thế nào cho đến khi việc mã hóa được thực hiện. Lúc đó, bạn có thể tạo giao diện chỉ một lần, trong các tệp kèm theo và toàn bộ trang web sẽ được cập nhật ngay lập tức.

Vậy để bắt đầu, hãy tạo một tệp gọi là top.txt và thêm vào như sau:

<html> 
 <head> 
   <title>Workflow System</title> 
 </head> 
 <body> 
   <table> 
     <tr>
        <td colspan="2">
           <h2>The Workflow System</h2>
        </td>
     </tr>
     <tr> 
        <td width="30%"> 
           <h3>Navigation</h3> 
           <p><a href="register.php">Register</a></p> 
        </td> 
        <td>

Trong một tệp khác gọi là bottom.txt, thêm vào như sau:

 </td> </tr> </table> </body> </html>

Lưu cả hai tệp trong cùng thư mục tên là registration.php.

Kèm theo các tệp

Bây giờ làm tiếp và thêm các tệp này vào trang đăng ký. Chỉnh sửa tệp registration.php để trông giống như sau:

<?php 
   include("top.txt"); 
?> 

<h1>Register for an Account:</h1> 
<form action="registration_action.php" method="POST">

   Username: <input type="text" name="name" /><br /> 
   Email: <input type="text" name="email" /><br /> 
   Password: <input type="password" name="pword[]" /><br /> 
   Password (again): <input type="password" name="pword[]" /><br /> 
   <input type="submit" value="GO" />
</form> 

<?php 
    include("bottom.txt"); 
?>

Lưu ý rằng bạn đã gỡ bỏ HTML, thường bao quanh nội dung của trang và đã thay thế nó bằng một lệnh để kèm theo các tệp bạn vừa tạo. Bây giờ là lúc để xem hoạt động đó diễn ra thế nào.

Các kết quả

Nếu bây giờ bạn hướng trình duyệt của bạn sang trang đăng ký, bạn sẽ thấy dáng vẻ khác hơn nhiều, như trong Hình 14.

Hình 14. Dáng vẻ mới của trang đăng ký
Trang đăng ký

Nếu bạn tạo một "nguồn xem" trên trang web, bạn có thể thấy rằng cả ba tệp hiện nay đã hợp lại trong đầu ra:

<html> 
  <head>
     <title>Workflow System</title> 
  </head> 
  <body>
     <table> 
       <tr>
          <td colspan="2">
             <h2>The Workflow System</h2>
          </td>
       </tr> 
       <tr> 
          <td width="30%">
             <h3>Navigation</h3> 
             <p><a href="register.php">Register</a></p> 
          </td> 
          <td>
              <h1>Register for an Account:</h1> 
              <form action="registration_action.php" method="POST"> 
                 Username: <input type="text" name="name" /><br /> 
                 Email: <input type="text" name="email" /><br /> 
                 Password: <input type="password" name="pword[]" /><br /> 
                 Password (again): <input type="password" name="pword[]" /><br /> 
                 <input type="submit" value="GO" />
              </form> 
           </td> 
        </tr> 
     </table> 
  </body> 
</html>

Nếu bạn tiếp tục và thực hiện các thay đổi cho tệp registration_action.php và đệ trình biểu mẫu đó, bạn sẽ thấy rằng các thay đổi xẩy ra ngay lập tức.

Bây giờ, trang này không phải là một tác phẩm nghệ thuật và đó là tốt. Sau này bạn có thể yêu cầu một người thiết kế để làm cho nó trông đẹp và bạn sẽ phải thực hiện các thay đổi này chỉ một lần -- với các tệp bao gồm -- hơn là với mọi trang trên trang Web đó.

Các tệp cần thiết

Nếu PHP không thể tìm thấy các tệp giao diện, thì đó là vấn đề, nhưng không nhất thiết là thảm họa, đặc biệt là nếu tất cả mọi thứ mà bạn đang lo lắng chỉ là các chức năng của ứng dụng đó. Kết quả là, nếu PHP không thể tìm thấy một tệp được hàm include() (kèm theo) xác định, nó sẽ hiển thị một cảnh báo và tiếp tục xử lý các trang.

Tuy nhiên, trong một số trường hợp, việc không thể tìm thấy một tệp kèm theo lại một thảm họa. Ví dụ, bạn có thể kéo các kịch bản lệnh validate()db_connect() ra thành một tệp riêng biệt và kèm theo chúng trong tệp registration_action.php. Nếu PHP không thể tìm thấy tệp đó, thì đó là vấn đề vì bạn đang gọi những hàm đó bên trong trang này. Vi vậy, để tránh điều đó, bạn có thể sử dụng hàm require(), thay vì hàm include():

<?php 
    include("top.txt"); 
    require("scripts.txt"); 
?> 

<p>You entered:</p> 

<?php 
  foreach ($_POST as $key=>$value) { 
     echo "<p>".$key." = " . $value . "</p>"; 
  } 
  $passwords = $_POST["pword"];
  echo "First password = ".$passwords[0]; 
  echo "<br />"; 
  echo "Second password = ".$passwords[1]; 
  if (validate($_POST) == "OK") { 
     echo "<p>Thank you for registering!</p>"; 
...

Nếu PHP không thể tìm thấy một trang được yêu cầu, nó sẽ gửi một lỗi nặng và dừng xử lý.

Tránh trùng lặp

Không gì ngăn cản bạn kèm theo tệp trong một tệp mà tự nó đã kèm theo trong tệp khác. Thực tế, với tất cả các tệp kèm theo này trôi nổi mọi nơi, có thể gây lẫn lộn và bạn có thể kèm theo cùng một tệp nhiều hơn một lần. Việc lặp lại này có thể dẫn đến các thành phần giao diện xuất hiện nhiều lần hoặc các lỗi do việc định nghĩa lại các hàm hoặc các hằng số. Để tránh điều đó, PHP cung cấp các phiên bản đặc biệt về các hàm include()require(). Ví dụ, bạn có thể chắc chắn rằng tệp registration_action.php sẽ nạp các tệp đó chỉ một lần:

<?php 
  include_once("top.txt"); 
  require_once("scripts.txt"); 
?> 

<p>You entered:</p>

<?php 
   foreach ($_POST as $key=>$value) { 
      echo "<p>".$key." = " . $value . "</p>"; 
   } 
...

Khi PHP gặp hàm include_once() hay require_once(), nó kiểm tra để xem tệp này đã được kèm theo trong trang đó chưa trước khi lại kèm theo nó.


Tóm tắt

Trong hướng dẫn này, bạn bắt đầu quá trình xây dựng một ứng dụng trên nền Web bằng cách sử dụng PHP. Bạn đã xem xét cú pháp cơ bản của kịch bản lệnh PHP, sử dụng nó để xây dựng một trang chấp nhận đầu vào từ biểu mẫu HTML. Khi xử lý biểu mẫu đó, bạn đã xem lại các cấu trúc cơ bản, chẳng hạn như các biến, các câu lệnh if-then và các vòng lặp. Bạn cũng đã kiểm tra các mảng số và các mảng kết hợp và cách truy cập dữ liệu của chúng. Sau đó, bạn chuyển sang xem xét và chuyển dữ liệu vào trong và ra ngoài cơ sở dữ liệu MySQL bằng cách tạo một câu lệnh SQL và thực hiện nó, rồi làm việc với các mảng thể hiện mỗi hàng dữ liệu. Cuối cùng, bạn xem việc sử dụng các tệp kèm theo.

Mục đích của loạt bài hướng dẫn này là dạy bạn cách sử dụng PHP thông qua việc xây dựng một ứng dụng tiến trình công việc. Ở đây trong Phần 1, bạn đã bắt đầu tiến trình bằng cách cho phép người dùng đăng ký tài khoản mới, sau đó bạn lưu nó trong cơ sở dữ liệu. Các phần tiếp theo của loạt bài này nghiên cứu việc bảo vệ mật khẩu HTTP và các vấn đề quan trọng khác nhằm giúp bạn trên con đường trở thành một nhà phát triển PHP.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=548685
ArticleTitle=Học PHP, Phần 1: Đăng ký một tài khoản, tải lên các tệp để phê duyệt, xem và tải về tệp đã được phê duyệt
publish-date=09302010