Bài viết [PHP] - Xây dựng giỏ hàng cho website bán hàng

Thảo luận trong 'PHP' bắt đầu bởi white.smut, 27 Tháng mười một 2013.

  1. Offline

    white.smut

    • Administrator

    • Loading: |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 99% Completed - Error: Disconnected. Please try again!
    Số bài viết:
    842
    Đã được thích:
    425
    Điểm thành tích:
    450
    Đây là code mình tự viết nên chắc chưa tối ưu, có ý kiến gì thì các bạn comment bên dưới nhé!

    Bước 1: connection.php - kết nối cơ sở dữ liệu
    PHP:

    <?php
    $connect 
    mysql_connect("localhost""root""") or
        die (
    "Không kết nói được CSDL");
    mysql_select_db ("sanpham");
    mysql_query("set names utf8");
    ?>
    Bước 2: index.php - nhận tham số và include ra trang yêu cầu
    PHP:

    <?php
    /**
    * WRITER: white.smut
    * FORUM: 2mit.org
    * CONTACT: jsK.txt@gmail.com
    * CODE: cart
    */
    session_start();
    require(
    'connection.php');
    ?>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>GIỎ HÀNG</title>
    </head>
    <body>
    <div align='center'>
    <h1><a href='http://2mit.org'>DIỄN ĐÀN 2MIT.ORG</a></h1></br>
    <?php
    if (isset($_GET['menu']))
    {
    switch(
    $_GET['menu'])
    {
    case 
    "them":
    include(
    "them.php");
    break;
    case 
    "cart":
    include(
    "giohang.php");
    break;
    case 
    "xoa":
    include(
    "xoa.php");
    break;
    case 
    "thanhtoan":
    include(
    "thanhtoan.php");
    break;
    case 
    "admin":
    include(
    "admin.php");
    break;
    }
    }
    else
    include (
    'sanpham.php');
    ?>
    </div>
    Bước 3: sanpham.php - liệt kê danh sách sản phẩm
    PHP:

    <table width="900px" border="1px" style="margin-top:6px">
    <tr bgcolor="#ccc" align="center">
    <td width="100px"><b>Hình ảnh</b></td>
    <td width="100px"><b>Tên</b></td>
    <td width="100px"><b>Giá</b></td>
    <td width="100px"><b>Thêm</b></td>
    </tr>
    <?php
    $sql 
    "select * from sanpham";
    $kq mysql_query($sql);
    while(
    $row=mysql_fetch_assoc($kq))
    {
    ?>
    <tr>
    <td align="center">
    <img src="<?php echo "images/sanpham/".$row['hinhsp']; ?>" width="90px" height="90px" border="0"/>
    </td>
    <td align="left" >
    <?php echo $row['tensp']; ?>
    </td>
    <td align="left" >
    <?php echo $row['giasp']; ?>
    </td>
    <td align="center">
    <a href="?menu=them&id=<?php echo $row['idsp'];?>"> Thêm </a>
    </td>
    </tr>
    <?php
    }
    Bước 4: them.php - hiển thị sản phẩm để thêm vào giỏ hàng
    PHP:

    <?php
    $id
    =$_REQUEST['id'];
    $query "SELECT * FROM sanpham WHERE idsp='$id'";
    $results mysql_query($query)
        or die(
    mysql_error());
    $row mysql_fetch_array($results);
    extract ($row);
    ?>
    <table width='500' cellpadding = '5'>
        <tr>
    <?php
        
    echo "<td><img src='images/sanpham/$hinhsp' width=150 height=150/></td>";
        echo 
    "<td>";
        echo 
    "<b>Tên sản phẩm:</b> $tensp";
        echo 
    "<br><br>";
        echo 
    "<b>Giá:</b> $giasp";
        echo 
    "<br>";
    ?>
        </tr>
     
    <tr>
    <td>
    <form method="POST" action="">
    Số lượng:
    <input type="text" name="sl_them" value="1" size="2">
    <input type="hidden" name="idsp" value="<?php echo $idsp?>">
    <input type="hidden" name="tensp" value="<?php echo $tensp?>">
    <input type="hidden" name="hinhsp" value="<?php echo $hinhsp?>">
    <input type="hidden" name="giasp" value="<?php echo $giasp?>">
    <input type="submit" name="them" value="Thêm vào giỏ hàng">
    </form>
    </td>
        </tr>
    </table>
    <?php
    if (isset($_POST['them']))
    {
    $sl_them=$_POST['sl_them']; // lay so luong san pham
    $idsp $_POST['idsp']; // lay id san pham
    $tensp $_POST['tensp']; // lay ten san pham
    $hinhsp $_POST['hinhsp']; // lay hinh san pham
    $giasp $_POST['giasp']; // lay gia san pham
    $sess =session_id();  // lay session id cua nguoi dung
     
    $query "INSERT INTO giohang (iduser,idsp,sl,tensp,hinhsp,giasp)
              VALUES ('
    $sess','$idsp','$sl_them','$tensp','$hinhsp','$giasp')";
    if (
    $query)
    echo 
    "Thêm thành công";
    header('location: ?menu=cart');
    $results mysql_query($query)
        or die(
    mysql_error());
     
    }
    ?>
    <a href="?menu=cart">Xem giỏ hàng</a><br>
    <a href="index.php">Trang chủ</a>
    Bước 5: giohang.php - liệt kê danh sách có trong giỏ hàng
    PHP:

    <?php
    $sessid 
    session_id();
    $tong=0;
    ?>
    <table border="1" align="center" cellpadding="5">
          <tr bgcolor='#ccc'>
              <td>Số lượng</td>
              <td>Hình ảnh</td>
              <td>Tên sản phẩm</td>
              <td>Giá mỗi sản phẩm</td>
              <td>Tổng giá</td>
              <td>Thay đổi số lượng</td>
              <td>Xóa sản phẩm</td>
          <tr>
    <?php
      $prod 
    "SELECT * FROM giohang WHERE  iduser='$sessid'";
      
    $prod2 mysql_query($prod);
    while(
    $prod3=mysql_fetch_assoc($prod2))
    {
    echo 
    "<td>";
    echo 
    $prod3['sl'];
    echo 
    "</td>";
    echo 
    "<td>";
    echo 
    "<img src='images/sanpham/".$prod3['hinhsp']."' width=30 height=30/></td></a>";
    echo 
    "<td>";
    echo 
    $prod3['tensp'];
    echo 
    "</td>";
    echo 
    "<td align='right'>";
    echo 
    $prod3['giasp'];
    echo 
    "</td>";
    echo 
    "<td align='right'>";
    echo 
    $gia=$prod3['giasp'] * $prod3['sl'];
    echo 
    "</td>";
    echo 
    "<td>";
    echo 
    "<form action='' method='POST'>
    <input tyle='text' name='tdsl' size='2'><br>
    <input type='hidden' name='id' value='"
    .$prod3['id']."'>
    <input type='submit' name='thaydoi' value='Thay đổi số lượng'>
    </form></td>"
    ;
    echo 
    "<td>";
    echo 
    "<a href='?menu=xoa&id=".$prod3['id']."'>Xóa</a>";
    echo 
    "</td>";
    echo 
    "</tr>";
    $tong=$tong+$gia;
    }
    ?>
    <?php
    if (isset($_POST['thaydoi']))
    {
    $tdsl=$_POST['tdsl'];
    $id=$_POST['id'];
    $query "UPDATE giohang SET sl='$tdsl' WHERE id='$id'";
    $results mysql_query($query)
    or die(
    mysql_error());
    echo 
    "Số lượng đã được thay đổi<br>";
    echo 
    "<a href='?menu=cart'>Cập nhật lại giỏ hàng</a><br>'";;
    }
    ?>
    <tr bgcolor='#ccc'>
    <td colspan='4' align='right'>
    Tổng hóa đơn:
    </td>
    <td align='right'>
    <?php echo $tong;?>
    </td>
    <td colspan='2'></td>
    </tr>
    </table>
    <form method="POST" action="?menu=thanhtoan">
    <input type='submit' name='thanhtoan' value='THANH TOÁN'>
    </form>
    </br>
    <a href="index.php">Trở về trang chủ</a>
    Bước 6: xoa.php - xóa sản phẩm trong giỏ hàng
    PHP:

    <?php
    $key
    =$_GET["id"];
    $xoa="delete from giohang where id='$key'";
    $tt=mysql_query($xoa);
    if(
    $tt)
    {
    header('location: ?menu=cart');
    }
    else 
    "Xóa không thành công!";
    ?>
    Bước 7: thanhtoan.php - gửi đơn hàng đến cơ sở dữ liệu
    PHP:

    <?php
    $sessid 
    session_id();
    ?>
    <form method="post" action="">
    <table>
        <tr>
    <td colspan="2" bgcolor="#000" height="50px">
    <div align="center">
    <font size="3" color="#fff">
    THÔNG TIN HÓA ĐƠN
    </font>
    </div>
    </td>
        </tr>
        <tr>
    <td>
    Họ tên người mua
    </td>
    <td>
    <input type="text" name="name_mua" size="25">
    </td>
        </tr>
        <tr>
    <td>
    Họ tên người nhận
    </td>
    <td>
    <input type="text" name="name_nhan" size="25">
    </td>
        </tr>
        <tr>
    <td>
    Địa chỉ người mua
    </td>
    <td>
    <textarea name="add_mua"></textarea>
    </td>
        </tr>
        <tr>
    <td>
    Địa chỉ người nhận
    </td>
    <td>
    <textarea name="add_nhan"></textarea>
    </td>
        </tr>
        <tr>
    <td>
    SĐT người mua
    </td>
    <td>
    <input type="text" name="phone_mua" size="25" maxlength="12">
    </td>
        </tr>
        <tr>
    <td>
    SĐT người nhận
    </td>
    <td>
    <input type="text" name="phone_nhan" size="25" maxlength="12">
    </td>
        </tr>
        <tr>
    <td>
    Email
    </td>
    <td>
    <input type="text" name="email"  size="25">
    </td>
        </tr>
    <tr>
    <td colspan="2" height="50px">
    <div align="center">
    <form action="" method="POST">
    <input type="submit" name="gui" value="GỬI ĐƠN HÀNG">
    <form>
    </div>
    </td>
        </tr>
    </table>
    <?php
    if (isset($_POST['gui']))
    {
    $name_mua $_POST['name_mua'];
    $name_nhan $_POST['name_nhan'];
    $add_mua $_POST['add_mua'];
    $add_nhan $_POST['add_nhan'];
    $email $_POST['email'];
    $phone_mua $_POST['phone_mua'];
    $phone_nhan $_POST['phone_nhan'];
    //viết điều kiện yêu cầu  nhập tất cả các thông tin
    $hoadon "INSERT INTO hoadon (iduser,name_mua,name_nhan,add_mua,add_nhan,phone_mua,phone_nhan,email) VALUES ('$sessid','$name_mua','$name_nhan','$add_mua','$add_nhan','$phone_mua','$phone_nhan','$email')";
    $tb1 mysql_query($hoadon);
    $dathang "SELECT * FROM giohang WHERE iduser='$sessid'";
    $dathang1 mysql_query($dathang);
    while(
    $dathang3=mysql_fetch_assoc($dathang1))
    {
    $id $dathang3['id'];
    $tensp $dathang3['tensp'];
    $sl $dathang3['sl'];
    $copy "INSERT INTO dathang (iduser,tensp,sl) values('$sessid','$tensp','$sl')";
    $tb2 mysql_query($copy);
    $xoa "DELETE FROM giohang WHERE id='$id'";
    $tb3 mysql_query($xoa);
    }
    if ((
    $tb1)&&($tb2)&&($tb3))
    {
    echo 
    "Đặt hàng thành công";
    header('location: ?menu=admin');
    }
    }
    ?>
    Bước 8: admin.php - xem tất cả các đơn đặt hàng của khách hàng (dành cho admin)
    PHP:

    <strong>CÁC ĐƠN ĐẶT HÀNG</strong></br></br>
    <?php
    $sql 
    "select * from hoadon";
    $kq mysql_query($sql);
    while(
    $row=mysql_fetch_assoc($kq))
    {
    echo 
    "<table border='1' align='center' width='800px'>";
    echo 
    "<tr height='50px' bgcolor='#bbb'>";
    echo 
    "<td colspan='3' align='center'><strong>NGƯỜI MUA</strong></td>";
    echo 
    "<td colspan='3' align='center'><strong>NGƯỜI NHẬN</strong></td>";
    echo 
    "</tr>";
    echo 
    "<tr>";
    echo 
    "<td align='center'><strong>TÊN</strong></td>";
    echo 
    "<td align='center'><strong>SĐT</strong></td>";
    echo 
    "<td align='center'><strong>ĐỊA CHỈ</strong></td>";
    echo 
    "<td align='center'><strong>TÊN</strong></td>";
    echo 
    "<td align='center'><strong>SĐT</strong></td>";
    echo 
    "<td align='center'><strong>ĐỊA CHỈ</strong></td>";
    echo 
    "</tr>";
    echo 
    "<tr>";
    echo 
    "<td>".$row['name_mua']."</td>";
    echo 
    "<td>".$row['phone_mua']."</td>";
    echo 
    "<td>".$row['add_mua']."</td>";
    echo 
    "<td>".$row['name_nhan']."</td>";
    echo 
    "<td>".$row['phone_nhan']."</td>";
    echo 
    "<td>".$row['add_nhan']."</td>";
    echo 
    "</tr>";
    echo 
    "<tr bgcolor='#ccc'>";
    echo 
    "<td colspan='3' align='center'><strong>TÊN SẢN PHẨM</strong></td>";
    echo 
    "<td colspan='3' align='center'><strong>SỐ LƯỢNG</strong></td>";
    echo 
    "</tr>";
    $xem "SELECT * FROM dathang";
    $xem1 mysql_query($xem);
    while(
    $xem2=mysql_fetch_assoc($xem1))
    {
    if (
    $row['iduser']==$xem2['iduser'])
    {
    echo 
    "<tr>";
    echo 
    "<td colspan='3'>".$xem2['tensp']."</td>";
    echo 
    "<td colspan='3'>".$xem2['sl']."</td>";
    echo 
    "</tr>";
     
    }
    }
    echo 
    "</table>";
    echo 
    "</br>";
    }
    ?>
    NGUYÊN TẮC CODE:
    - Code dựa trên id của session khi truy cập vào trang web, biến $sessid sẽ lưu lại id và được gửi đến csdl.
    - Khi thêm sản phẩm vào giỏ hàng, $sessid sẽ đi kèm với thông tin sản phẩm để lưu vào giohang trong csdl.
    - Khi đã liệt kê đủ các sản phẩm trong giohang, thì chuyển sang trang thanhtoan.php, ở trang này lưu các tên và số lượng các sản phẩm kèm theo $sessid vào dathang trong csdl, và xóa các trường có cùng 1 $sessid trong giohang, đồng thời gửi toàn bộ thông tin của người mua tới hoadon trong csdl.
    - Liệt kê các đơn đặt hàng được lấy thông tin từ hoadon và dathang trong csdl.

    Các bạn download code về chỉnh sửa nhé!
    Mọi thắc mắc bạn có thể comment phía dưới hoặc email cho mình: jsK.txt@gmail.com
    Chúc các bạn thành công!

    Các file đính kèm:

    • cart.rar
      Kích thước:
      196,2 KB
      Đọc:
      106
  2. Offline

    SPD

    • Windows 98

    • Ngông cuồng, ngang tàng, phách lối
    Số bài viết:
    225
    Đã được thích:
    83
    Điểm thành tích:
    190
    Mình thấy code này có vấn đề là khi đóng trình duyệt thì giỏ hàng sẽ không tự xóa được. Bạn nên dùng session thay cho table giohang để khắc phục điều này
    Thứ hai là thay vì dùng session_id bạn có thể dùng guid, với cách này thì khả năng bị trùng thấp hơn
    code tạo guid nè
    PHP:
    <?php
    function guid(){
        if (
    function_exists('com_create_guid')){
            return 
    com_create_guid();
        }else{
            
    mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
            
    $charid strtoupper(md5(uniqid(rand(), true)));
            
    $hyphen chr(45);// "-"
            
    $uuid chr(123)// "{"
                    
    .substr($charid08).$hyphen
                    
    .substr($charid84).$hyphen
                    
    .substr($charid,124).$hyphen
                    
    .substr($charid,164).$hyphen
                    
    .substr($charid,20,12)
                    .
    chr(125);// "}"
            
    return $uuid;
        }
    }
    $sessid guid();
    ?>
    hongoctrienwhite.smut thích bài này.
  3. Offline

    white.smut

    • Administrator

    • Loading: |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 99% Completed - Error: Disconnected. Please try again!
    Số bài viết:
    842
    Đã được thích:
    425
    Điểm thành tích:
    450
    Đúng là code trên khi đóng trình duyệt thì không xóa được giỏ hàng.
    Dùng session thì quá ok rồi. mới học PHP nên cũng chưa biết nhiều. chỉ là tạm bợ thôi.

    Thử code lại cho tối ưu hơn đã :D cảm ơn đã góp ý nhé!
    SPD thích bài này.
  4. Offline

    SPD

    • Windows 98

    • Ngông cuồng, ngang tàng, phách lối
    Số bài viết:
    225
    Đã được thích:
    83
    Điểm thành tích:
    190
    không có chi, hồi trước làm đồ án tốt nghiệp cũng bị hỏi câu tương tự như thế đó
  5. Offline

    white.smut

    • Administrator

    • Loading: |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 99% Completed - Error: Disconnected. Please try again!
    Số bài viết:
    842
    Đã được thích:
    425
    Điểm thành tích:
    450
    Vậy anh học khóa 4 à?. Nếu anh có đồ án lập trình web thì share lên diễn đàn em với nge!
  6. Offline

    hongoctrien

    • Friends

    Số bài viết:
    2.449
    Đã được thích:
    2.464
    Điểm thành tích:
    2.431
    Lão ni, kêu comment ở dưới, người ta chưa kịp nói gì đã đóng chủ đề rồi =))
    Lần đầu tiên thấy lưu giỏ hàng mà lưu thẳng vào CSDL. ;;). Nhắc đến giỏ hàng là nhắc ngay đến SESSION rồi :)
  7. Offline

    white.smut

    • Administrator

    • Loading: |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 99% Completed - Error: Disconnected. Please try again!
    Số bài viết:
    842
    Đã được thích:
    425
    Điểm thành tích:
    450
    Thấy cô share code lưu ở trong csdl, nên em không xem code mà từ đó làm lun.. :)
  8. Offline

    SPD

    • Windows 98

    • Ngông cuồng, ngang tàng, phách lối
    Số bài viết:
    225
    Đã được thích:
    83
    Điểm thành tích:
    190
    hongoctrienwhite.smut thích bài này.

Chia sẻ trang này

Advertising: Linux system admin | nukeviet | nukeviet 4 | Upload ảnh miễn phí