Thứ Năm, 23 tháng 6, 2016

Phần 10 - Phân trang sản phẩm

- Tiếp theo là làm phân trang sản phẩm (Khi sản phẩm trong 1 danh mục nhiều thì tiến hành phân trang).Bạn viết đoạn code sau ở dòng thứ 3 trong file 'xuat.php' (sau biến 'id' và trước biến 'tv' ) :


$so_du_lieu=15;
$tv="select count(*) from san_pham where thuoc_menu='$id';";
$tv_1=mysql_query($tv);
$tv_2=mysql_fetch_array($tv_1);
$so_trang=ceil($tv_2[0]/$so_du_lieu);

+ Đây là đoạn code tính số trang khi phân trang

+ Lệnh count(*) dùng để đếm dữ liệu trong bảng 'san_pham'.Như vậy câu lệnh select count(*) from san_pham where thuoc_menu='$id'; là để đếm dữ liệu trong bảng 'san_pham' ở nơi mà cột 'thuoc_menu' có giá trị là biến 'id' (biến id sẽ lấy giá trị từ url , nếu như bấm vào menu dọc "Menu 3" thì giá trị biến 'id' là 3)

+ Ở đây $tv_2[0] sẽ có giá trị trả về là số dòng dữ liệu trong bảng 'san_pham' theo cột 'thuoc_menu'. Bạn lưu ý rằng biến 'tv_2' sẽ trả về 1 dòng giá trị và biến 'tv_2' cũng là 1 mảng.Cái mảng này ngoài cách truy cập theo kiểu $tv_2['tên cột hoặc trường'] thì có thể truy cập theo kiểu $tv_2[Số theo cột].'Số theo cột' nghĩa là nếu câu truy vấn trả về dữ liệu bao nhiêu cột thì sẽ trả về bao nhiêu số (bắt đầu từ số 0 rồi từ đó tăng dần , giá trị số sẽ tương ứng với tên cột từ trái qua phải)

+ Khi viết $tv_2[0] là lấy cột đầu tiên của dòng dữ liệu trả về (Ở đây dữ liệu trả về chỉ là 1 dòng 1 cột vì dùng lệnh count(*)) => $tv_2[0] sẽ có giá trị trả về là số dòng dữ liệu trong bảng 'san_pham' theo cột 'thuoc_menu' ($tv_2[0] cũng có thể hiểu là tổng số dữ liệu theo danh mục sản phẩm )

+ $so_du_lieu=15; nghĩa là 1 trang sẽ xuất 15 sản phẩm (15 dòng dữ liệu).Như vậy đây là khai báo số dữ liệu sản phẩm trên 1 trang

+ Số trang sẽ tính theo kiểu là lấy tổng số dữ liệu của danh mục sản phẩm đó chia cho số dữ liệu sản phẩm trên 1 trang , sau đó làm tròn số lên (do khi chia số có thể ra số lẽ)

+ Hàm ceil là hàm làm tròn số lên

+ $so_trang=ceil($tv_2[0]/$so_du_lieu); => Bạn đã tìm được số trang khi xuất dữ liệu sản phẩm theo danh mục

- Bạn thêm đoạn code sau trước echo "</table>"; ( nằm ngoài vòng lặp 'while' ) :

echo "<tr>";
    echo "<td colspan='3' align='center' >";
        echo "<div class='phan_trang' >";
            for($i=1;$i<=$so_trang;$i++)
            {
                echo "<a href='' >";
                    echo $i;echo " ";
                echo "</a>";
            }
        echo "</div>";
    echo "</td>";
echo "</tr>";

+ Code trên là xuất link phân trang.Vòng lặp 'for' sẽ chạy từ khi biến 'i' bằng 1 đến khi biến 'i' có giá trị bằng số trang phân trang thì dừng lại.Trong lúc chạy vòng lặp 'for' thì xuất (echo) biến 'i' ra (cùng với liên kết a , liên kết tạm thời để rỗng)

+ Ở đây ô 'td' sẽ gộp 3 cô lại (colspan='3' , vì phần thẻ 'table' phía trên có 3 ô 'td').Ô 'td' sẽ canh giữa văn bản : align='center'

+ Dùng 'div' có tên class là 'phan_trang' để bọc các liên kết lại.Điều này sẽ giúp web định dạng lại giao diện css phần xuất liên kết này nhưng sẽ làm điều này ở phần sau của tài liệu này.

- Tải lại trang và kéo web xuống dưới chỗ 'Footer' thì bạn nhận được kết quả sau :

 - Tiếp theo là cần viết lệnh limit trong chuổi truy vấn mysql(ở biến 'tv' khi xuất dữ liệu ra).Lệnh limit có tác dụng là giới hạn dữ liệu xuất ra (ở đây là giới hạn sản phẩm xuất ra).Có thể hiểu thế này :

limit Vị trí bắt đầu giới hạn , Số dòng dữ liệu sẽ lấy

- Ví dụ viết là 'limit 0,10' thì hiểu là dữ liệu lấy từ dòng 1 đến dòng 10 , viết là 'limit 25,5' là lấy dữ liệu từ dòng thứ 25 đến dòng thứ 30

- Như vậy có 2 tham số cần điền vào lệnh limit.Tham số đầu chưa có , tham số thứ 2 chính là biến 'so_du_lieu' (có giá trị là 15 và đây cũng là số dòng dữ liệu sẽ lấy mỗi khi phân trang)

- Bạn thêm dòng code sau sau dòng $so_trang=ceil($tv_2[0]/$so_du_lieu); :


if(!isset($_GET['trang'])){$vtbd=0;}else{$vtbd=($_GET['trang']-1)*$so_du_lieu;}

+ Dòng code này tính giá trị của biến 'vtbd' (chính là vị trí bắt đầu giới hạn dữ liệu).Câu lệnh này nghĩa là nếu chưa tồn tại biến 'trang trên url' thì biến 'vtbd' có giá trị là 0 , ngược lại thì biến 'vtbd' có giá trị là biến 'trang trên url' trừ 1 rồi nhân cho số dữ liệu trên 1 trang (web đã khai báo tại biến 'so_du_lieu' , ở đây số dữ liệu trên 1 trang là 15)

- Tiếp theo bạn sửa dòng code $tv="select id,ten,gia,hinh_anh,thuoc_menu from san_pham where thuoc_menu='$id' order by id desc"; thành :

$tv="select id,ten,gia,hinh_anh,thuoc_menu from san_pham where thuoc_menu='$id' order by id desc limit $vtbd,$so_du_lieu";

- Nghĩa là bạn thêm 'limit' vào.Sau đó bạn tải lại phần xuất sản phẩm của 'Menu 3' (phần menu dọc) sẽ thấy dữ liệu xuất ra chỉ có 15 sản phẩm (vì web ban đầu giới hạn chỉ xuất 15 sản phẩm mỗi trang)(ban đầu là xuất hết sản phẩm trong danh mục menu ra)

- Tiếp theo bạn thêm dòng code sau vào vòng lặp 'for' ở phần xuất liên kết phân trang (chỗ có colspan='3') :

$link="?thamso=xuat_san_pham&id=".$_GET['id']."&trang=".$i;

- Dòng này để khai báo liên kết phân trang mỗi khi bạn bấm vào.Liên kết này có biến 'thamso' giá trị là 'xuat_san_pham' , biến 'id' có giá trị là biến 'id trên url' , biến 'trang' có giá trị là biến 'id'.Điều này có thể hiểu là mỗi khi bấm vào phân trang thì thêm biến 'trang' vào url của web hiện tại , biến 'trang' có giá trị tương ứng với trang bạn bấm vào (bấm vào trang 1 thì biến 'trang' sẽ có giá trị là 1 , bấm vào trang 3 thì biến 'trang' sẽ có giá trị là 3 ...)

- Sau đó bạn xuất (echo) biến 'link' vào thuộc tinh 'href' của thẻ 'a' , code sau khi viết như sau :

for($i=1;$i<=$so_trang;$i++)
{
    $link="?thamso=xuat_san_pham&id=".$_GET['id']."&trang=".$i;
    echo "<a href='$link' >";
        echo $i;echo " ";
    echo "</a>";
}

- Sau đó bạn tải lại trang web hiện tại , rồi bấm vào vào số '2' ở phần xuất liên kết phân trang (nghĩa là bạn vào trang 2 của menu tên là 'Menu 3' tại phần menu dọc) thì sẽ nhận được kết quả sau :


- Điều này có nghĩa là phân trang sản phẩm xong.Bạn có thể kiểm tra lại web phần phân trang bằng cách bấm vào các menu dọc "Menu 1","Menu 3"

- Code sau khi viết trang 'xuat.php' như sau :


<?php
    $id=$_GET['id'];
  
    $so_du_lieu=15;
    $tv="select count(*) from san_pham where thuoc_menu='$id';";
    $tv_1=mysql_query($tv);
    $tv_2=mysql_fetch_array($tv_1);
    $so_trang=ceil($tv_2[0]/$so_du_lieu);
  
    if(!isset($_GET['trang'])){$vtbd=0;}else{$vtbd=($_GET['trang']-1)*$so_du_lieu;}
  
    $tv="select id,ten,gia,hinh_anh,thuoc_menu from san_pham where thuoc_menu='$id' order by id desc limit $vtbd,$so_du_lieu";
    $tv_1=mysql_query($tv);
    echo "<table>";
    while($tv_2=mysql_fetch_array($tv_1))
    {
        echo "<tr>";
            for($i=1;$i<=3;$i++)
            {
                echo "<td align='center' width='215px' valign='top' >";
                    if($tv_2!=false)
                    {
                        $link_anh="hinh_anh/san_pham/".$tv_2['hinh_anh'];
                      
                        echo "<img src='$link_anh' width='150px' >";echo "<br>";
                        echo $tv_2['ten'];echo "<br>";
                        echo $tv_2['gia'];echo "<br>";echo "<br>";
                    }
                    else
                    {
                        echo "&nbsp;";
                    }
                echo "</td>";
                if($i!=3)
                {
                    $tv_2=mysql_fetch_array($tv_1);
                }
            }
        echo "</tr>";
    }
    echo "<tr>";
        echo "<td colspan='3' align='center' >";
            echo "<div class='phan_trang' >";
                for($i=1;$i<=$so_trang;$i++)
                {
                    $link="?thamso=xuat_san_pham&id=".$_GET['id']."&trang=".$i;
                    echo "<a href='$link' >";
                        echo $i;echo " ";
                    echo "</a>";
                }
            echo "</div>";
        echo "</td>";
    echo "</tr>";
    echo "</table>";
?>