97 Ví dụ: Với CSDL “BookDB”, ta thực hiện truy vấn bảng “Sach” như sau: Bạn nên lưu kết quả của truy vấn này trong một biến, trong ví dụ trên, kết quả của truy vấn được lưu vào biến c
Trang 196
CHƯƠNG 4: KẾT HỢP PHP VÀ MySQL
4.1 Kết nối cơ sở dữ liệu
a) Để kết nối cơ sở dữ liệu mySQL bạn sử dụng khai pháp như sau:
<?php
$link = mysql_connect ("localhost", "root", "")
or die ("Could not connect to MySQL Database");
@mysql_query("SET NAMES 'utf8'",$link);
mysql_select_db("BookDB", $link);
?>
Trong đó:
- Khai báo $link = mysql_connect ("localhost", "root", "") để kết nối
cơ sở dữ liệu MySQL với tên Server là localhost, Username là root và Password của
Username root là rỗng
- Dòng lệnh die ("Could not connect to MySQL Database"); sẽ thông báo cho chúng ta biết nếu không kết nối thành công thì một thông báo sau sẽ xuất hiện
"Could not connect to MySQL Database"
- Khai báo @mysql_query("SET NAMES 'utf8'",$link); để hiển thị dữ liệu trong cơ sở dữ liệu dưới dạng Unicode utf8
- Khai báo: mysql_select_db("BookDB", $link) để chọn tên cơ sở dữ liệu sau khi mở kết nối cơ sở dữ liệu
b) Để đóng kết nối cơ sở dữ liệu bạn sử dụng cú pháp sau:
<?php mysql_close($link);
?>
c) Chúng ta có thể khai báo trang “dbcon.inc” chứa kết nối đến cơ sở dữ liệu và trang này được dùng cho các trang PHP cần kết nối đến cơ sở dữ liệu:
<?php
$link = mysql_connect ("localhost", "root", "")
or die ("Could not connect to MySQL Database");
@mysql_query("SET NAMES 'utf8'",$link);
mysql_select_db("BookDB", $link);
?>
Các trang PHP khác muốn kết nối đến cơ sở dữ liệu thay vì phải viết lại đoạn mã lệnh trên thì chỉ cần chèn file "dbcon.inc" vào theo cú pháp sau:
require("dbcon.inc");
4.2 Truy vấn và hiển thị dữ liệu trong các bảng
4.2.1 Hiển thị dạng lưới (table)
- Để truy vấn CSDL, bạn có thể sử dụng hàm mysql_query() với tham số bắt
buộc là chuỗi SQL, tham số tùy chọn là chuỗi kết nối CSDL như cú pháp sau:
int mysql_query(string sql);
Hoặc int mysql_query(string sql, [int db_connect]);
Trang 297
Ví dụ: Với CSDL “BookDB”, ta thực hiện truy vấn bảng “Sach” như sau:
<?
require("dbcon.inc");
$sql="select * from sach";
$result=mysql_query($sql,$link);
?>
Bạn nên lưu kết quả của truy vấn này trong một biến, trong ví dụ trên, kết quả của
truy vấn được lưu vào biến có tên là: $result
- Đếm số lượng mẩu tin trả về từ truy vấn: khi bạn mở một CSDL và truy vấn
một bảng dữ liệu, để biết được số lượng mẩu tin câu truy vấn trả về, bạn có thể sử dụng hàm có cú pháp:
mysql_num_rows();
Chẳng hạn, trong trường hợp bạn mở một bảng dữ liệu của CSDL “BookDB” có tên là “Sach”, để biết số mẩu tin trả về là bao nhiêu, bạn sử dụng hàm
mysql_num_rows($result)
- Đọc từng mẩu tin: bạn có thể sử dụng hàm mysql_fetch_array() để đọc từng
mẩu tin trong biến $result, nếu không tồn tại mẩu tin trong $result hàm sẽ không thực
hiện, đoạn mã lệnh như sau:
{ while($row = mysql_fetch_array($result)) {
//Lấy giá trị từng colum
$varmasach= $row["sachID"];
$vartensach= $row["tensach"];
$vartacgia= $row["tacgia"];
$varnxb= $row["nxb"];
$varnamxb= $row["namxb"];
$vargiatien= $row["giatien"];
//Hiển trị giá trị lấy được trên trình duyệt echo "<tr><td nowrap align=center>$varmasach</td>";
echo "<td nowrap align=center>$vartensach</td>";
echo "<td nowrap align=center>$vartacgia</td>";
echo "<td nowrap align=center>$varnxb</td>";
echo "<td nowrap align=center>$varnamxb</td>";
echo "<td nowrap align=center>$vargiatien</td></tr>"; }
}
Ví dụ 4.1: Tạo một trang PHP (hien_thi_sach.php) liệt kê tất
cả các quyển sách có trong bảng “sach” của cơ sở dữ liệu
“BookDB” đã được tạo trong Câu 1, phần Câu hỏi ôn tập chương
3 kết quả liệt kê như hình 4.1
Trang 398
Hình 4.1: Liệt kê các sách có trong bảng “sach”
Yêu cầu:
- Kết nối vào MySQL
- Chọn csdl “BookDB”
- Đọc bảng “sach”
- Xuất các thông tin về sách dưới dạng lưới thô (table) như hình trên
Giải:
- Dùng mysql_connect(…) để kết nối vào csdl
- Dùng mysql_select_db(…) để chọn csdl “BookDB”
- Để đọc bảng sách dùng mysql_query(…)
mysql_fetch_row(…) và cứ mỗi dòng thì xuất ra một mẩu tin trong bảng sách theo định dạng trên
Đoạn mã của trang hien_thi_sach.php được viết như sau:
<?
//Dòng lệnh sau sẽ kết nối đến cơ sở dữ liệu BookDB require("dbcon.inc");
// Dòng lệnh sau sẽ lấy toàn bộ sách trong CSDL sách
$sql="select * from sach";
$result=mysql_query($sql,$link);
Trang 499
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test</title>
</head>
<body>
<H2><p align=center><b>CÁC ĐẦU SÁCH CÓ TRONG BẢNG
<i>"SACH"</i></b></p></H2>
<table align=center border="1">
<tr>
<th nowrap>MÃ SÁCH</th>
<th nowrap>TÊN SÁCH</th>
<th nowrap>TÁC GIẢ</th>
<th nowrap>NNÀ XUẤT BẢN</th>
<th nowrap>NĂM XUẤT BẢN</th>
<th nowrap>GIÁ TIỀN</th>
</tr>
<?
//Kiểm tra số mẩu tin trả về if(mysql_num_rows($result)!=0) {
//Đọc hết mẩu tin bằng hàm mysql_fetch_array while($row = mysql_fetch_array($result)) {
//Lấy giá trị từng colum
$varmasach= $row["sachID"];
$vartensach= $row["tensach"];
$vartacgia= $row["tacgia"];
$varnxb= $row["nxb"];
$varnamxb= $row["namxb"];
$vargiatien= $row["giatien"];
//Hiển trị giá trị lấy được trên trình duyệt echo "<tr><td nowrap align=center>$varmasach</td>";
echo "<td nowrap align=center>$vartensach</td>";
echo "<td nowrap align=center>$vartacgia</td>";
echo "<td nowrap align=center>$varnxb</td>";
echo "<td nowrap align=center>$varnamxb</td>";
echo "<td nowrap align=center>$vargiatien</td></tr>";
} }
?>
</table>
</body>
</html>
<?
//Đóng kết nối cơ sở dữ liệu mysql_close($link);
?>
4.2.2 Hiển thị dạng lưới định dạng
Với cách hiển thị dạng lưới định dạng, trong phần nội dung các dòng chẵn và dòng
lẻ có màu khác nhau
Trang 5100
Ví dụ 4.2: Thiết kế trang (luoi_dinh_dang.php) hiển thị
thông tin các quyển sách có định dạng như sau:
Hình 4.2: Thông tin sách được hiển thị dạng lưới định dạng
Yêu cầu:
- Kết nối vào MySQL
- Chọn csdl “BookDB”
- Đọc bảng “sach”
- Xuất các thông tin về sách dưới dạng lưới như hình trên, trong đó: dòng tiêu đề có các cột được canh giữa; dòng chẵn và dòng lẻ ở phần nội dung có màu nền khác nhau; các cột được canh giữa
Giải:
- Dùng mysql_connect(…) để kết nối vào csdl
- Dùng mysql_select_db(…) để chọn csdl “BookDB”
- Để đọc bảng sách dùng mysql_query(…)
mysql_fetch_row(…) và cứ mỗi dòng thì xuất ra một mẩu tin trong bảng sách theo định dạng trên
- Đặt một biến để đếm từng dòng bắt đầu từ 0, và tăng dần theo dòng
- Nếu biến đếm chia hết cho 2 (dòng chẵn) thì xuất ra một dòng có màu nền khác màu so với dòng lẻ
Đoạn mã của trang “luoi_dinh_dang.php” được viết như sau:
<?
Trang 6101
require("dbcon.inc");
$sql="select * from sach";
$result=mysql_query($sql,$link);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test</title>
</head>
<body>
<H2><p align=center><b> THÔNG TIN SÁCH </b></p></H2>
<table align=center border="1" cellpadding="2" cellspacing="2" style="border-collapse:collapse">
<tr>
<th nowrap>MÃ SÁCH</th>
<th nowrap>TÊN SÁCH</th>
<th nowrap>TÁC GIẢ</th>
<th nowrap>NNÀ XUẤT BẢN</th>
<th nowrap>NĂM XUẤT BẢN</th>
<th nowrap>GIÁ TIỀN</th>
</tr>
<?
//Kiểm tra số mẩu tin trả về if(mysql_num_rows($result)!=0) {
$stt=0; //Cho biết làm việc với dòng nào trong bảng, nếu số
chẵn xuất màu nền ngược lại thì không //Đọc hết mẩu tin bằng hàm mysql_fetch_array
while($row = mysql_fetch_array($result)) {
//Lấy giá trị từng colum
$varmasach= $row["sachID"];
$vartensach= $row["tensach"];
$vartacgia= $row["tacgia"];
$varnxb= $row["nxb"];
$varnamxb= $row["namxb"];
$vargiatien= $row["giatien"];
//Kiểm tra nếu số chẵn xuất màu nền ngược lại thì không if($stt%2==0)
echo "<tr bgcolor='#ffe0c1'>";
else echo "<tr>";
//Hiển thị giá trị của các trường lên trình duyệt echo "<td nowrap align=center>$varmasach</td>";
echo "<td nowrap align=center>$vartensach</td>";
echo "<td nowrap align=center>$vartacgia</td>";
echo "<td nowrap align=center>$varnxb</td>";
echo "<td nowrap align=center>$varnamxb</td>";
echo "<td nowrap align=center>$vargiatien</td>";
//Tăng biến kiểm tra lên 1
$stt = $stt + 1;
//Thẻ đóng kết thúc một hàng echo "</tr>";
} }
?>
Trang 7102
</table>
</body>
</html>
<?
//Đóng kết nối cơ sở dữ liệu mysql_close($link);
?>
4.2.3 Hiển thị dạng lưới có phân trang
Khi trình bày dữ liệu trên trang Web, chúng ta có thể qui định số dòng sẽ hiển thị trên một trang, và khi đó toàn bộ dữ liệu có thể được trình bày trên nhiều trang thay vì một trang, quá trình đó được gọi là phân trang khi hiển thị Chẳng hạn, chúng ta có 20
dòng dữ liệu cần hiển thị, thay vì hiển thị 20 dòng trên một trang, chúng ta có thể qui định chỉ hiển thị 5 dòng trên một trang, như vậy chúng ta cần 4 trang để có thể hiển thị hết 20 dòng dữ liệu Điều này có nghĩa là nếu trang có số mẩu tin lớn hơn 5, mẩu tin thứ 6 trình bày trong trang kế tiếp, tương tự cho các trang khác
Ví dụ 4.3: Thiết kế trang (luoi_phan_trang.php) hiển thị
thông tin các quyển sách có phân trang, mối trang chỉ hiển thị
5 quyển sách như sau:
Hình 4.3: Thông tin sách được hiển thị dạng lưới có phân trang
Yêu cầu:
- Kết nối vào MySQL
- Chọn csdl “BookDB”
- Đọc bảng “sach”
- Sử dụng class Pager để thực hiện việc phân trang, trong
đó:
+ Mỗi trang gồm có 5 dòng dữ liệu
+ Xuất thông tin dạng lưới có định dạng như hình trên (dòng chẵn và dòng lẻ có màu nền khác nhau)
+ Hiển thị danh sách trang theo dạng số
Giải:
- Tạo một trang “luoi_phan_trang.php”
Trang 8103
- Chèn vào trang này class Pager dùng để thực hiện các chức
năng về phân trang
- Dùng mysql_connect(…) để kết nối vào csdl
- Dùng mysql_select_db(…) để chọn csdl “BookDB”
- Xác định số dòng nội dung cần hiển thị cho một trang và
gán vào cho biến $limit
- Tìm dòng bắt đầu của mỗi trang bằng hàm findStart(…) và gán cho biến $start
- Đếm số mẩu tin có trong bảng bằng hàm mysql_num_rows(…) và gán cho biến $count
- Tính tổng số trang bằng hàm findPages($count, $limit)
- Để đọc bảng dùng mysql_query(… LiMit $start,$limit)
- Duyệt các mẩu tin có được bằng hàm mysql_fetch_row(…), sau
đó xuất thông tin ra như định dạng trên
pageList($_GET[‘page’],$pages) và gán cho biến $pageList, rồi
xuất biến này
Đoạn mã của trang “luoi_phan_trang.php” được viết như sau:
<?
require("dbcon.inc");
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test</title>
</head>
<body>
<?php /************************************************************
* Class:Pager
* Methods:
* findStart
* findPages
* pageList
* nextPrev
* Redistribute as you see fit
************************************************************/
//Tạo lớp dùng để thực hiện các chức năng về phân trang class Pager{
/**********************************************************
* Hàm int findStart(int limit)
* Trả về dòng bắt đầu của trang được chọn dựa trên trang lấy được
và biến limit
* $limit cho biết số dòng (mẩu tin) hiển thị trên 1 trang
***********************************************************/
function findStart($limit) {
if((!isset($_GET['page'])) || ($_GET['page'] == "1")) {
$start = 0;
$_GET['page'] = 1;
} else {
$start = ($_GET['page']-1)*$limit;
Trang 9104
} return $start;
} /**********************************************************
* Hàm int findPages(int count, int limit)
* Trả về số lượng trang cần thiết dựa trên tổng số dòng có trong table và limit
* $count là tổng số mẩu tin trong bảng
* Hàm floor(float $value) là hàm làm tròn, trả về số nguyên bằng cách làm tròn số xuống số nhỏ gần nhất
* ví dụ: floor(4.3)=4; floor(9.999)=9; floor(-3.14)=-4
**********************************************************/
function findPages($count, $limit) {
$pages = (($count % $limit) == 0) ? $count/$limit : floor($count/$limit) + 1;
return $pages;
} /*******************************************************
* Hàm string pageList(int curpage, int pages)
* Trả về danh sách trang theo định dạng "Trang đầu tiên < [Các trang] > Trang cuối cùng"
* $curpage: Trang hiện tại
* $pages: Tổng số trang
* $_SERVER['PHP_SELF']: Lấy tên file hiện tại trên thanh address Tên file nằm trên folder gốc của website Ví dụ: biến
$_SERVER['PHP_SELF'] trong script đặt tại địa chỉ http://example.com/test.php sẽ là test.php
********************************************************/
function pageList($curpage, $pages) {
$page_list = "";
/*In trang đầu tiên và những link tới trang trước nếu cần*/ if(($curpage != 1) && ($curpage))
{
$page_list = "<a href=\"".$_SERVER['PHP_SELF']."?page=1\">[Trang đầu]</a> ";
} if(($curpage - 1) > 0) {
$page_list = "<a href=\"".$_SERVER['PHP_SELF']."?page=".($curpage-1) "\"> [Previous] </a> ";
} /*In danh sách các trang và làm cho trang hiện tại đậm hơn va mat link o chan*/
for($i=1;$i<=$pages;$i++) {
if($i == $curpage) {
$page_list = "<b><big> ".$i." </big></b>"; }
else { $page_list = "<a href=\"".$_SERVER['PHP_SELF']." ? page=".$i."\"> ".$i." </a> ";
}
$page_list = "";
}
Trang 10105
/*In link của trang tiếp theo và trang cuối cùng nếu cần*/ if(($curpage+1) <= $pages)
{
$page_list = "<a href=\"".$_SERVER['PHP_SELF']." ? page=".($curpage+1) "\"> [Next] </a> ";
} if(($curpage != $pages) && ($pages != 0)) {
$page_list = "<a href=\"".$_SERVER['PHP_SELF']." ? page=".$pages."\">[Trang cuối]</a> ";
}
$page_list = "</td>\n";
return $page_list;
} /**************************************************
* Hàm string nextPrev(int curpage, int pages)
* Returns "Previous | Next" string for individual pagination (it's
a word!)
****************************************************/
function nextPrev($curpage, $pages) {
$next_prev = "";
if(($curpage-1) <= 0) {
$next_prev = "Về trang trước";
} else {
$next_prev = "<a href=\"".$_SERVER['PHP_SELF']." ? page=".($curpage-1)."\">Về trang trước</a>";
}
$next_prev = " | ";
if(($curpage+1) > $pages) {
$next_prev = "Đến trang sau";
} else {
$next_prev = "<a href=\"".$_SERVER['PHP_SELF']." ? page=".($curpage+1)."\">Đến trang sau</a>";
} return $next_prev;
} } //Đóng class Pager
?>
<H2><p align=center><b> THÔNG TIN SÁCH </b></p></H2>
<table align=center border="1" cellpadding="2" cellspacing="2" style="border-collapse:collapse">
<tr>
<th nowrap>MÃ SÁCH</th>
<th nowrap>TÊN SÁCH</th>
<th nowrap>TÁC GIẢ</th>
<th nowrap>NNÀ XUẤT BẢN</th>
<th nowrap>NĂM XUẤT BẢN</th>