Bài 15 HIỂN THỊ VÀ PHÂN TRANG

Một phần của tài liệu tài liệu tổng hợp về thiết kế web (Trang 128 - 136)

Khi thực thi các truy vấn lấy dữ liệu (select), hàm mysql_query() sẽ trả về tập dữ liệu recoredset là kết quả của câu truy vấn hay trả về false nếu truy vấn bị lỗi. Do đó ta sẽ tạo một biến và nhận giá trị trả về từ hàm mysql_query(). Biến này là một con trỏ chỉ tới dòng đầu tiên trong tập recordset của truy vấn (ví dụ dòng đầu tiên trong bảng csdl). Với biến này, ta có thể sử dụng hàm mysql_num_rows() để biết số record kết quả trả về của hàm truy vấn và hàm mysql_fetch_array() cùng vòng lặp while để duyệt qua từng mẫu tin (record, dòng).

$row = mysql_fetch_array($result)

Với mỗi dòng (mỗi mẩu tin), ta kết hợp mã để tạo ra thẻ HTML tạo nên cấu trúc bảng gửi về trình duyệt web.

Ví dụ: Truy cập và hiển thị các mẩu tin trong bảng mặt hàng. <?

include("includes/conn.inc");

//Chọn tất cả các mặt hàng từ bảng mathang

$sql = "select * from mathang";

//Lấy về kết quả truy vấn (tập recordset), kết quả được chỉ bởi biến $result

$result = mysql_query($sql, $conn);

// Kiểm tra thực thi truy vấn có lỗi hay không

if (!$result) {

die('Invalid query: ' . mysql_error()); }

/* Kiểm tra xem số mẫu tin trả về có khác rỗng hay không, nếu có thì duyệt qua từng record trong tập recoredset ($result) bàng hàm mysql_fetch_array

*/

if (mysql_num_rows($result) >0) { //Tạo bảng gồm 2 cột

$S = “<table border=1 cellspacing=0><tr><td> Ma mat hang </td>”; $S .= “<td> Ten mat hang </td></tr>”;

while ($row = mysql_fetch_array($result)) { $S .= "<tr><td>" .$row["msmh"] ."</td>”; $S .=”<td>" . $row["tenmh"] .”</td></tr>”; } $S .= “</table>”; echo $S; } mysql_close($conn); ?>

Trong ví dụ trên, ta có 2 mặt hàng. Vậy tập recoredset nhận được từ kết quả của truy vấn $result = mysql_query($sql, $conn) là 2. Khi đó $result chỉ tới record đầu tiên. Hàm mysql_num_rows($result) sẽ trả về số record là 2 (>0), tức là có dữ liệu, do vậy ta chuẩn bị xuất dữ liệu trong vòng lặp while. Trong vòng lặp này ta đã sử dụng hàm mysql_fetch_array($result). Hàm này trả kết quả là mảng chính là record hiện tại mà $result đang chỉ tới. Như vậy, với lần thực hiện đầu tiên trong while, biến $row có dữ liệu là (1, “Xe May”, …). Sau mỗi lần thực hiện hàm mysql_fetch_array(), biến $result sẽ chỉ tới dòng kế tiếp. Khi duyệt hết, kết quả trả về của hàm là false, điều kiện để vòng lặp while dừng.

Với kết quả của một dòng, ta có thể sử dụng các tính chất về mảng để lấy thông tin các cột: $row[tênfield] (như trong ví dụ) hay $row[chỉ số]. Chỉ số được bắt đầu từ 0.

Chú ý: Khi sử dụng tên field thì tên này chính là tên cột recordset và có phân biệt chữ hoa và thường.

Ta viết lại ví dụ trên sử dụng chỉ số để duyệt qua một dòng (thực chất là một mảng) như ví dụ sau:

<?

include("includes/conn.inc"); $sql = "select * from mathang"; $result = mysql_query($sql, $conn); if (mysql_num_rows($result) >0) {

$S = "<table border=1 cellspacing=0>" ; while ($row = mysql_fetch_array($result)) {

$S .= "<tr>";

//Bảng mathang của ta có 6 cột. Ta muồn hiển thị cả 6 cột này. for ($i=0; $i<6; $i++)

$S .= "<td>" .$row[$i] ."</td>"; $S .=" </tr>"; } $S .= "</table>"; echo $S; } mysql_close($conn);

?>

Ta cũng có thể sử dụng hàm mysql_num_fields() để biết số field được trả về cho biến kết quả $result. Do vậy vòng for ở ví dụ trên được viết lại như sau:

while ($row = mysql_fetch_array($result)) {

$S .= "<tr>";

for ($i=0; $i< mysql_num_fields($result) ; $i++) $S .= "<td>" .$row[$i] ."</td>";

$S .=" </tr>"; }

Vì dữ liệu trong field mota có thể có nhiều dòng (được nhập vào từ textarea). Các dòng được lưu bằng ký tự xuống hàng (new line) trong database. Khi muốn hiển thị field này như khi nhập, ta phải sử dụng hàm nl2br() để chuyển các ký tự new line thành <BR> như sau:

$mota = nl2br($row["mota"] );

Ta cũng có thể duyệt qua từng dòng của tập recordset bằng hàm mysql_fetch_object() thay vì hàm mysql_fetch_array(). Nếu sử dụng hàm mysql_fetch_object(), để duyệt qua từng dòng kết quả, khi đó để truy cập đến dữ liệu của field nào, ta dùng toán tử →tên field như đoạn mã sau:

while ($row = mysql_fetch_object($result)) echo $row→mamh;

sẽ truy cập field mã mặt hàng. 15.2 Phân Trang

15.2.1Giới Thiệu

Trong php, tập recordset không có thuộc tính phân trang (paging) như asp. Tuy nhiên ta có thể lập trình riêng cho phần này bằng cách sử dụng thành phần limit của câu truy vấn.Cú pháp câu truy vấn select trong mysql: select * from table … limit from, num sẽ lấy ra num

record bắt đầu từ record from. Ví dụ:

- lấy danh sách 10 mặt hàng đầu tiên: select * from mathang limit 0, 10

- Lấy ra 10 mặt hàng tính từ mặt hàng thứ 20: select * from mathang limit 20, 10

- Lấy ra 10 mặt hàng có giá cao nhất: select * from mathang order by gia desc limit 0, 10.

Do vậy công việc khi phân trang là cần xác định các giá trị: số record trong một trang (pagesize), trang hiện hành mà khách hàng cần xem (currpage), từ đó tạo ra câu truy vấn với các giá trị trong thuộc tính limit là from và num được xác định.

Trong phân trang, ta cũng cần xác định một số các tham số khác như: tổng số trang có được, tổng số record, …

15.2.2 Cách Xác Định Các Tham Số Khi Tiến Hành Phân Trang

- Số mẩu tin hiển thị trong một trang – pagesize. Giá trị này là một số nguyên dương và thường được xác định trước (bởi người lập trình hay người sử dụng). - Tổng số mẩu tin nhận được từ câu truy vấn không sử dụng limit: numrows. Giá trị

này có thể xác định bằng hàm count trong câu truy vấn: select count(*) from … Giá trị này ít (không) thay đổi, do vậy cũng có thể thực thi truy vấn một lần duy nhất và sau đó lưu giá trị này trong biến session để sử dụng cho lần sau.

- Số trang có được - pagecount: Tham số này được tính dựa trên pagesize

numrows như sau:

Nếu numrows chia hết cho pagesize thì pagecount = numrows/pagesize.

Nếu numrows không chia hết cho pagesize thì pagecount = numrows/pagesize+1. Khi đó trang cuối cùng sẽ có số mẩu tin ít hơn pagesize.

(Cũng có thể tính đơn giản bằng hàm ceil: pagecount = ceil(numrows/pagesize)).

- Trang hiện tại cần xem – currpage: Tham số này do người sử dụng đưa tới. Tuy nhiên, lần đầu tiên trang được gọi (người sử dụng chưa chọn số trang), ta chọn trang mặc định cần xem sẽ là trang đầu tiên. Ta có thể kiểm tra điều này bằng hàm isset(). Chúng ta sẽ cho người sử dụng chọn trang qua các link. Do vậy nếu người sử dụng cố ý nhập vào currpage trên thanh địa chỉ không hợp lệ, (quá lớn - vượt quá số trang hiện có - pagecount, quá nhỏ - số không dương, hoặc không phải là một số) ta sẽ điều chỉnh lại giá trị này. Cụ thể: Quá lớn, currpage sẽ là trang cuối. Trường hợp còn lại, currpage sẽ là trang đầu tiên.

Khi xác định chính xác các tham số này, giá trị fromnum trong thuộc tính limit sẽ là:

from=(currpage-1) * pagesize, num=pagesize.

15.2.3Ví Dụ

Hiển thị danh sách các mặt hàng theo trang. Trang hiển thị được đặt tên là

paging_mathang.php.

<?

include("includes/conn.inc"); //Tính số record.

$sql =" select count(*) from mathang"; $result = mysql_query($sql);

$r = mysql_fetch_array($result); $numrows = $r[0];

//Kích thước của một trang. $pagesize = 2;

//Tính số trang

$pagecount = ceil($numrows / $pagesize);

/*Khởi tạo trang hiện hành. Lần đầu vào trang, biến currpage chưa được khởi động, trang được hiển thị là trang đầu. Trang hiện hành phải nằm từ 1 đến $pagecount.

*/

if (!isset($_GET["currpage"])) $currpage = 1;

else

$currpage =$_GET["currpage"]; $from = ($currpage – 1) * $pagesize;

$sql = "select * from mathang limit $from, $pagesize"; $result = mysql_query($sql, $conn);

// Kiểm tra, thông báo và dừng nếu query lỗi. if (!$result)

{

$message = 'Invalid query: ' . mysql_error() . "\n";

$message .= 'Whole query: ' . $query;

die($message);

}

echo "<hr> Thông tin: ";

echo "<br>Số mẩu tin:" .$numrows; echo "<br>Trang hiện hành:" .$currpage; echo "<br>Tổng số trang: " .$pagecount;

echo "<br>Kích thước một trang:" .$pagesize ."<hr>"; echo "<br>Trang $currpage / $pagecount. ";

//Phần nội dung hiển thị của các record trong trang.

$S = "<table border=1 cellspacing=0><tr><td> Ma </td>"; $S .= "<td>Tên Mặt Hàng </td>";

$S .= "<td> Mo ta </td>"; $S .= "<td> Hình ảnh </td>"; $S .= "<td> Giá </td></tr>";

while ($row = mysql_fetch_array($result)) {

{

$S .= "<tr><td>" .$row["msmh"] ."</td>";

$S .="<td><font face=tahoma>" . $row["tenmh"] ."</td>"; $S .="<td>" . nl2br($row["mota"]) ."</td> ";

$S .="<td><Img src='Images/" . $row["hinhanh"] ."'"; $S .= " width=60 height=90></td> "; $S .="<td>" . $row["gia"] ." USD</td> </tr>"; } } $S .= "</table>"; echo $S; mysql_close($conn); //Phần chọn trang cần xem

echo "<hr> Chọn trang cần xem:"; $S = "<b>Chon trang: ";

for ($i=1; $i<= $pagecount; $i++)

$S .= "<A href=\"". $_SERVER['PHP_SELF'] . "?currpage=" .$i ."\" >" .$i ."</a> &nbsp;";

echo $S; ?>

Nếu số lượng mặt hàng quá nhiều, ta có thể tạo các câu query để lọc bớt (tìm kiếm): Ví dụ chỉ tìm các mặt hàng điện máy, các mặt hàng có tên bắt đầu bằng chữ cái nào đó. Hoặc nếu số trang quá nhiều ta cũng có thể cho hiển thị hạn chế số trang cho khách hàng chọn trong một trang. Ví dụ, kết quả nhận được của ta là 52 trang (quá nhiều). Ta sẽ cho hiển thị một lần 10 trang để khách hàng chọn. Nếu là 10 trang đang chọn không phải 10 trang đầu, thêm liên kết Back để khách hàng quay về 10 trang trước. Nếu 10 trang (hoặc những trang còn lại) hiện tại không phải là những trang cuối cùng, thêm liên kết Next để chọn 10 trang kế tiếp. Như vậy, khi viết trang này, ta cần xác định thêm các thông số: Số trang được hiển thị cho phép lựa chọn trong một trang, đoạn hiện tại ta đang xem.

Ta viết lại trang paging_mathang.php như sau <?

include("includes/conn.inc");

$sql = "select count(*) from mathang "; $result = mysql_query($sql, $conn); $r = mysql_fetch_array($result); $numrows = $r[0];

$pagesize = 2;

$segsize=3; // So trang chon hien thi //Tinh so trang

// Thiet lap lai trang hien hanh

if (!isset($_GET["currpage"])) $currpage = 1; else

$currpage = $_GET["currpage"]; if ($currpage < 1) $currpage = 1;

if ($currpage > $pagecount) $currpage = $pagecount; //Tính số đoạn segment

$segmentcount= ceil($pagecount/ $segsize); //Tinh doan hien tai

$currsegment = ceil($currpage / $segsize ); echo "<font face=vni-times>Các thông số kiểm tra ";

echo "<br>Số mẩu tin:" .$numrows ."&nbsp;&nbsp;Kích thước 1 trang:" .$pagesize; echo "<br>Tổng số trang: " .$pagecount ."&nbsp;&nbsp;Trang hiện hành:" .$currpage; echo "<br>Số trang trong segment: " .$segsize;

echo "&nbsp;&nbsp; Số segment: " .$segmentcount; echo "<br>Segment hiện tạii: " .$currsegment ."<hr>"; echo "<b> Bạn đang ở trang: $currpage / $pagecount"; $from = ($currpage-1) * $pagesize;

$sql = "select * from mathang limit $from, $pagesize "; $S = "<table border=1 cellspacing=0><tr><td> Ma </td>"; $S .= "<td > Tên mặt hàng </td>";

$S .= "<td> Tính năng </td>"; $S .= "<td> Hình ảnh </td>"; $S .= "<td> Giá </td></tr>";

while ($row = mysql_fetch_array($result)) {

$S .= "<tr><td>" .$row["msmh"] ."</td>"; $S .="<td>" . $row["tenMH"] ."</td>"; $S .="<td>" . nl2br($row["mota"]) ."</td> ";

$S .="<td><Img src='Images/" . $row["hinhanh"] ."'"; $S .= " width=60 height=90></td> "; $S .="<td>" . $row["gia"] ." USD</td> </tr>"; } $S .= "</table>"; echo $S; mysql_close($conn); echo "<hr><b>Chọn trang: "; $S = ""; $back ="";

if ($currsegment >1)

$back ="<A href='?currpage=" .(($currsegment-1) * $segsize -1) ."'>Back</A> &nbsp;"; if ($currsegment < $segmentcount)

$next ="&nbsp;<A href='?currpage=" .($currsegment * $segsize +1)."'>Next</A> "; // Các trang hiển thị hiện hành được bắt đầu từ n1 - > n2.

$n1 = ($currsegment -1) *$segsize +1; if ($n1<1) $n1 =1;

if ($currsegment * $segsize < $pagecount) $n2 = $currsegment * $segsize; else

$n2 = $pagecount; for ($i= $n1; $i<=$n2; $i++)

$S .= "<A href='?currpage=" .$i ."'>" .$i ."</A> &nbsp;"; echo $back;

echo $S; echo $next; ?>

Bài 16 UPDATE DỮ LIỆU

Một phần của tài liệu tài liệu tổng hợp về thiết kế web (Trang 128 - 136)

Tải bản đầy đủ (DOC)

(143 trang)
w