Chuyển đến nôi dung chính

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

Khi bạn đăng ký với trang developerWorks lần đầu tiên, một tiểu sử của của bạn được tạo ra. Chọn các thông tin về tiểu sử của bạn (tên, nước/vùng, và nơi làm việc) đã được hiện lên màn hình, thông tin này sẽ được hiện kèm với nội dung mà bạn đăng tải. Bạn có thể cập nhật thông tin này bất kỳ lúc nào.

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

  • Đóng [x]

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

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

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

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

  • Đóng [x]

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

Nicholas Chase, Tác giả tự do, Site Dynamics Interactive Communications
Nicholas Chase đã phát triển trang web cho các công ty lớn như Lucent Technologies, Sun Microsystems, Oracle, và Tampa Bay Buccaneers. Nick đã từng là một giáo viên vật lý ở trường phổ thông, một nhà quản lý thiết bị phóng xạ mức thấp, một nhà biên tập tạp chí khoa học viễn tưởng trực tuyến, một kỹ sư đa phương tiện, một hướng dẫn của Oracle, và một trưởng phòng công nghệ của một công ty tương tác truyền thông. Nick là tác giả của một số sách
Tyler Anderson, Kỹ sư, Backstop Media
Tyler's photo
Tyler Anderson đã tốt nghiệp chuyên ngành Khoa học Máy tính tại trường Đại học Brigham Young năm 2004 và hiện đang tham gia học kỳ cuối chương trình đào tạo Thạc sỹ khoa học chuyên ngành Công nghệ Máy tính. Trước đó, anh đã làm việc như là một lập trình viên cơ sở dữ liệu cho DPMG.COM, và hiện tại anh đang là kỹ sư cho tập đoàn Stexar, dựa trên nền tảng Beaverton, Oregon

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

Xem thêm bài trong loạt bài này

Ngày:  30 09 2010
Mức độ:  Trung bình

Hoạt động:  13495 lần đọc

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

Thiết lập

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

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

create database workflow; 

use workflow; 

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

show tables;

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

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

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

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

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


Kết nối với MySQL

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


Chèn bản ghi

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

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

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

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

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

  db_connect(); 

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

     db_connect(); 

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

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

5 của 9 | Trang trước | Trang sau

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