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

Phần 48 - Làm phần xử lý thêm sản phẩm

- Tiếp theo là làm tiếp phần thêm sản phẩm vào bảng 'san_pham'.Bạn tạo file 'them_san_pham_vao_csdl.php' trong thư mục 'san_pham' với nội dung sau : 


<?php
    if(!isset($bien_bao_mat)){exit();}
?>
<?php
    $ten=trim($_POST['ten']);
    $ten=str_replace("'","&#39;",$ten);
    $danh_muc=$_POST['danh_muc'];
    $gia=trim($_POST['gia']);
    if($gia==""){$gia=0;}
    $ten_file_anh=$_FILES['hinh_anh']['name'];
    $trang_chu=$_POST['trang_chu'];
    $noi_bat=$_POST['noi_bat'];
    $noi_dung=$_POST['noi_dung'];
    $noi_dung=str_replace("'","&#39;",$noi_dung);
    $tv_m="select max(sap_xep_trang_chu) from san_pham";
    $tv_m_1=mysql_query($tv_m);
    $tv_m_2=mysql_fetch_array($tv_m_1);
    $sap_xep_trang_chu=$tv_m_2[0]+1;
    if($ten!="")
    {
        if($ten_file_anh!="")
        {
            $tv_k="select count(*) from san_pham where hinh_anh='$ten_file_anh' ";
            $tv_k_1=mysql_query($tv_k);
            $tv_k_2=mysql_fetch_array($tv_k_1);
            if($tv_k_2[0]==0)
            {
                $tv="
                INSERT INTO san_pham (
                id ,
                ten ,
                gia ,
                hinh_anh ,
                noi_dung ,
                thuoc_menu ,
                noi_bat ,
                trang_chu ,
                sap_xep_trang_chu
                )
                VALUES (
                NULL ,
                '$ten',
                '$gia',
                '$ten_file_anh',
                '$noi_dung',
                '$danh_muc',
                '$noi_bat',
                '$trang_chu',
                '$sap_xep_trang_chu'
                );";
                mysql_query($tv);

                $duong_dan_anh="../hinh_anh/san_pham/".$ten_file_anh;
                move_uploaded_file($_FILES['hinh_anh']['tmp_name'],$duong_dan_anh);

                $_SESSION['danh_muc_menu']=$danh_muc;
                $_SESSION['tuy_chon_trang_chu']=$trang_chu;
                $_SESSION['tuy_chon_noi_bat']=$noi_bat;
            }
            else
            {
                thong_bao_html("Hình ảnh bị trùng tên");
            }
        }
        else
        {
            thong_bao_html("Chưa chọn ảnh");
        }
    }
    else
    {
        thong_bao_html("Tên sản phẩm chưa được điền vào");
    }
?>


- Bạn xem giải thích code (phần chữ xanh) của file 'them_san_pham_vao_csdl.php' ở phần bên dưới :


<?php
    if(!isset($bien_bao_mat)){exit();} // xuất ra trang trắng nếu truy cập trực tiếp vào file này
?>
<?php
    // dùng $_POST để lấy giá trị của biểu mẫu thêm sản phẩm được gửi
    $ten=trim($_POST['ten']); // lấy tên sản phẩm gán vào biến $ten và loại bỏ khoảng trống ở 2 bên trái phải của tên sản phẩm
    $ten=str_replace("'","&#39;",$ten);
    // thay thế dấu ' thành &#39; (cách viết này cũng hiển thị ra dấu ' )
    //  làm như vậy để tránh gây ra lỗi sql khi thêm dữ liệu , với cách viết câu truy vấn thêm dữ liệu như bên dưới thì sẽ xảy ra lỗi
    // khi thêm dữ liệu mà tên sản phẩm có dấu ' nên cần có sự thay thế này
    $danh_muc=$_POST['danh_muc']; // lấy id menu (danh mục menu) , id menu này sẽ được lưu vào cột 'thuoc_menu'
    $gia=trim($_POST['gia']); // lấy giá sản phẩm gán vào biến $gia và loại bỏ khoảng trống ở 2 bên trái phải của giá sản phẩm
    if($gia==""){$gia=0;} // trường hợp không nhập giá thì giá sẽ là 0
    $ten_file_anh=$_FILES['hinh_anh']['name']; // lấy tên file ảnh từ thẻ input có name là 'hinh_anh' rồi gán vào biến $ten_file_anh
    $trang_chu=$_POST['trang_chu']; // lấy tùy chọn sản phẩm trang chủ từ thẻ select có name là 'trang_chu' rồi gán vào biến $trang_chu
    $noi_bat=$_POST['noi_bat']; // lấy tùy chọn sản phẩm nổi bật từ thẻ select có name là 'noi_bat' rồi gán vào biến $noi_bat
    $noi_dung=$_POST['noi_dung']; // lấy nội dung của sản phẩm rồi gán vào biến $noi_dung
    $noi_dung=str_replace("'","&#39;",$noi_dung); // thay thế dấu ' thành &#39; , lý do là tránh gây ra lỗi sql
    $tv_m="select max(sap_xep_trang_chu) from san_pham";
    // chuỗi truy vấn này dùng để tìm số lớn nhất của cột 'sap_xep_trang_chu'
    $tv_m_1=mysql_query($tv_m);
    $tv_m_2=mysql_fetch_array($tv_m_1); // lấy dòng dữ liệu của truy vấn tìm số lớn nhất rồi đưa vào mảng $tv_m_2
    $sap_xep_trang_chu=$tv_m_2[0]+1;
    // biến $sap_xep_trang_chu sẽ là số lớn nhất của cột 'sap_xep_trang_chu'
    // (lưu ý là phải cộng thêm 1 vì nếu không cộng thì có ít nhất 2 số trong cột 'sap_xep_trang_chu' cùng giá trị)
    if($ten!="") // chỉ thêm sản phẩm khi tên sản phẩm khác rỗng
    {
        if($ten_file_anh!="") // chỉ thêm sản phẩm khi có tải ảnh
        {
            $tv_k="select count(*) from san_pham where hinh_anh='$ten_file_anh' ";
            // chuỗi truy vấn này dùng để xác định hình ảnh tải lên có bị trùng lặp tên hay không ( where hinh_anh='$ten_file_anh'  )
            // trường hợp tên ảnh không trùng thì ô đầu tiên của dòng dữ liệu trả về sẽ có giá trị 0
            $tv_k_1=mysql_query($tv_k);
            $tv_k_2=mysql_fetch_array($tv_k_1);
            if($tv_k_2[0]==0) // chỉ thêm sản phẩm khi tên ảnh tải lên không bị trùng lặp với các tên ảnh sản phẩm cũ
            {
                $tv="
                INSERT INTO san_pham ( // câu truy vấn thêm dữ liệu thì dùng lệnh insert into , bảng san_pham sẽ được thêm dữ liệu
                id , // tên cột 'id'
                ten , // tên cột 'ten'
                gia , // tên cột 'gia'
                hinh_anh , // tên cột 'hinh_anh'
                noi_dung , // tên cột 'noi_dung'
                thuoc_menu , // tên cột 'thuoc_menu'
                noi_bat , // tên cột 'noi_bat'
                trang_chu , // tên cột 'trang_chu'
                sap_xep_trang_chu // tên cột 'sap_xep_trang_chu'
                )
                VALUES (
                NULL , // id sẽ được tăng tự động
                '$ten', // gán biến $ten vào cột 'ten'
                '$gia', // gán biến $tgia vào cột 'gia'
                '$ten_file_anh', // gán biến $ten_file_ảnh vào cột 'hinh_anh'
                '$noi_dung', // gán biến $noi_dung vào cột 'noi_dung'
                '$danh_muc', // gán biến $danh_muc vào cột 'thuoc_menu'
                '$noi_bat', // gán biến $noi_bat vào cột 'noi_bat'
                '$trang_chu', // gán biến $trang_chu vào cột 'trang_chu'
                '$sap_xep_trang_chu' // gán biến $sap_xep_trang_chu vào cột 'sap_xep_trang_chu'
                );";
                mysql_query($tv); // gửi câu truy vấn vào mysql bằng lệnh mysql_query

                 $duong_dan_anh="../hinh_anh/san_pham/".$ten_file_anh; // thư mục chứa ảnh là 'hinh_anh/san_pham' (viết ../ là để lùi về 1 thư mục)
                 move_uploaded_file($_FILES['hinh_anh']['tmp_name'],$duong_dan_anh);
                 // thực hiện tải ảnh bằng hàm move_uploaded_file , ảnh sẽ được tải từ thẻ input có name là 'hinh_anh'

                $_SESSION['danh_muc_menu']=$danh_muc;
                // gán biến session 'danh_muc_menu' có giá trị là id menu được chọn
                // việc này nhằm để lưu giữ sự lựa chọn danh mục menu cho việc tải lại trang thêm sản phẩm
                // (không bao gồm việc thoát trình duyệt web)

                $_SESSION['tuy_chon_trang_chu']=$trang_chu;
                // gán biến session 'tuy_chon_trang_chu' có giá trị là tùy chọn trang chủ của sản phẩm
                // việc này nhằm để lưu giữ sự lựa chọn tùy chọn trang chủ cho việc tải lại trang thêm sản phẩm
                // (không bao gồm việc thoát trình duyệt web)

                $_SESSION['tuy_chon_noi_bat']=$noi_bat;
                // gán biến session 'tuy_chon_noi_bat' có giá trị là tùy chọn nổi bật của sản phẩm
                // việc này nhằm để lưu giữ sự lựa chọn tùy chọn nổi bật cho việc tải lại trang thêm sản phẩm
                // (không bao gồm việc thoát trình duyệt web)

            }
            else
            {
                thong_bao_html("Hình ảnh bị trùng tên");
                // nếu ảnh trùng tên thì xuất ra thông báo "Hình ảnh bị trùng tên"
            }
        }
        else
        {
            thong_bao_html("Chưa chọn ảnh");
            // nếu chưa chọn ảnh thì xuất ra thông báo "Chưa chọn ảnh"
        }
    }
    else
    {
        thong_bao_html("Tên sản phẩm chưa được điền vào");
        // nếu tên sản phẩm chưa điền thì xuất ra thông báo "Tên sản phẩm chưa được điền vào"
    }
?>


- Sau đó mình thêm dữ liệu thì đã thấy đã thêm được sản phẩm (mình thêm Sản phẩm 2_1 ) , kết quả mình nhận được :



- Khi mình không điền tên sản phẩm thì sẽ nhận được thông báo "Tên sản phẩm chưa được điền vào"; Khi mình không tải ảnh sản phẩm thì sẽ nhận được thông báo "Chưa chọn ảnh".Khi ảnh tải lên trùng tên với ảnh cũ thì sẽ nhận được thông báo "Hình ảnh bị trùng tên".Sản phẩm sẽ hiển thị ra trang chủ khi tùy chọn 'Trang chủ' là 'Có'.Sản phẩm sẽ hiển thị ra phần nổi bật khi tùy chọn 'Nổi bật' là 'Có'

- Khi bạn thực hiện gửi biểu mẫu thêm sản phẩm thì web sẽ chạy file 'xu_ly_post_get.php' , lúc này sẽ tồn tại biến $_POST['bieu_mau_them_san_pham'] , từ đó file 'xu_ly_post_get.php' sẽ gọi file  'them_san_pham_vao_csdl.php' ( để xử lý thêm sản phẩm ) bằng đoạn code sau :

if(isset($_POST['bieu_mau_them_san_pham']))
{
    include("chuc_nang/san_pham/them_san_pham_vao_csdl.php");
    trang_truoc_html();
}

- File 'them_san_pham_vao_csdl.php' sẽ thực hiện thêm dữ liệu vào bảng 'san_pham' bằng lệnh insert nếu như tên sản phẩm được điền vào