Xử lý giỏ hàng bằng Session trong PHP

Từ trước đến nay, bài toán xử lý giỏ hàng cho trang web bán hàng là một trong những bài toán cơ bản nhất. Với nhiều bạn lập trình viên mới vào nghề, đây là 1 trong những chức năng bắt buộc bạn phải “code tay” thành thạo. Hôm nay chúng tôi sẽ hướng dẫn các bạn cách xử lý giỏ hàng bằng Session của PHP.

Xây dựng chức năng giỏ hàng với Session trong PHP
Xây dựng chức năng giỏ hàng với Session trong PHP

Tạo giao diện mẫu

Tạo 1 giao diện form mua hàng bằng html css. Ở đây chúng ta sẽ tạo giỏ hàng cho trang bán hoa. Tôi đặt tên cho nó là “muahoa.php”. Bên dưới đây tôi đã code sẵn, bạn có thể copy giao diện của tôi để có thể test thử chức năng này. Bạn cũng có thể làm lại 1 trang giao diện tốt hơn và đẹp hơn của tôi.

<html>
<head>
<title>Bài tập 6</title>
<meta charset=”utf-8″ />
<style>
body{
width: 500px;
margin: 20px auto;
}
h4{
background-color: #00A19C;
padding: 10px;
margin-bottom: 0px;
color: white;
}
div{
background-color: #C7EEEB;
padding: 5px;
}
</style>
</head>
<body>
<form action=”” method=”post”>
<h4>Mua hoa</h4>
<div>
<p><label>ID hoa: </label><input type=”text” name=”id” value=””></input></p>
<p><label>Tên hoa: </label><input type=”text” name=”ten” value=””></input></p>
<p><label>Số lượng: </label><input type=”number” name=”soluong” value=””></input></p>
<p><label>Giá:</label><input type=”number” name=”gia” value=””></input></p>
<input type=”submit” name=”submit” value=”Mua hoa”></input>
</div>
</form>
</body>
</html>

Sử dụng Session trong PHP để xây dựng chức năng giỏ hàng

Thêm mở đầu và kết thúc Session trong HTML

Để sử dụng session trong php và sử dụng header location để chuyển hướng chúng ta cần thêm 1 số thuộc tính sau:

  • Tại đầu trang muahoa.php chúng ta sẽ thêm đoạn code sau:

<?php
session_start();  //Session có thể sử dụng sau khi chèn đoạn này
ob_start();  //Sử dụng được hàm header();
?>

  • Tại cuối trang muahoa.php chúng ta sẽ chèn đoạn code:

<?php
ob_end_flush();
?>

Như vậy là chúng ta đã setup thành công bước đầu tiên trong việc sử dụng session và header cho bài toán giỏ hàng.

Validate dữ liệu truyền vào

Tiếp theo chúng ta sẽ validate dữ liệu và viết code PHP post dữ liệu truyền vào session

<?php
if(isset($_POST[‘submit’])){
$id = $_POST[‘id’];
$tenhoa = $_POST[‘ten’];
$soluong = $_POST[‘soluong’];
$gia = $_POST[‘gia’];
if(!isset($_SESSION[‘arMuaHoa’][$id])){
$_SESSION[‘arMuaHoa’][$id] = array(
‘tenhoa’ => $tenhoa,
‘soluong’ => $soluong,
‘gia’ => $gia
);
}else{
$_SESSION[‘arMuaHoa’][$id][‘soluong’] += $soluong;
}
header(‘location:basket.php’);
}
?>

Giải thích về đoạn code trên, sau khi chúng ta Post được các trường id, ten, soluong, gia thì chúng ta bắt đầu kiểm tra

  • Nếu chưa tồn tại hoa có id này thì bắt đầu tạo mới $_SESSION[‘arMuaHoa’][$id]
  • Nếu đã tồn tại hoa có id này rồi(trong giỏ hàng đã có loại như thế này) thì chúng ta sẽ cộng số lượng vào và chuyển hướng mà không quan tâm những trường khác.

Giải thích về tại sao chúng ta không cần quan tâm những trường khác bởi vì ở đây chúng ta không sử dụng cơ sở dữ liệu, khi chúng ta sử dụng cơ sở dữ liệu, bảng hoa sẽ có khóa chính(primary key) không trùng nhau, vì vậy để phân biệt các loại hoa chúng ta chỉ cần id.

Tạo thêm 1 trang kết quả của giỏ hàng

Tiếp theo, chúng ta sẽ tạo 1 trang basket.php có table để hiển thị những hoa mà chúng ta đã cho vào giỏ hàng.

Xây dựng chức năng giỏ hàng với Session trong PHP
Xây dựng chức năng giỏ hàng với Session trong PHP

Ở file basket.php chúng ta sẽ code 1 giao diện hiển thị giỏ hoa chúng ta đã thêm vào

<?php
     session_start();
     ob_start();
?>
<html>
  <head>
         <title>Bài tập 6</title>
         <meta charset=”utf-8″ />
  </head>
  <body>
         <h1>Trang basket</h1>
         <table border=”1″>
             <tr>
                <th>Tên sản phẩm</th>
                <th>Số lượng</th>
                <th>Giá</th>
                <th>Thành tiền</th>
             </tr>
             <tr>
                 <td></td>
                 <td></td>
                 <td></td>
                 <td></td>
              </tr>
         </table>
         <a href=”muahoa.php”>Quay lại</a>
   </body>
</html>
<?php
     ob_end_flush();
?>
Các thẻ <tr></tr> bọc thẻ <td></td> là chỗ mà chúng ta cần lặp dữ liệu ra để hiển thị hoa và giá tiền.
<?php
if(!$_SESSION[‘arMuaHoa’]){
header(‘location:muahoa.php’);
}
// Nếu chưa có hoa nào thì chúng ta sẽ quay về trang muahoa.php
$tongTien = 0;
foreach($_SESSION[‘arMuaHoa’] as $hoa){
$thanhTien = $hoa[‘gia’] * $hoa[‘soluong’];
$tongTien += $thanhTien;
?>
//Vòng lặp mảng session arMuaHoa ra biến hoa
<tr>
<td><?php echo “<a href=”>$hoa[tenhoa]</a>”;?></td>
<td><?php echo $hoa[‘soluong’];?></td>
<td><?php echo number_format($hoa[‘gia’], 0, “,”,”.”);?> VND</td>
<td><?php echo number_format($thanhTien, 0, “,”,”.”);?> VND</td>
</tr>
<?php
}
?>
// Tính ra tổng tiền
<tr>
<td colspan=”4″ align=”right”>Tổng tiền: <?php echo number_format($tongTien, 0, “,”,”.”);?> VND</td>
</tr>
Như vậy là chúng ta đã setup xong 1 ví dụ về giỏ hàng, chúng ta bắt đầu testing nào.

Kiểm tra chức năng giỏ hàng bằng Session PHP

B1: Nhập dữ liệu mẫu lần 1

giỏ hàng với Session trong PHP
Nhập 1 hoa đầu tiên và nhấn mua hoa
B2: Có kết quả dữ liệu mẫu lần 1
giỏ hàng với session trong PHP
Tiếp tục nhấn vào quay lại để mua thêm
B3: Nhập dữ liệu mẫu lần 2 khác lần 1
giỏ hàng với session trong PHP
Chúng ta tiếp tục đặt hoa thứ 2
B4: Kiểm tra kết quả dữ liệu mẫu 2 lần nhập t
giỏ hàng php
Kết quả dữ liệu mẫu 2 lần nhập
B5: Nhập dữ liệu mẫu lần 3 có cùng ID với dữ liệu mẫu lần 1
Cuối cùng chúng ta sẽ thử mua 1 hoa có ID = 1 giống như hoa hồng nhưng tôi sẽ điền vào các ô input id hoa = 1, ô số lượng = 1 và các ô còn lại có giá trị bất kì.
giỏ hàng php
Submit xem nào!!!
B6: Xem kết quả
 – Nếu kết quả của bạn có được giống như hình ảnh của chúng tôi thì xem như bạn đã thành công trong việc xây dựng chức năng giỏ hàng bằng Session trong PHP.
giỏ hàng trong php
Kết quả cuối cùng
Mặc định code của mình chỉ kiểm tra ID, nếu đã tồn tại ID thì số lượng = số lượng có sẵn + số lượng mới thêm và không quan tâm để các thuộc tính khác như tên và giá.
Nhìn chung đây là 1 trong nhiều cách rất phổ biến để xử lý giỏ hàng với trang web bán hàng, với cách này chúng ta có thể dễ dàng tương tác với cơ sở dữ liệu.
Ngoài ra, chúng ta còn có thể kết hợp ajax để khi thêm sản phẩm vào giỏ hàng, trang web của chúng ta sẽ không bị load lại hay chuyển hướng