Kết nối đến và sử dụng MySQL
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.
Hầu như không thể tạo một ứng dụng Web với bất kỳ kích thước có nghĩa nào mà không phải tương tác với cơ sở dữ liệu thuộc loại nào đó. Trong ứng dụng thí dụ của bạn, bạn đang sử dụng một cơ sở dữ liệu MySQL để lưu tên người dùng và thông tin mật khẩu. Trong phần này, bạn sẽ thêm chức năng vào trang đăng ký để nó kiểm tra xem tên người dùng đã đệ trình lên là duy nhất không và chèn các dữ liệu vào trong bảng nếu có. Bạn cũng sẽ xem việc hiển thị thông tin đã có trong một cơ sở dữ liệu. Cuối cùng, bạn sẽ tạo trang đăng nhập của ứng dụng.
Bạn sẽ bắt đầu bằng cách kết nối tới cơ sở dữ liệu. PHP có một số hàm tồn tại độc lập liên quan đến các cơ sở dữ liệu MySQL và bạn sẽ sử dụng chúng trong phần này.
Bước đầu tiên là tạo một hàm để kết nối tới cơ sở dữ liệu tiến trình công việc mà bạn đã tạo trong phần Thiết lập:
...
return $message;
}
function db_connect($user='wfuser',
$password='wfpass', $db='workflow'){
mysql_connect('localhost', $user, $password) or
die('I cannot connect to db: ' . mysql_error());
}
foreach ($_POST as $key=>$value) {
echo "<p>".$key." = " . $value . "</p>"; }
...
if (validate($_POST) == "OK") {
echo "<p>Thank you for registering!</p>";
db_connect();
} else {
echo "<p>There was a problem with your registration:</p>";
... |
Tại đây, bạn đang tạo một hàm, db_connect(), cố gắng
để mở một kết nối giữa PHP và cơ sở dữ liệu MySQL. Lưu ý rằng trong định nghĩa
của hàm này, bạn đã bao hàm các giá trị cho các đối số. Đây là những giá trị
mặc định, có nghĩa là nếu bạn không cung cấp một tên người dùng, mật
khẩu và tên cơ sở dữ liệu, PHP sẽ sử dụng các giá trị này. (Trong thực tế, bạn
sẽ làm việc đó ngay).
Hàm này thử kết nối đến cơ sở dữ liệu trên máy cục bộ, localhost. Có nghĩa là máy cục bộ so với máy chủ PHP, do đó bạn đang
nói về máy chủ Web và chứ không phải là máy khách.
Nếu PHP không thể mở một kết nối, việc xử lý dừng lại (hoặc tắt) và PHP chỉ cần hiển thị một thông báo giải thích điều xảy ra.
Giả sử tất cả mọi việc diễn ra tốt đẹp, kết nối này sẽ vẫn mở cho đến khi bạn đóng nó hoặc cho đến khi kết thúc xử lý trang Web. Bất kỳ các lệnh cơ sở dữ liệu khác mà bạn đưa ra sẽ được hướng vào kết nối đó.
Cuối cùng, gọi hàm này để làm cho tất cả điều này xảy ra.
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.
Bây giờ là lúc để thêm dữ liệu vào bảng users mà bạn đã tạo trước đó. Để thêm dữ liệu, bạn sẽ tạo một câu lệnh SQL để chèn dữ liệu vào trong bảng đó, sau đó bạn sẽ thực hiện câu lệnh đó.
Câu lệnh có dạng:
insert into users (username, email, password) values
('roadnick', 'ibmquestions@nicholaschase.com', 'supersecretpassword') |
Bây giờ, nếu bạn đã chú ý đặc biệt lúc tạo bảng, bạn có thể tự hỏi điều gì đã xảy
ra với cột id. Bạn đã xác định rằng cột đầu tiên là
AUTO_INCREMENT, Bây giờ, nếu bạn đã chú ý đặc
biệt lúc tạo bảng, bạn có thể tự hỏi điều gì đã xảy ra với cột id. Bạn đã xác
định rằng cột đầu tiên là AUTO_INCREMENT, vậy nếu bạn bỏ sót nó, khi bạn đang
làm ở đây, MySQL sẽ tự động điền nó vào với số nguyên có sẵn tiếp theo. Vì vậy,
tất cả mọi thứ mà bạn phải làm ở đây là thay thế các dữ liệu do người dùng đệ
trình lên các nơi chứa của bạn và thực hiện câu lệnh đó:
...
if (validate($_POST) == "OK") {
echo "<p>Thank you for registering!</p>";
db_connect();
$sql = "insert into users (username, email, password) values
('".$_POST["name"]."', '".$_POST["email"]."', \
'".$passwords[0]."')";
$result = mysql_query($sql);
if ($result){
echo "It's entered!";
} else {
echo "There's been a problem: ".mysql_error();
}
} else {
echo "<p>There was a problem with your registration:</p>";
... |
Lưu ý rằng khi bạn gọi hàm mysql_query(), nó sẽ trả về
một giá trị đang được lưu trong biến $result. Giá trị
đó sẽ là đúng nếu hoạt động đã diễn ra trôi chảy và sai nếu có bất kỳ vấn đề
phát sinh. Sau đó bạn có thể sử dụng giá trị đó như là biểu thức trong một câu
lệnh if-then để đưa ra hành động tùy thuộc vào các kết quả này.
Nếu có vấn đề nào xảy ra, MySQL sẽ thiết lập một giá trị cho hàm mysql_error() để trả về, sau đó bạn có thể xuất giá trị
này tới trang đó.
Bây giờ bạn đã thêm thông tin vào cơ sở dữ liệu, đây là lúc xem nó lại.
Lúc này, bạn có thể thêm dữ liệu vào cơ sở dữ liệu, nhưng làm sao bạn biết được tên người dùng là duy nhất ? Hiện tại, bạn không biết, nhưng bạn có thể khắc phục điều đó bằng cách kiểm tra bảng users trước khi bạn thực hiện công việc chèn thực sự này:
...
if (validate($_POST) == "OK") {
echo "<p>Thank you for registering!</p>";
db_connect();
$sql = "select * from users where username='".$_POST["name"]."'";
$result = mysql_query($sql);
if (!$result) {
$sql = "insert into users (username, email, password) values
('".$_POST["name"]."', '".$_POST["email"]."', '".$passwords[0]."')";
$result = mysql_query($sql);
if ($result){ echo "It's entered!";
} else { echo "There's been a problem: ".mysql_error(); }
} else {
echo "There is already a user with that name: <br />";
$sqlAll = "select * from users";
$resultsAll = mysql_query($sqlAll);
}
} else {
echo "<p>There was a problem with your registration:</p>";
... |
Bắt đầu bằng cách tạo một câu SQL để chọn bất kỳ bản ghi nào có tên người dùng
khớp với tên bạn đang nghĩ để chèn vào. Sau đó bạn có thể thực hiện câu lệnh đó
trên cơ sở dữ liệu, cũng như bạn đã làm với câu lệnh insert. Nếu câu lệnh trả về
các kết quả bất kỳ, mysql_query() trả về một giá trị
đánh giá là đúng và nếu không, nó sẽ trả về sai.
Bây giờ, những gì bạn muốn là không có kết quả nào đối với tên người dùng này, vì
vậy bạn muốn giá trị của $result là sai. Nhưng
khi bạn sử dụng một câu lệnh if-then, bạn sẽ tìm kiếm câu lệnh true, chứ
không phải câu lệnh sai. Vi vậy, bạn sử dụng toán tử negation, dấu chấm
than, để nói về bản chất, "Nếu giá trị ngượccủa giá trị này là đúng, thì
hãy thực hiện điều này". Và "điều này" trong trường hợp này là chèn dữ liệu vào
cơ sở dữ liệu.
Nhưng điều gì sẽ xảy ra nếu $result là đúng để bắt đầu
với nó? Sau đó, giá trị ngược của $result sẽ là sai
và bạn sẽ thực hiện các câu lệnh khác. Về sau, bạn sẽ liệt kê các tên người dùng
và địa chỉ e-mail hiện có, do đó hãy bắt đầu bằng cách tạo và thực hiện câu lệnh
SQL đó.
Bạn sẽ lấy ra các kết quả tiếp theo.
Tất nhiên, trong thế giới thực, bạn sẽ không bao giờ hiển thị tên của tất cả người dùng hiện có nếu ai đó đăng nhập một tên người dùng hiện có, nhưng ở đây bạn sẽ nhập tên đó để xem hoạt động này sẽ diễn ra như thế nào.
Trước đây, bạn tạo một câu lệnh SQL để chọn tất cả các bản ghi trong bảng những
người dùng và biểu diễn các kết quả trong biến $resultsAll . Bây giờ bạn sắp lấy ra dữ liệu từ biến đó:
...
} else {
echo "There is already a user with that name: <br />";
$sqlAll = "select * from users"; $resultsAll = mysql_query($sqlAll);
$row = mysql_fetch_array($resultsAll);
echo $row["username"]." -- ".$row["email"]."<br />";
}
... |
Bước đầu tiên lấy ra các dữ liệu là trích một hàng đơn từ $resultsAll, thực sự là một nguồn tài nguyên thể hiện toàn bộ
tập hợp dữ liệu. Hàm mysql_fetch_array(), như tên của
nó ngụ ý, trả về một mảng kết hợp bao gồm dữ liệu cho một hàng đơn. Các khóa
giống như tên cột, vì thế bạn có thể xuất dữ liệu cho hàng đó rất dễ dàng bằng
cách yêu cầu các giá trị thích hợp từ mảng $row.
Nhưng ví dụ này đúng là một hàng đơn. Làm thế nào để truy cập vào tất cả các dữ liệu?
Xem tất cả các kết quả: Vòng lặp while
Nếu, trong lúc tìm đầu tiên, lấy được ít nhất một hàng, $row sẽ thể hiện đúng trong câu lệnh if-then -- hoặc vòng lặp while, mà bạn đang sử dụng ở đây. PHP bắt đầu câu lệnh
while ($row) và nói
"OK, giá trị biểu thức này đúng, hãy đi tiếp và thực hiện các câu lệnh trong
khối này". Nó xuất dữ liệu cho hàng đó, rồi cố gắng tìm nạp sang hàng khác. Sau
đó nó quay lại phía đầu vòng lặp.
...
} else {
echo "There is already a user with that name: <br />";
$sqlAll = "select * from users";
$resultsAll = mysql_query($sqlAll);
$row = mysql_fetch_array($resultsAll);
while ($row) {
echo $row["username"]." -- ".$row["email"]."<br />";
$row = mysql_fetch_array($result);
}
}
... |
Nếu ý định tìm dòng khác thành công, $row sẽ lại đánh
giá là đúng và vòng lặp lại thực hiện. Điều này cứ diễn ra cho đến khi không còn
hàng nào nữa và mysql_fetch_array() trả về sai. Vào
lúc đó, PHP biết bỏ qua vòng lặp này và chuyển tới phần còn lại của kịch bản
lệnh.
Một lưu ý có ích: Nếu bạn bỏ qua bước cuối cùng, ở đó bạn cố gắng lấy một hàng
khác, $row sẽ luôn luôn đúng và máy chủ của bạn sẽ
tiếp tục chạy vòng lặp này cho đến khi nó chạy hết bộ nhớ hoặc vượt quá thời
gian. Vì vậy, khi bạn tạo một vòng lặp loại này, ngay ở câu lệnh đầu tiên bạn
nên thêm vào đó thành phần gia tăng khi bạn xem xét.
Trước khi tiếp tục, bạn chắc chắn rằng kết nối cơ sở dữ liệu đã mở cần được đóng lại:
...
if (validate($_POST) == "OK") {
echo "<p>Thank you for registering!</p>";
db_connect();
$sql = "select * from users where username='".$_POST["name"]."'";
$result = mysql_query($sql);
if (!$result) {
...
}
mysql_close();
} else {
... |
Bây giờ là lúc xóa sạch mọi thứ.
