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

Phần 17 - Làm phần tìm kiếm sản phẩm

- Phần này làm phần tìm kiếm sản phẩm.Tại file 'index.php' ở phần cột phải , bạn xóa từ 'Cột phải' đi rồi thêm đoạn code sau :


<?php
    include("chuc_nang/tim_kiem/vung_tim_kiem.php");
?>

- Đoạn code trên sẽ gọi file 'vung_tim_kiem.php' trong thư mục 'tim_kiem'.Do chưa có file 'vung_tim_kiem.php' và thư mục 'tim_kiem' nên cần phải tạo ra file và thư mục này.Bạn tạo thư mục 'tim_kiem' trong thư mục 'chuc_nang' , rồi tạo file 'vung_tim_kiem.php' trong thư mục 'tim_kiem'

- Bạn nhập đoạn code sau vào file 'vung_tim_kiem.php' :

Tìm kiếm <br>
<form>
    <input type="hidden" name="thamso" value="tim_kiem" >
    <input type="text" name="tu_khoa" value="" style="margin-top:10px;margin-bottom:10px;" >
    <input type="submit" value="Tìm" >
</form>

+ Code này sẽ xuất biểu mẫu tìm kiếm ra ngoài trang web(form tìm kiếm) bằng thẻ 'form'.Trong thẻ 'form' này sẽ chứa vài thẻ 'input' và các thẻ 'input' này sẽ dựa vào kiểu type để hiển thị các kiểu nội dung khác nhau ra

+ Kiểu thứ 1 là kiểu 'hidden' , viết theo kiểu này là không hiển thị gì cả nhưng lưu giá trị ngầm.Ở đây giá trị ngầm có giá trị là 'tim_kiem' (value)

+ Kiểu thứ 2 là kiểu 'text' , viết như vậy là xuất 1 khung văn bản ra

+ Kiểu thứ 3 là kiểu 'submit' , viết như vậy nghĩa là tạo ra 1 cái nút (ở đây nút này sẽ có nội dung là 'Tìm' , nội dung này được viết trong thuộc tính 'value') và khi bấm vào cái nút này thì biểu mẫu sẽ được gởi đi

+ Biểu mẫu này sẽ được gửi đi bằng phương thức 'GET' (đây là phương thức mặc định nếu không khai báo biểu mẫu có phương thức là gì), có nghĩa là khi bạn gửi biểu mẫu này đi (bằng cách bấm vào nút 'Tìm') thì web sẽ đến 1 trang web có một hoặc vài tham số trên url (các tham số này đương nhiên do người viết code định nghĩa)

+ Tên biến tham số sẽ được gán vào thuộc tính 'name' trong các thẻ 'input'.Phần code trên đã tạo ra 2 biến tham số tên là 'thamso' và 'tu_khoa' (name="thamso"name="tu_khoa")

+ Biến tham số tên là 'thamso' sẽ có giá trị là 'tim_kiem' (value="tim_kiem")

+ Biến tham số tên là 'tu_khoa' sẽ có giá trị biến đổi tùy thuộc vào nội dung khung văn bản , nghĩa là bạn nhập nội dung gì thì biến 'tu_khoa' sẽ có giá trị đó (ban đầu không nhập gì cả thì biến 'tu_khoa' sẽ có giá trị 'rỗng')

+ Khi mà biểu mẫu tìm kiếm được gửi đi (bằng cách bấm nút 'Tìm') thì web sẽ đi đến địa chỉ web tương tự như sau :

?thamso=tim_kiem&tu_khoa=

+ Còn nếu có nhập nội dung vào văn bản , ví dụ như nhập nội dung là 'san pham' rồi bấm nút 'Tìm' thì web sẽ đi đến địa chỉ web tương tự như sau :

?thamso=tim_kiem&tu_khoa=san+pham

+ Có thể hiểu là khi nhập nội dung nào vào khung văn bản rồi bấm nút 'Tìm' thì web sẽ đến địa chỉ web tương tự như sau :

?thamso=tim_kiem&tu_khoa=từ khóa tìm kiếm

+ Sau đó code web này sẽ viết 1 đoạn code dựa vào biến 'thamso trên url' (Sau khi bấm nút 'Tìm') để xuất ra trang tìm kiếm sản phẩm

+ Lưu ý đoạn code trên dùng 'margin-top' và 'margin-bottom' để tạo khoảng cách cách trên và khoảng cách cách dưới cho khung văn bản tìm kiếm ('margin-top' là khoảng cách cách trên , 'margin-bottom' là khoảng cách cách dưới)

- Bây giờ bạn tại file 'dieu_huong.php' , bạn thêm đoạn code sau trước chữ default :

case "tim_kiem":
    include("chuc_nang/tim_kiem/xuat_san_pham_tim_kiem.php");
break;

+ Đoạn code trên nghĩa là khi bạn truy cập trang web mà có biến 'thamso trên url' có giá trị là 'tim_kiem' thì web sẽ chạy file 'dieu_huong.php' , rồi từ file 'dieu_huong.php' sẽ gọi file 'xuat_san_pham_tim_kiem.php' (trong thư mục 'tim_kiem') vào file 'index.php'

- Bạn tiến hành tạo ra file 'xuat_san_pham_tim_kiem.php' trong thư mục 'tim_kiem'.Sau đó sao chép nội dung file 'xuat_toan_bo_san_pham.php' vào file 'xuat_san_pham_tim_kiem.php'

- Ở đầu file 'xuat_san_pham_tim_kiem.php' , bạn thêm đoạn code sau :

$m=explode(" ",$_GET['tu_khoa']);  
$chuoi_tim_sql="";
for($i=0;$i<count($m);$i++)
{
    $tu=trim($m[$i]);
    if($tu!="")
    {
        $chuoi_tim_sql=$chuoi_tim_sql." ten like '%".$tu."%' or";
    }
}

$m_2=explode(" ",$chuoi_tim_sql);  
$chuoi_tim_sql_2="";
for($i=0;$i<count($m_2)-1;$i++)
{
    $chuoi_tim_sql_2=$chuoi_tim_sql_2.$m_2[$i]." ";
}

+ Đoạn code trên sẽ dùng lệnh like để truy vấn dữ liệu trong bảng 'san_pham' (dùng để tìm kiếm).Để hiểu lệnh này , bạn cần xem bài viết sau :

Lệnh like trong mysql (Bấm vào để xem)

+ Ở đây cột dữ liệu tìm kiếm sẽ là 'ten' và dùng toán tử 'or' , nghĩa là 'tên là cái này hoặc tên là cái kia hoặc tên là cái khác hoặc tên là cái khác nữa ...'

+ Hàm explode để tách chuỗi thành mảng.Ở đây chuỗi ở đây là biến 'tu_khoa trên url'.Tham số đầu tiên là ký tự tách => ký tự tách là khoảng trắng.Như vậy $m=explode(" ",$tu_khoa); là tách từ khóa tìm kiếm thành mảng các từ thông qua ký tự khoảng trắng, ví dụ khi bạn nhập từ khóa "Sản phẩm abc" thì sẽ tạo ra mảng có 3 giá trị lần lượt là "Sản" , "Phẩm" , "abc"

+ Viết count($m) là tính xem mảng 'm' (mảng từ khóa) có độ dài bao nhiêu (có thể hiểu là có bao nhiêu từ) , ví dụ khi bạn nhập từ khóa "Sản phẩm abc" thì độ dài sẽ là 3

+ Sau đó bạn cho vòng lặp 'for' chạy hết mảng 'm' (chính là mảng từ khóa , chạy từ khi biến 'i' bằng 1 đến khi biến 'i' còn nhỏ hơn độ dài của mảng 'm' , nếu bằng hoặc lớn hơn thì dừng vòng lặp).Cứ mỗi lần vòng lặp 'for' chạy tiếp thì bạn thêm giá trị chuỗi vào biến 'chuoi_tim_sql' nối tiếp với giá trị nội dung cũ của biến 'chuoi_tim_sql' (ban đầu biến 'chuoi_tim_sql' có giá trị rỗng)

+ Giá trị chuỗi thêm vào là cột 'ten' , toán tử 'or' và 'từ khóa tách' của mảng từ khóa(chính là $m[$i] , lưu ý hàm 'trim' dùng để xóa khoảng trắng 2 bên của ký tự).Ví dụ bạn nhập từ khóa tìm kiếm 'Sản phẩm abc' thì biến 'chuoi_tim_sql' có giá trị là ten like '%Sản%' or ten like '%phẩm%' or ten '%abc% or

+ Ở đây sau khi tìm biến 'chuoi_tim_sql' thì sẽ có chữ 'or' ở cuối cùng , bạn cần loại bỏ từ này đi (nếu không sẽ sai cú pháp tìm kiếm mysql).Bạn dùng hàm explode để tách biến 'chuoi_tim_sql' thàng mảng tên là 'm_2' thông qua ký tự khoảng trắng.Sau đó chạy vòng lặp 'for' đến độ dài kế cuối của mảng này (count($m_2)-1 , nghĩa là bỏ đi giá trị cuối của mảng này) , cứ mỗi lần lặp 'for' thì bạn thêm dồn giá trị nội dung vào biến 'chuoi_tim_sql_2' vào giá trị nội dung cũ của biến 'chuoi_tim_sql_2' (biến 'chuoi_tim_sql_2' ban đầu có giá trị rỗng)

+ Như vậy sau vòng lặp 'for' đó , bạn đã bỏ được chữ 'or' của biến 'chuoi_tim_sql' và gán giá trị mới vào biến 'chuoi_tim_sql_2'.Ví dụ như mình nhập từ khóa tìm kiếm 'Sản phẩm abc' thì biến 'chuoi_tim_sql_2' có giá trị là ten like '%Sản%' or ten like '%phẩm%' or ten '%abc% (không có chữ 'or' phía cuối)


- Ở đây sẽ có trường hợp từ khóa là rỗng thì khi đó sẽ xuất ra ngoài web dòng chữ "Bạn chưa nhập từ khóa".Để làm điều đó bạn thêm dòng code sau vào đầu file 'xuat_san_pham_tim_kiem.php' :

if(trim($_GET['tu_khoa'])!=""){

- Sau đó thêm đoạn code sau vào cuối file 'xuat_san_pham_tim_kiem.php' :

}
else
{
echo "Bạn chưa nhập từ khóa";
}

- Như vậy là làm xong phần nhập từ khóa rỗng.Kế tiếp bạn sửa dòng chữ select count(*) from san_pham thành :

select count(*) from san_pham where $chuoi_tim_sql_2

- Nghĩa là thêm where $chuoi_tim_sql_2.Rồi lại sửa dòng chữ select id,ten,gia,hinh_anh,thuoc_menu from san_pham order by id desc limit $vtbd,$so_du_lieu thành :

select id,ten,gia,hinh_anh,thuoc_menu from san_pham where $chuoi_tim_sql_2 order by id desc limit $vtbd,$so_du_lieu

- Cũng là thêm where $chuoi_tim_sql_2.Như vậy 2 lần sửa trên nhằm mục đích thêm lệnh like vào chuỗi truy vấn (thêm lệnh tìm kiếm vào chuỗi truy vấn)

- Sau đó bạn sửa dòng code $link="?thamso=xuat_san_pham_2&trang=".$i; (chỗ xuất liên kết phân trang) thành :

$link="?thamso=tim_kiem&tu_khoa=".$_GET['tu_khoa']."&trang=".$i;

- Nghĩa là bạn đổi biến 'thamso trên url' từ 'xuat_san_pham_2' thành 'tim_kiem' (để file 'dieu_huong.php' dựa vào biến này mà chuyển sang trang tìm kiếm (có thể hiểu là chuyển sang chức năng tìm kiếm)).Đồng thời truyền thêm biến 'tu_khoa trên url' để biết giá trị của từ khóa là gì mỗi khi bấm vào liên kết phân trang (sử dụng cách viết $_GET['tu_khoa'] để lấy giá trị trên url)

- Khi bạn gõ từ khóa "Sản phẩm" rồi bấm vào nút "Tìm" thì bạn sẽ nhận kết quả tương tự như sau :



- Còn khi bạn gõ vào từ khóa "4" rồi bấm vào nút "Tìm" , bạn sẽ nhận được kết quả tương tự như sau :


- Web sẽ tìm kiếm và xuất các sản phẩm có số '4' trong tên sản phẩm ra ngoài web

- Trường hợp để từ khóa là rỗng (hoặc để khoảng trắng) rồi bấm nút "Tìm" thì web sẽ xuất ra dòng chữ Bạn chưa nhập từ khóa

- Kết thúc phần này thì file 'xuat_san_pham_tim_kiem.php' có nội dung tương tự như sau :


<?php
    if(trim($_GET['tu_khoa'])!=""){
        $m=explode(" ",$_GET['tu_khoa']);  
        $chuoi_tim_sql="";
        for($i=0;$i<count($m);$i++)
        {
            $tu=trim($m[$i]);
            if($tu!="")
            {
                $chuoi_tim_sql=$chuoi_tim_sql." ten like '%".$tu."%' or";
            }
        }

        $m_2=explode(" ",$chuoi_tim_sql);  
        $chuoi_tim_sql_2="";
        for($i=0;$i<count($m_2)-1;$i++)
        {
            $chuoi_tim_sql_2=$chuoi_tim_sql_2.$m_2[$i]." ";
        }

        $so_du_lieu=15;
        $tv="select count(*) from san_pham  where $chuoi_tim_sql_2";
        $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 $chuoi_tim_sql_2 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'];
                            $link_chi_tiet="?thamso=chi_tiet_san_pham&id=".$tv_2['id'];
                          
                            echo "<a href='$link_chi_tiet' >";
                                echo "<img src='$link_anh' width='150px' >";
                            echo "</a>";
                            echo "<br>";
                            echo "<a href='$link_chi_tiet' >";
                                echo $tv_2['ten'];
                            echo "</a>";
                            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=tim_kiem&tu_khoa=".$_GET['tu_khoa']."&trang=".$i;
                        echo "<a href='$link' >";
                            echo $i;echo " ";
                        echo "</a>";
                    }
                echo "</div>";
            echo "</td>";
        echo "</tr>";
        echo "</table>";
    }
    else
    {
    echo "Bạn chưa nhập từ khóa";
    }
?>

- Và code file 'dieu_huong.php' có nội dung tương tự như sau :

<?php
    if(isset($_GET['thamso'])){$tham_so=$_GET['thamso'];}else{$tham_so="";}
    switch($tham_so)
    {
        case "xuat_san_pham":
            include("chuc_nang/san_pham/xuat.php");
        break;
        case "chi_tiet_san_pham":
            include("chuc_nang/san_pham/chi_tiet_san_pham.php");
        break;
        case "xuat_san_pham_2":
            include("chuc_nang/san_pham/xuat_toan_bo_san_pham.php");
        break;
        case "xuat_mot_tin":
            include("chuc_nang/xuat_mot_tin.php");
        break;
        case "tim_kiem":
            include("chuc_nang/tim_kiem/xuat_san_pham_tim_kiem.php");
        break;
        default:
            echo "trang chủ";
    }
?>