text:
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 2 và Phầ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:
 <title>Workflow Registration</title>
You entered:

<?php echo "Some Data"; ?>

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:
 <title>Workflow Registration</title>
You entered:

Some Data

Để 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
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:
 <title>Workflow Registration</title>
You entered:
 <?php $username = "tyler"; $password = "mypassword"; echo "
Username = " . $username . "
"; echo "
Password = " . $password . "
"; ?>
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
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"); ?>  <title><?php echo PAGE_TITLE ?></title>
You entered:
 ...
(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"); ?>  <title><?= PAGE_TITLE ?> </title>
You entered:
 ...
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:
  <title>Workflow System</title>
Register for an Account:
 <form action="registration_action.php" method="GET"> Username: <input type="text" name="name" />
 Email: <input type="text" name="email" />
 Password: <input type="password" name="pword" />
 <input type="submit" value="GO" /> </form>
Ở
đâ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
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
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 đó:
...
You entered:
 <?php $username = $_GET['name']; $password = $_GET['pword']; echo "
Username = " . $username . "
"; echo "
Password = " . $password . "
"; ?>
Đ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
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]."
"; echo "1=".$formnames[1]."
"; echo "2=".$formnames[2]."
";
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
 1=email
 2=pword

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:

You entered:
 <?php $form_names = array_keys($_GET); $form_values = array_values($_GET); echo "
" . $form_names[0] . " = " . $form_values[0] . "
"; echo "
" . $form_names[1] . " = " . $form_values[1] . "
"; echo "
" . $form_names[2] . " = " . $form_values[2] . "
"; ?>
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ố
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:

You entered:
 <?php $form_names = array_keys($_GET); $form_values = array_values($_GET); for ($i = 0; $i < sizeof($_GET); $i++) { echo "
".$form_names[$i]." = " . $form_values[$i] . "
"; } ?>
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
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 "
" . $value . "
"; } ?>
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:

roadnick

ibmquestions@nicholaschase.com

supersecretpassword

Tuy nhiên, dễ sử dụng hơn là khả năng trích xuất giá trị và khóa:
... <?php foreach ($_GET as $key=>$value) { echo "
".$key." = " . $value . "
"; } ?> ...
Đ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
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" />
 Email: <input type="text" name="email" />
 Password: <input type="password" name="pword[]" />
 Password (again): <input type="password" name="pword[]" />
 <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 "
".$key." = " . $value . "
"; } $passwords = $_GET["pword"]; echo "First password = ".$passwords[0]; echo "
"; 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
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:
...
Register for an Account:
 <form action="registration_action.php" method="POST"> Username: <input type="text" name="name"/>
 ...
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:
...
You entered:
 <?php foreach ($_POST as $key=>$value) { echo "
".$key." = " . $value . "
"; } $passwords = $_POST["pword"]; echo "First password = ".$passwords[0]; echo "
"; echo "Second password = ".$passwords[1]; ?>
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 "
"; echo "Second password = ".$passwords[1]; if ($passwords[0] == $passwords[1]) { echo "
Passwords match. Thank you.
"; } else { echo "
Passwords don't match. Please try again.
"; } ...
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
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) và 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ư:
...
You entered:
 <?php function checkPasswords($firstPass, $secondPass){ if ($firstPass == $secondPass) { echo "
Passwords match. Thank you.
"; } else { echo "
Passwords don't match. \ Please try again.
"; } } foreach ($_POST as $key=>$value) { echo "
".$key." = " . $value . "
"; } $passwords = $_POST["pword"]; echo "First password = ".$passwords[0]; echo "
"; echo "Second password = ".$passwords[1]; ?>
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
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:
...
You entered:
 <?php function checkPasswords($firstPass, $secondPass){ if ($firstPass == $secondPass){ echo "
Passwords match. Thank you.
"; } else { echo "
Passwords don't match. Please try again.
"; } } foreach ($_POST as $key=>$value) { echo "
".$key." = " . $value . "
"; } $passwords = $_POST["pword"]; echo "First password = ".$passwords[0]; echo "
"; echo "Second password = ".$passwords[1]; checkPasswords($passwords[0], $passwords[1]); ?>
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
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:
...
You entered:
 <?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
"; } if (strlen($username) < 5 || strlen($username) > 50){ $message = $message."Username must be \ between 5 and 50 characters
"; } 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 "
"; echo "Second password = ".$passwords[1]; if (validate($_POST) == "OK") { echo "
Thank you for registering!
"; } else { echo "
There was a problem with your registration:
"; echo validate($_POST); echo "
Please try again.
"; } ?> ...
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
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 "
".$key." = " . $value . "
"; } ... if (validate($_POST) == "OK") { echo "
Thank you for registering!
"; db_connect(); } else { echo "
There was a problem with your registration:
"; ...
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 "
Thank you for registering!
"; 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 "
There was a problem with your registration:
"; ...
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 "
Thank you for registering!
"; 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:
"; $sqlAll = "select * from users"; $resultsAll = mysql_query($sqlAll); } } else { echo "
There was a problem with your registration:
"; ...
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:
"; $sqlAll = "select * from users"; $resultsAll = mysql_query($sqlAll); $row = mysql_fetch_array($resultsAll); echo $row["username"]." -- ".$row["email"]."
"; } ...
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:
"; $sqlAll = "select * from users"; $resultsAll = mysql_query($sqlAll); $row = mysql_fetch_array($resultsAll); while ($row) { echo $row["username"]." -- ".$row["email"]."
"; $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 "
Thank you for registering!
"; 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:
  <title>Workflow System</title>

The Workflow System

Navigation

Register

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

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"); ?>
Register for an Account:
 <form action="registration_action.php" method="POST"> Username: <input type="text" name="name" />
 Email: <input type="text" name="email" />
 Password: <input type="password" name="pword[]" />
 Password (again): <input type="password" name="pword[]" />
 <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ý
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:
  <title>Workflow System</title>

The Workflow System

Navigation

Register

Register for an Account:
 <form action="registration_action.php" method="POST"> Username: <input type="text" name="name" />
 Email: <input type="text" name="email" />
 Password: <input type="password" name="pword[]" />
 Password (again): <input type="password" name="pword[]" />
 <input type="submit" value="GO" /> </form>

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 là
một thảm họa. Ví dụ, bạn có thể kéo các kịch bản lệnh
validate() và
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"); ?>
You entered:
 <?php foreach ($_POST as $key=>$value) { echo "
".$key." = " . $value . "
"; } $passwords = $_POST["pword"]; echo "First password = ".$passwords[0]; echo "
"; echo "Second password = ".$passwords[1]; if (validate($_POST) == "OK") { echo "
Thank you for registering!
"; ...
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() và
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"); ?>
You entered:
 <?php foreach ($_POST as $key=>$value) { echo "
".$key." = " . $value . "
"; } ...
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
- Tài liệu hướng dẫn PHP có sẵn với nhiều ngôn ngữ.
- Tài liệu hướng dẫn MySQL cũng có sẵn.
- Hãy đọc "Kết nối các ứng dụng PHP tới cơ sở dữ liệu đa năng DB2 của IBM".
- Xem "Kết nối các ứng dụng PHP tới Apache Derby."
- Đừng bỏ lỡ "Phát triển khung cảnh đám mây và các ứng dụng cơ sở dữ liệu đa năng DB2 của IBM."
- Đừng quên đọc "Phát triển mã rock-solid trong PHP, Phần 1," "Sử dụng các biến có hiệu quả, Phần 2" và "Viết các hàm tái sử dụng, Phần 3."
- Để biết thông tin về PHP với MySQL, hãy đọc "Tạo các trang web động với PHP và MySQL."
- "Sử dụng các biểu mẫu HTML với PHP" đề cập một số vấn đề khác chưa được thảo luận trong hướng dẫn này.
- Truy cập các tài nguyên của dự án PHP của developerWorks IBM để tìm hiểu thêm về PHP.
- Theo sát với các sự kiện kỹ thuật và webcast của developerWorks.
- Xem các hội nghị sắp tới, các triển lãm thương mại, webcast và các sự kiện khác trên khắp thế giới đang được các nhà phát triển mã nguồn mở của IBM quan tâm.
- Truy cập tới vùng mã nguồn mở của developerWorks với các thông tin hướng dẫn phong phú, các công cụ và cập nhật dự án để giúp bạn phát triển với các công nghệ mã nguồn mở và sử dụng chúng với các sản phẩm của IBM.
- Nghe các cuộc phỏng vấn và thảo luận thú vị với các nhà phát triển phần mềm, đừng quên xem podcast của developerWorks.
Lấy sản phẩm và công nghệ
- Tải về PHP.
- Tải về MySQL.
- Đổi mới dự án phát triển mã nguồn mở tiếp theo của bạn với phần mềm dùng thử của IBM, có sẵn để tải hoặc trên đĩa DVD.
Thảo luận
- Hãy dành hết tâm trí cho cộng đồng developerWorks bằng cách tham gia vào các blog của developerWork.
Bình luận
-
Vùng dữ liệu trên developerWorks
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
-
Vùng mã nguồn mở trên developerWorks
Xem các bài viết về HTML, CSS, JavaScript,...
-
Điện toán đám mây
Tìm hiểu về điện toán đám mây

markdown:
## 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
2](http://www.ibm.com/developerworks/vn/edu/os-phptut2/index.html) và [Phần
3](http://www.ibm.com/developerworks/vn/edu/os-phptut3/index.html) 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)](http://www.apache.org)
- 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)](http://www.php.net/downloads.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](http://dev.mysql.com/downloads/)
- 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:
 <title>Workflow Registration</title>
You entered:

<?php echo "Some Data"; ?>

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:
 <title>Workflow Registration</title>
You entered:

Some Data

Để 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](phppart1fig1.jpg)
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:
 <title>Workflow Registration</title>
You entered:

<?php $username = "tyler"; $password = "mypassword"; echo "
Username = " . $username . "
"; echo "
Password = " . $password . "
"; ?>
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](phppart1fig2.jpg)
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"); ?> <title><?php echo PAGE_TITLE ?></title>
You entered:
 ...
(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"); ?>  <title>
<?= PAGE_TITLE ?></title>
You entered:
 ...
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:
  <title>Workflow System</title>
Register for an Account:

<form action="registration_action.php" method="GET"> Username: <input type="text" name="name" />
 Email: <input type="text" name="email" />
 Password: <input type="password" name="pword" />
 <input type="submit" value="GO" /> </form>
Ở
đâ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](phppart1fig3.jpg)
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](phppart1fig4.jpg)
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](#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 đó:
...
You entered:
 <?php $username =
$_GET['name'];$password = $_GET['pword'];echo "
Username = " . $username . "
"; echo "
Password = " . $password . "
"; ?>
Đ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](phppart1fig5.jpg)
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]."
"; echo "1=".$formnames[1]."
"; echo "2=".$formnames[2]."
";
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
 1=email
 2=pword

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:

You entered:
 <?php $form_names = array_keys($_GET); $form_values = array_values($_GET); echo "
" . $form_names[0] . " = " . $form_values[0] . "
"; echo "
" . $form_names[1] . " = " . $form_values[1] . "
"; echo "
" . $form_names[2] . " = " . $form_values[2] . "
"; ?>
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](phppart1fig6.jpg)
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:

You entered:
 <?php $form_names = array_keys($_GET); $form_values = array_values($_GET); for ($i = 0; $i < sizeof($_GET); $i++) { echo "
".$form_names[$i]." = " . $form_values[$i] . "
"; } ?>
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](phppart1fig6.jpg)
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 "
" . $value . "
"; }?>
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:

roadnick

ibmquestions@nicholaschase.com

supersecretpassword

Tuy
nhiên, dễ sử dụng hơn là khả năng trích xuất giá trị
*và*
khóa:
... <?php foreach ($_GET as
$key=>$value) { echo "
".$key." = " . $value . "
"; } ?> ...
Đ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](phppart1fig6.jpg)
### 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" />
 Email: <input type="text" name="email" />
 Password: <input type="password" name="pword
[]" />
 Password (again): <input type="password" name="pword[]" />
<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 "
".$key." = " . $value . "
"; } $passwords = $_GET["pword"]; echo "First password = ".$passwords[0]; echo "
"; 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](phppart1fig8.jpg)
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:
...
Register for an Account:
 <form action="registration_action.php" method="
POST"> Username: <input type="text" name="name"/>
 ...
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:
...
You entered:
 <?php foreach (
$_POSTas $key=>$value) { echo "
".$key." = " . $value . "
"; } $passwords = $_POST["pword"]; echo "First password = ".$passwords[0]; echo "
"; echo "Second password = ".$passwords[1]; ?>
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 "
"; echo "Second password = ".$passwords[1];
if ($passwords[0] == $passwords[1]) { echo "
Passwords match. Thank you.
"; } else { echo "
Passwords don't match. Please try again.
"; }...
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](phppart1fig9.jpg)
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)
*và* 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ư:
...
You entered:
 <?php
function checkPasswords($firstPass, $secondPass){ if ($firstPass == $secondPass) { echo "
Passwords match. Thank you.
"; } else { echo "
Passwords don't match. \ Please try again.
"; } }foreach ($_POST as $key=>$value) { echo "
".$key." = " . $value . "
"; } $passwords = $_POST["pword"]; echo "First password = ".$passwords[0]; echo "
"; echo "Second password = ".$passwords[1]; ?>
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](phppart1fig10.jpg)
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:
...
You entered:
 <?php function checkPasswords($firstPass, $secondPass){ if ($firstPass == $secondPass){ echo "
Passwords match. Thank you.
"; } else { echo "
Passwords don't match. Please try again.
"; } } foreach ($_POST as $key=>$value) { echo "
".$key." = " . $value . "
"; } $passwords = $_POST["pword"]; echo "First password = ".$passwords[0]; echo "
"; echo "Second password = ".$passwords[1];
checkPasswords($passwords[0], $passwords[1]);?>
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()](phppart1fig9.jpg)
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:
...
You entered:
 <?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
"; } if (strlen($username) < 5 || strlen($username) > 50){ $message = $message."Username must be \ between 5 and 50 characters
"; } 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 "
"; echo "Second password = ".$passwords[1];
if (validate($_POST) == "OK") { echo "
Thank you for registering!
"; } else { echo "
There was a problem with your registration:
"; echo validate($_POST); echo "
Please try again.
"; }?> ...
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](phppart1fig11.jpg)
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](#createdatabase):
... 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 "
".$key." = " . $value . "
"; } ... if (validate($_POST) == "OK") { echo "
Thank you for registering!
"; db_connect();} else { echo "
There was a problem with your registration:
"; ...
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 "
Thank you for registering!
"; 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 "
There was a problem with your registration:
"; ...
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 "
Thank you for registering!
"; 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:
"; $sqlAll = "select * from users"; $resultsAll = mysql_query($sqlAll); }} else { echo "
There was a problem with your registration:
"; ...
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ược*củ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:
"; $sqlAll = "select * from users"; $resultsAll = mysql_query($sqlAll);
$row = mysql_fetch_array($resultsAll); echo $row["username"]." -- ".$row["email"]."
";} ...
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:
"; $sqlAll = "select * from users"; $resultsAll = mysql_query($sqlAll); $row = mysql_fetch_array($resultsAll);
while ($row) {echo $row["username"]." -- ".$row["email"]."
"; $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 "
Thank you for registering!
"; 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:
  <title>Workflow System</title>

The Workflow System

Navigation

Register

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

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"); ?>
Register for an Account:
 <form action="registration_action.php" method="POST"> Username: <input type="text" name="name" />
 Email: <input type="text" name="email" />
 Password: <input type="password" name="pword[]" />
 Password (again): <input type="password" name="pword[]" />
 <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ý](phppart1fig13.jpg)
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:
  <title>Workflow System</title>

The Workflow System

Navigation

Register

Register for an Account:
 <form action="registration_action.php" method="POST"> Username: <input type="text" name="name" />
 Email: <input type="text" name="email" />
 Password: <input type="password" name="pword[]" />
 Password (again): <input type="password" name="pword[]" />
 <input type="submit" value="GO" /> </form>

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
*là*
một thảm họa. Ví dụ, bạn có thể kéo các kịch bản lệnh
validate() và
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");?>
You entered:
 <?php foreach ($_POST as $key=>$value) { echo "
".$key." = " . $value . "
"; } $passwords = $_POST["pword"]; echo "First password = ".$passwords[0]; echo "
"; echo "Second password = ".$passwords[1]; if (validate($_POST) == "OK") { echo "
Thank you for registering!
"; ...
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() và
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"); ?>
You entered:
 <?php foreach ($_POST as $key=>$value) { echo "
".$key." = " . $value . "
"; } ...
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
[Tài liệu hướng dẫn PHP](http://www.php.net/docs.php)có sẵn với nhiều ngôn ngữ. [Tài liệu hướng dẫn MySQL](http://dev.mysql.com/doc/)cũng có sẵn.
- Hãy đọc "
[Kết nối các ứng dụng PHP tới cơ sở dữ liệu đa năng DB2 của IBM](http://www.ibm.com/developerworks/db2/library/techarticle/scott/0614_scott.html?S_TACT=105AGY75)".
- Xem "
[Kết nối các ứng dụng PHP tới Apache Derby](http://www.ibm.com/developerworks/db2/library/techarticle/dm-0409casey/?S_TACT=105AGY75)."
- Đừng bỏ lỡ "
[Phát triển khung cảnh đám mây và các ứng dụng cơ sở dữ liệu đa năng DB2 của IBM](http://www.ibm.com/developerworks/db2/library/techarticle/dm-0502scott/index.html?S_TACT=105AGY75)."
- Đừng quên đọc "
[Phát triển mã rock-solid trong PHP, Phần 1](http://www.ibm.com/developerworks/linux/library/wa-phprock1/?S_TACT=105AGY75)," " [Sử dụng các biến có hiệu quả, Phần 2](http://www.ibm.com/developerworks/opensource/library/wa-phprock2/?S_TACT=105AGY75)" và " [Viết các hàm tái sử dụng, Phần 3](http://www.ibm.com/developerworks/web/library/wa-phprock3/?S_TACT=105AGY75)."
- Để biết thông tin về PHP với MySQL, hãy đọc "
[Tạo các trang web động với PHP và MySQL](http://www.ibm.com/developerworks/edu/l-dw-linuxphp-i.html?S_TACT=105AGY75)."
- "
[Sử dụng các biểu mẫu HTML với PHP](http://www.ibm.com/developerworks/web/library/wa-phpform/?S_TACT=105AGY75)" đề cập một số vấn đề khác chưa được thảo luận trong hướng dẫn này.
- Truy cập
[các tài nguyên của dự án PHP](http://www.ibm.com/developerworks/opensource/top-projects/php.html?S_TACT=105AGY75)của developerWorks IBM để tìm hiểu thêm về PHP.
- Theo sát với
[các sự kiện kỹ thuật và webcast của developerWorks](http://www.ibm.com/developerworks/offers/techbriefings/?S_TACT=105AGY75).
- Xem các hội nghị sắp tới, các triển lãm thương mại,
webcast và
[các sự kiện](http://www.ibm.com/developerworks/views/opensource/events.jsp?S_TACT=105AGY75)khác trên khắp thế giới đang được các nhà phát triển mã nguồn mở của IBM quan tâm.
- Truy cập tới
[vùng mã nguồn mở của developerWorks](http://www.ibm.com/developerworks/opensource?S_TACT=105AGY75)với các thông tin hướng dẫn phong phú, các công cụ và cập nhật dự án để giúp bạn phát triển với các công nghệ mã nguồn mở và sử dụng chúng với các sản phẩm của IBM.
- Nghe các cuộc phỏng vấn và thảo luận thú vị với các
nhà phát triển phần mềm, đừng quên xem
[podcast của developerWorks](http://www.ibm.com/developerworks/podcast/?S_TACT=105AGY75).
### Lấy sản phẩm và công nghệ
- Tải về
[PHP](http://www.php.net/downloads.php).
- Tải về
[MySQL](http://dev.mysql.com/downloads/index.html).
- Đổi mới dự án phát triển mã
nguồn mở tiếp theo của bạn với
[phần mềm dùng thử của IBM](http://www.ibm.com/developerworks/downloads/?S_TACT=105AGY75), có sẵn để tải hoặc trên đĩa DVD.
### Thảo luận
- Hãy dành hết tâm trí cho cộng đồng developerWorks
bằng cách tham gia vào
[các blog của developerWork](http://www.ibm.com/developerworks/blogs/?S_TACT=105AGY75).
## Bình luận
[Vùng dữ liệu trên developerWorks](http://www.ibm.com/developerworks/vn/views/data/libraryview.jsp)
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
[Vùng mã nguồn mở trên developerWorks](http://www.ibm.com/developerworks/vn/views/opensource/libraryview.jsp)
Xem các bài viết về HTML, CSS, JavaScript,...
[Điện toán đám mây](http://www.ibm.com/developerworks/vn/views/cloud/libraryview.jsp)
Tìm hiểu về điện toán đám mây

Content-Language: en-US

Content-Type: text/html; charset=UTF-8


text:
* Chủ đầu tư
Mr: L. H. Q
* Nhà thầu
Everrich steel
* Thời gian thi công
Tháng 12 năm 2007
* Khối lượng thi
công
Hạng mục
Khối lượng
Đ/v tính
Tôn Everdeck 1000
400
m2
Xà gồ
350
M
Phụ kiện
170
* Địa điểm xây dựng
Đường Nguyễn Sơn – Q. Long Biên – TP.
Hà Nội

WARC-Type: response

Content-Type: application/http; msgtype=response

Connection: close

Cache-Control: private

Content-Type: text/html; charset=utf-8


text:
Rất tiếc hệ thống không thể đáp ứng được yêu cầu của bạn..
Nếu đây là lỗi xin hãy thông báo cho đơn vị quản lý:
Cục Công nghệ thông tinTel: 8695712 E-mail: cit@moet.edu.vn. Xin cảm ơn.
123 ... 272829

markdown:
![](images/arrow-tick.gif)
|
|
![]()
|
|![]()
|
Giấy phép số 184/GP-BC - Bộ VHTT
|
Bản quyền thuộc về:
Bộ Giáo dục và Đào tạo
Ghi rõ nguồn http://www.moet.gov.vn khi sử dụng lại nội dung có nguồn từ website này.
|Thiết kế bởi
|Cục Công nghệ thông tin - Bộ Giáo dục và Đào tạo
Sử dụng tốt nhất với FireFox(++), Chrome(++), Safari(+), Opera(+), IE7(-)
Hỗ trợ thiết bị di động.

WARC-Truncated: length

Pragma: no-cache

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Vary: Accept-Encoding


text:
>Muốn nhận máy tính bảng Google Nexus 7 không mất một xu nào, hãy vào đây!
Mới đây đoạn clip nóng dài hơn 4 phút ghi lại cảnh ân ái do 2 nhân vật chính quay lại một lần nữa khiến cư dân mạng bàng hoàng trước sự táo bạo trong tình yêu của các em tuổi teen.
Hai nhân vật chính trong clip được cho là học sinh cấp 2 của trường Trần Hưng Đạo - Quảng Ngãi và đoạn clip được ghi lại khi 2 em đang trong giờ thể dục.
Cặp đôi học sinh này không những không cảm thấy ngượng ngùng mà còn vui đùa tươi cười trước camera, thậm chí là tự chỉnh camera chĩa thẳng vào mặt và có những hành động vượt quá lứa tuổi của học sinh.
Các em không ngại ngần thể hiện tình yêu ngay trong giờ học (Ảnh cắt ra từ clip)
Sau khi được đăng trên facebook, đoạn clip thu hút hàng trăm lượt bình luận, nhiều thành viên tỏ ra ái ngại và bất bình đối với hành động "quá tuổi" của 2 em. Bên cạnh đó, các thành viên khác cho rằng nhà trường và gia đình phải quản lý con cái và học sinh thật tốt để tránh những sự việc đáng tiếc xảy ra.
>Hài hước với clip về tình yêu trong sáng 'dễ thương'
>Siêu mẫu Hàn Quốc tuột váy lộ ngực trong lúc chạy
S.T
Tin liên quan
Nghe/Xem xem nhiều
Đọc tin tức sự kiện tin mới ,nhanh và hay nhất trong ngày tại chuyên mục:Tin tức 24h
Mời quý độc giả đọc báo qua RSS để có thêm nhiều thông tin hơn.
Tin Nghe/Xem mới nhất
Ngày Nay
-
Hướng và giờ xuất hành ngày mùng 1 Tết Bính Thân tốt nhất
-
Tử vi vận hạn, tài lộc Bính Thân 2016 người tuổi Ngọ
-
Tử vi vận hạn, tài lộc Bính Thân 2016 người tuổi Mùi
-
4 quy tắc vàng cho các nàng dâu đón Tết đầu tiên ở nhà chồng
-
Tử vi vận hạn, tài lộc Bính Thân 2016 người tuổi Sửu
-
Tử vi vận hạn, tài lộc Bính Thân 2016 người tuổi Dần

markdown:
>Muốn nhận máy tính bảng Google Nexus 7 không mất một xu nào, hãy vào đây!
Mới đây đoạn clip nóng dài hơn 4 phút ghi lại cảnh ân ái do 2 nhân vật chính quay lại một lần nữa khiến cư dân mạng bàng hoàng trước sự táo bạo trong tình yêu của các em tuổi teen.
Hai nhân vật chính trong clip được cho là học sinh cấp 2 của trường Trần Hưng Đạo - Quảng Ngãi và đoạn clip được ghi lại khi 2 em đang trong giờ thể dục.
Cặp đôi học sinh này không những không cảm thấy ngượng ngùng mà còn vui đùa tươi cười trước camera, thậm chí là tự chỉnh camera chĩa thẳng vào mặt và có những hành động vượt quá lứa tuổi của học sinh.
*Các em không ngại ngần thể hiện tình yêu ngay trong giờ học (Ảnh cắt ra từ clip)*
Sau khi được đăng trên facebook, đoạn clip thu hút hàng trăm lượt bình luận, nhiều thành viên tỏ ra ái ngại và bất bình đối với hành động "quá tuổi" của 2 em. Bên cạnh đó, các thành viên khác cho rằng nhà trường và gia đình phải quản lý con cái và học sinh thật tốt để tránh những sự việc đáng tiếc xảy ra.
>Hài hước với clip về tình yêu trong sáng 'dễ thương'
>Siêu mẫu Hàn Quốc tuột váy lộ ngực trong lúc chạy
**S.T**
|
|
Mời bạn đọc cùng làm báo với Nguoiduatin.vn, viết tin bài, bày tỏ quan điểm về mọi mặt của cuộc sống gửi về hộp thư
### Tin liên quan
### Nghe/Xem xem nhiều
![ ](http://www.nguoiduatin.vn/tracking-75751.gif?a=1454925648)
Đọc
[tin tức](http://www.nguoiduatin.vn/) sự kiện [tin mới ](http://www.nguoiduatin.vn/),nhanh và hay nhất trong ngày tại chuyên mục: [Tin tức 24h ](http://www.nguoiduatin.vn/gl/24h-qua)
Mời quý độc giả
[đọc báo](http://www.nguoiduatin.vn/) qua [RSS](http://www.nguoiduatin.vn/trang-chu.rss) để có thêm nhiều thông tin hơn.
### Tin Nghe/Xem mới nhất
[Ngày Nay](http://ngaynay.vn)
-
[Hướng và giờ xuất hành ngày mùng 1 Tết Bính Thân tốt nhất](http://www.ngaynay.vn/huong-va-gio-xuat-hanh-ngay-mung-1-tet-binh-than-tot-nhat-p211325.html?utm_source=www.nguoiduatin.vn&utm_medium=Exchange)
-
[Tử vi vận hạn, tài lộc Bính Thân 2016 người tuổi Ngọ](http://www.ngaynay.vn/tu-vi-van-han-tai-loc-binh-than-2016-nguoi-tuoi-ngo-p211316.html?utm_source=www.nguoiduatin.vn&utm_medium=Exchange)
-
[Tử vi vận hạn, tài lộc Bính Thân 2016 người tuổi Mùi](http://www.ngaynay.vn/tu-vi-van-han-tai-loc-binh-than-2016-nguoi-tuoi-mui-p211317.html?utm_source=www.nguoiduatin.vn&utm_medium=Exchange)
-
[4 quy tắc vàng cho các nàng dâu đón Tết đầu tiên ở nhà chồng](http://www.ngaynay.vn/4-quy-tac-vang-cho-cac-nang-dau-don-tet-dau-tien-o-nha-chong-p211269.html?utm_source=www.nguoiduatin.vn&utm_medium=Exchange)
-
[Tử vi vận hạn, tài lộc Bính Thân 2016 người tuổi Sửu](http://www.ngaynay.vn/tu-vi-van-han-tai-loc-binh-than-2016-nguoi-tuoi-suu-p211289.html?utm_source=www.nguoiduatin.vn&utm_medium=Exchange)
-
[Tử vi vận hạn, tài lộc Bính Thân 2016 người tuổi Dần](http://www.ngaynay.vn/tu-vi-van-han-tai-loc-binh-than-2016-nguoi-tuoi-dan-p211290.html?utm_source=www.nguoiduatin.vn&utm_medium=Exchange)

Content-Type: text/html