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

Phần 51 - Làm phần xử lý sửa sản phẩm

- Tiếp theo là làm tiếp phần sửa sản phẩm ở trong bảng 'san_pham'.Bạn tạo file 'sua_san_pham_o_trong_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);
    $gia=trim($_POST['gia']);
    $trang_chu=$_POST['trang_chu'];
    $noi_bat=$_POST['noi_bat'];
    $noi_dung=$_POST['noi_dung'];
    $noi_dung=str_replace("'","&#39;",$noi_dung);
    $ten_file_anh_tai_len=$_FILES['hinh_anh']['name'];
    if($ten_file_anh_tai_len!="")
    {
        $ten_file_anh=$ten_file_anh_tai_len;
    }
    else
    {
        $ten_file_anh=$_POST['ten_anh'];
    }
    $id=$_GET['id'];
    if($ten!="")
    {
        $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 or $ten_file_anh_tai_len=="")
        {
            $tv="
            UPDATE san_pham SET
            ten = '$ten',
            gia = '$gia',
            hinh_anh = '$ten_file_anh',
            noi_dung = '$noi_dung',
            trang_chu = '$trang_chu',
            noi_bat = '$noi_bat'
            WHERE id =$id;
            ";
            mysql_query($tv);
         
            if($ten_file_anh_tai_len!="")
            {             
                $duong_dan_anh="../hinh_anh/san_pham/".$ten_file_anh_tai_len;
                move_uploaded_file($_FILES['hinh_anh']['tmp_name'],$duong_dan_anh);
                $duong_dan_anh_cu="../hinh_anh/san_pham/".$_POST['ten_anh'];
                unlink($duong_dan_anh_cu);
            }
             
        }
        else
        {
            thong_bao_html("Hình ảnh bị trùng tên");
        }
    }
    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 'sua_san_pham_o_trong_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 sửa 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 sửa dữ liệu , với cách viết câu truy vấn sửa dữ liệu như bên dưới thì sẽ xảy ra lỗi 
    // khi sửa dữ liệu mà tên sản phẩm có dấu ' nên cần có sự thay thế này
    $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
    $trang_chu=$_POST['trang_chu']; // lấy tùy chọn trang chủ rồi gán vào biến $trang_chu
    $noi_bat=$_POST['noi_bat']; // lấy tùy chọn nổi bật 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
    $ten_file_anh_tai_len=$_FILES['hinh_anh']['name']; // lấy tên file ảnh tải lên
    if($ten_file_anh_tai_len!="") // trường hợp tên file ảnh tải lên khác rỗng
    {
        $ten_file_anh=$ten_file_anh_tai_len;
        // trường hợp tên file ảnh tải lên khác rỗng thì tên file ảnh sửa vào csdl sẽ là tên file ảnh tải lên ( $ten_file_anh_tai_len )  
    }
    else
    {
        $ten_file_anh=$_POST['ten_anh'];
        // trường hợp tên file ảnh tải lên bằng rỗng thì tên file ảnh sửa vào csdl sẽ là tên file ảnh nằm trong thẻ input ẩn ( type="hidden" )  
    }
    $id=$_GET['id']; // lấy biến 'id' trên url (cũng là id sản phẩm cần sửa)
    if($ten!="") // đây là trường hợp tên sản phẩm không bỏ trống , lúc này biến $ten sẽ khác rỗng
    {
        $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 or $ten_file_anh_tai_len=="")
       // chỉ sửa 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ũ hoặc vào lúc không tải ảnh
        {
            $tv="
            UPDATE san_pham SET // câu truy vấn sửa dữ liệu thì dùng lệnh update , bảng san_pham sẽ được cập nhật dữ liệu
            ten = '$ten', // cột 'ten' sẽ được cập nhật lại với nội dung là của biến $ten
            gia = '$gia', // cột 'gia' sẽ được cập nhật lại với nội dung là của biến $gia
            hinh_anh = '$ten_file_anh', // cột 'hinh_anh' sẽ được cập nhật lại với nội dung là của biến $ten_file_anh
            noi_dung = '$noi_dung', // cột 'noi_dung' sẽ được cập nhật lại với nội dung là của biến $noi_dung
            trang_chu = '$trang_chu', // cột 'trang_chu' sẽ được cập nhật lại với nội dung là của biến $trang_chu
            noi_bat = '$noi_bat' // cột 'noi_bat' sẽ được cập nhật lại với nội dung là của biến $noi_bat
            WHERE id =$id;
            // dòng dữ liệu cập nhật sẽ là dòng mà cột 'id' của dòng đó có giá trị là biến 'id' trên url (tức là id của sản phẩm đang được sửa)
            ";
            mysql_query($tv); // gửi câu truy vấn vào mysql bằng lệnh mysql_query
         
            if($ten_file_anh_tai_len!="") // trường hợp có tải ảnh
            {             
                $duong_dan_anh="../hinh_anh/san_pham/".$ten_file_anh_tai_len;
                // tạo đường dẫn ảnh tải lên (ảnh tải lên trong thư mục 'hinh_anh/san_pham' , cách ghi ../ 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'
                $duong_dan_anh_cu="../hinh_anh/san_pham/".$_POST['ten_anh'];
                // tạo đường dẫn ảnh cũ
                unlink($duong_dan_anh_cu);
                // xóa ảnh cũ
            }
             
        }
        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("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 sửa dữ liệu của Sản phẩm 2_1 (sửa thành Sản phẩm 2_2 ) thì thấy đã sửa được , 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 tải ảnh trùng tên ảnh cũ thì sẽ nhận được thông báo "Hình ảnh bị trùng tên"

- Khi bạn thực hiện gửi biểu mẫu sửa 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_sua_san_pham'] , từ đó file 'xu_ly_post_get.php' sẽ gọi file  'sua_san_pham_o_trong_csdl.php' ( để xử lý sửa dữ liệu sản phẩm ) bằng đoạn code sau :

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

- File 'sua_san_pham_o_trong_csdl.php' sẽ thực hiện sửa dữ liệu trong bảng 'san_pham' bằng lệnh update nếu như không bỏ trống tên sản phẩm