Các bản tin khác
- Bài 19: Viết ứng dụng tạo giỏ hàng - shopping cart - phần 1
- Bài 18: Xây dựng ứng dụng tạo trang upload nhiều hình ảnh
- Bài 17: Xây dựng hệ thống bình chọn bằng PHP và MYSQL
- Bài 16: Viết ứng dụng đếm số người online bằng php
- Bài 15: Viết ứng dụng tạo mã xác nhận bằng PHP
- Bài 14: viết ứng dụng sửa xóa thành viên bằng PHP và MYSQL
- Bài 13: Viết ứng dụng quản lý thành viên bằng PHP và MYSQL
- Bài 12: Viết ứng dụng thêm thành viên bằng PHP và MYSQL
- Bài 11: Viết ứng dụng đăng nhập bằng PHP và MYSQL
- Bài 10: Kết hợp PHP và MYSQL trong ứng dụng website
Lập Trình PHP Căn Bản
Bài 20: Viết ứng dụng tạo giỏ hàng - shopping cart - phần 2
Ở phần 1 tôi đã trình bày phần hiển thị thông tin sách có trong cơ sở dữ liệu, chu trình thực thi của việc thêm một quyển sách vào giỏ hàng. Và cơ chế quản lý giỏ hàng của chúng ta như thế nào. Tiếp tục với phần 2, tôi sẽ trình bày cách quản lý giỏ hàng như chỉnh sửa món hàng, liệt kê hàng hóa trong giỏ hàng và xóa bỏ từng món hàng hay cả giò hàng như thế nào. Để có thể hiểu được phần 2. Các bạn vui lòng xem lại bài 19: Viết ứng dụng tạo giỏ hàng – shopping cart – phần 1.
Phần 2: Xây dựng hệ thống quản lý giỏ hàng.
Sau khi đã thêm một món hàng, tại giỏ hàng ta cũng cần phải xử lý để hiển thị các món hàng đã có trong giỏ. Và như phương pháp ở phần 1, chúng ta tạm lưu mã sách trong session. (xem lại Bài 7: Khái niệm cơ bản về Cookie và session trong PHP) . Vậy ở trang giỏ hàng này, ta sẽ khởi tạo session và sử dụng vòng lặp duyệt mảng foreach để lặp toàn bộ mã sách đang lưu trong session. Tiếp tục, ta lại chuyển chúng sang dạng chuỗi bằng hàm implode().
Giả sử lúc này chuỗi của chúng ta sẽ có dạng 7,8,9. Công việc tiếp theo là kết nối CSDL để liệt kê các sản phẩm có mã như ở trên. (xem lại bài 10: kết hợp php & mysql trong ứng dụng website). Thay vì sử dụng select * from tên_bảng where id= ??. Thì để tối ưu hơn, tôi sẽ sử dụng phép in trong SQL. Lúc này câu truy vẫn sẽ tương đương:
Tiếp tục, ta lặp toàn bộ thông tin sách bao gồm tên, tác giả, giá tiền và cả số lượng mà ta đã lưu trong session là $_SESSION['cart'][ 'ID_Món_Hàng']. ID_Món_hàng chính là thông tin ta lặp ra từ CSDL ($row[id]).
Bên cạnh đó tại phần số lượng, ta sẽ đưa giá trị lưu ở session ra textbox (vì tại giỏ hàng, người dùng được phép điều chỉnh số lượng, nên lúc này ta cần tạo textbox cho họ điều chỉnh). Vì lặp toàn bộ các quyển sách nên tại tên tên của textbox số lượng ta cũng cần truyền id để nhận biết số lượng đó thuộc ID của quyển sách nào.
Chúng ta cũng cho người dùng được phép xóa 1 món hàng nào đó ra khỏi giỏ hàng của họ. Bằng cách truyền mã quyển sách của từng quyển vào liên kết delcart.php.
Tại đây, ta cũng cần tính luôn giá tiền của từng quyển sách tương ứng với số lượng mà họ đã chọn. Như vậy, số lượng là phần ta lưu ở session, còn giá tiền là phần ta lấy ra từ CSDL ứng với mảng $row ($row['price']).
Sau cùng, ta cần tính tổng tiền của toàn bộ sản phẩm có trong giỏ hàng. Bằng cách cộng dồn tổng giá tiền của từng món.
Phần còn lại, là chúng ta hiển thị giá tiền với đúng định dạng VND của Việt Nam.
Đồng thời, ta cũng tạo nút cho phép người dùng cập nhật. Và cho phép người dúng xóa toàn bộ giỏ hàng.
Như vậy, code đầy đủ sẽ là:
Sau khi thiết lập thành công trang giỏ hàng cơ bản, lúc này ta đã có thể thêm sách một cách dễ dàng. Tuy nhiên, giả sử trong trường hợp không có sách thì sao ?. Chúng ta vẫn chưa xét đến trường hợp giỏ hàng rỗng thì sẽ như thế nào. Vậy khi nào thì giỏ hàng rỗng ?. Đó là khi session của giỏ hàng không tồn tại Id của quyển sách nào. Cụ thể, $_SESSION[‘cart'][id]. Khi id không tồn tại trong session này thì cũng là lúc giỏ hàng không tồn tại.

Vậy trước khi cho hiển thị giỏ hàng, ta cần kiểm tra xem có tồn tại id nào trong giỏ hàng hay không. Và vì id lưu ở dạng mảng đa chiều, nên ta cần dùng vòng lặp duyệt mảng foreach.
foreach($_SESSION[‘cart’] as $k=>$v)
Với $k có ý nghĩa tương đương $id quyển sách và $v tương đương là số lượng của quyển sách trong giỏ hàng. Vậy nếu tồn tại biến $k, thì tức có nghĩa là trong giỏ hàng có sách.
Đoạn code này, ta sử dụng biến $ok để làm biến kiểm tra, mặc định khi load dữ liệu biến $ok sẽ bằng 1. Và khi trong giỏ hàng tồn tại sách thì chúng ta sẽ thay đổi biến $ok thành 2. Và gọi giỏ hàng như code ở trên.
Ở phần trên, ta cũng có đề cập khi người dùng tiến hành chỉnh sửa số lượng từng món hàng đơn lẻ qua textbox và nhấn cập nhận thì hệ thống sẽ tiến hành chỉnh sửa lại thông tin giỏ hàng. Vậy chúng ta sẽ xử lý như thế nào cho trương hợp đó.
Nếu chú ý, các bạn sẽ thấy dòng code chứa textbox cho phép người dùng nhập số lượng có một tham số đặc biêt là name=qty[$row[id]]. Vậy tham số này được dùng để làm gì ?.
Tham số này, nói cho chúng ta biết số lượng đang hiển thị là thuộc mã sản phẩm nào. Vậy khi tiến hành cập nhật giỏ hàng ta sẽ kiểm tra, nếu $qty[$row[id]] mà có giá trị là 0. Tức là người đó muốn xóa bỏ giỏ hàng. Ngược lại, ta chỉ viêc cập nhật giỏ hàng $id tương ứng với số lượng nhập ở textbox.
Việc xóa món hàng ở trên chỉ đơn giản là hủy bỏ session của id đó. Việc cập nhật số lượng chỉ đơn giản là gán đè số lượng người nhập (thẻ value trong textbox) vào số lượng đang lưu trong session.
Vậy code hoàn chỉnh của trang cart.php này sẽ như sau:
Và cuối cùng, khi người dùng nhấn xóa toàn bộ giỏ hàng hay chỉ xóa một món hàng, ta sẽ gọi tới trang delcart.php. Vậy trang này sẽ xử lý như thế nào ?.
Tại đây, ta có thể nhận tham số là: $_GET[‘productid'];
Tham số này sẽ là $id mà chúng truyền qua liên kết. Nếu xóa toàn bộ giỏ hàng, tức ta sẽ truyền cho nó giá trị bằng 0. Lúc này, ta sẽ hủy toàn bộ $_SESSION[‘cart']. Ngược lại, nếu là một $id cụ thể, thì ta chỉ xóa món hàng đó mà thôi. $_SESSION[‘cart'][$id].
Code hoàn chỉnh của file delcart.php như sau:
Download toàn bộ mã nguồn của bài này tại đây.
(Bùi Quốc Huy)
36433
Bạn vẫn chưa hiểu rõ vấn đề ?. Bạn vẫn còn nhiều điều thắc mắc ?. Bạn gặp lỗi khi thực hành mã lệnh trên ?. Hãy tham gia diễn đàn QHOnline.Info để nhận được sự giúp đỡ từ phía cộng đồng nhanh nhất. Đồng thời tải những tài liệu giá trị tại diễn đàn. Việc đăng ký là hoàn toàn miễn phí, hãy đăng ký ngay để chúng tôi giúp đỡ bạn nhé.
Ghi rõ nguồn từ website QHOnline.Info - Khi bạn phát hành lại thông tin từ website này
PHP Framework những điều nên và không nên
Khái quát về PHP Framework
Học PHP như thế nào khi bạn chưa biết lập trình?
Tự học lập trình PHP dễ hay khó ?
Web 2.0 - Khái niệm và bản chất của chúng như thế nào ?



Trần Bá Vinh (14:43 26/01/2010)
thầy xử lý mảng hay quá !lâu nay em toàn dùng csdl để lưu giỏ hàng, nhưng thấy có nhiều vấn đề nảy sinh quá !
phải hoc cách viết này thôi ^^
Reply
Mai văn thức (09:52 03/02/2010)
Xin cảm ơn bài viết của Thầy !Bài viết của thầy thật hay !
Reply
the binh (18:22 03/02/2010)
Xin cảm ơn !Bài viết rất bổ ích
Reply
Trần Duy Phương (21:59 10/02/2010)
Bài Viết này rất hay về cách xử lý code.Chân Thành cám ơn.
Reply
tidi (01:22 25/02/2010)
quá hay...nhưng e vẫn có chỗ chưa hiểu.. hixReply
hoang huynh (20:01 08/03/2010)
cam on bai viet cua thay,bai nay rat hay. thay co the chi em lam code phan trang duoc ko,vi trang mang thi nhieu ma xem ko hieu,ko giai thich day du.nen ko lam duoc.Reply
NeptunesPr0 (20:17 08/03/2010)
Thanks cac" Bai` Viet" of Bùi Quốc Huy minh` dg hoc. mon nay` it" co" Tai` lieu. vua` dc you be` gioi" thieu. qua Site nay` moi" bt thay" site nay` rat" hay va` bo? ich" cho nhung` nguoi` thik hoc. PHPReply
Vũ Tiến (01:11 03/04/2010)
bài viết rất hay...cảm ơn thầy!!Reply
GaGa (08:45 12/04/2010)
Cảm ơn thầy rất nhiều. Mong ngày càng đọc được nhiều bài viết bổ ích như thế này của thầy.Reply
Nguyễn Hà Lịch (09:53 13/04/2010)
bài viết rất hay, cảm ơn Bùi Quốc Huy nha.Những cái trang cart.php ở đầu vẫn chưa khai báo session lên khai tải về sẽ không chạycác bạn phải khai báo thêm ở dòng đầu là:
<?php
session_start();
?>
thì mới chạy ngon được
Reply
XuânTruong (10:37 19/04/2010)
nếu người ta kg nhập số mà nhập chữ vô thi sẽ ra sao hả thầyReply
Nguyễn thị Huệ (13:28 27/04/2010)
Anh Quốc Huy ơi! Khi nào thì sẽ có bài 21 anh nhỉ? Anh viết bài nhanh lên nhé! Cảm ơn anh rất nhiều.Reply
nguyen danh tung (10:58 23/05/2010)
bai viet cua Anh rat hay va bo ich doi voi em Em rat cam on anh da chia se kien thuc. Anh co the huong dan em lam mot trang tim kiem duoc ko ahReply
Đoàn Quang Trung (00:29 06/06/2010)
Khi em khai báo<?php
session_start();
?>
thì nó lại báo lỗi này Anh fix giúp em nha:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:xamppxampphtdocsCartcart.php on line 60
Bạn không có món hàng nào trong giỏ
Reply
NDT (12:43 15/06/2010)
Thầy ơi viết 1 bài hướng dẫn phần in hóa đơn đi , cám ơn thầyReply
lê hồng chung (09:21 17/06/2010)
thầy ơi cho em hỏi. Em đã viết như trên mà khi chạy Click vào Mua sach nay thi gội tới trang addcart.php mà không thấy gì hết. Thầy có thể chỉ giúp em được không ạ. Em cảm ơn thầy.Reply
Nguyễn Văn Trường (02:45 01/07/2010)
Xin cảm ơn thầy rất nhiều.nhờ những bài dậy của thầy mà em đã học và làm được rất nhiều.mong thầy tiếp tục dậy chúng em những ứng dụng hay nữa.Xin cảm ơn thầy nhiều
Reply
Nguyễn Văn Trường (02:48 15/07/2010)
Mong thầy dậy chúng em cách làm trang hiển thị sản phẩm theo NXB,.. có phân trang.em cảm ơn thầy rất nhiều.
Reply
lê kỳ tuân (23:59 28/07/2010)
cảm ơn anh rất nhiều, khi em tải về máy chạy thử có mấy chỗ cần xửa lại là : <? ?>thay bằng <?php ?>, và file cart.php trên đầu file phải có hàm session_start(); thì mới chạy dc, có lẽ do phiên bản php, thanhk anh rất nhiều
Reply
Đức Tiến (22:11 13/08/2010)
Cảm ơn anh nhiều và rất mong anh sẽ hoàn chỉnh bài hưỡng dẫn về shopping cart , em đang rất đón chờReply
pham van duy (21:26 07/09/2010)
em cam on nhieu lam.rat hayReply
Nguyễn Văn Hoàng (10:46 15/09/2010)
Rất mong đợi kì tiếp theo, shopping cart với Paypal. ThanksReply
khaclinhhuynhvo (11:33 23/09/2010)
thầy ơi nếu như làm một phần bán hàng quần áo co lam giong nhu tren duoc khong thay voi lai em muon hoi mình muốn thêm thuộc tính size và màu nữa thì làm sao thầy với lại phần ở trên thầy làm là co bao gom luu giohang vao csdl khong thayReply
IT (18:36 28/09/2010)
tranghttp://thegioiweb.vn/Story/vn/laptrinhweb/laptrinhweb_PHP/2010/9/11719.html
an cap y tuong cua dien dan minh a nay
Reply
laothanhcachmang (10:29 04/10/2010)
thanks bài viết rất hay và chi tiếtReply
Thay Bun Long (12:09 05/10/2010)
Mình đang rất mong bài hướng dẫn làm shopping cart kết nối với Paypal. Rất cảm ơn vì bài viết hữu ích!Reply
Nguyện Ngọc Toàn (23:36 12/10/2010)
Sao mình tải về rồi chạy thử nhưng nó không được, click mua hàng thì nó chuyển vô trang addcart rồi nằm im đó và trong cart lạ không co1mon1 hàng nào hết huhu. Giải thích giúp mình với mình đang rất cần đâyReply
Nguyễn Thị Bích Hằng (07:26 13/11/2010)
Tại sao khi mua cùng một món hàng thì trang card tính cập nhật được số lượng và giá tiền nhưng nếu mua thêm một món hàng khác thì lại báo lỗi không truy xuất được csdl? Trong khi đó thì tại trang index.php vẫn đếm được số lượng sách mua tăng lên. Không Hiểu???Reply
thuyanh (07:32 13/11/2010)
cám ơn anh rất nhiều, có lẽ qua dây em cãm thấy minh thật kém phỉa học hỏi nhiều lắm.hixxReply
Lê Hữu Hoạt (17:03 14/11/2010)
CÓ bài 21 chưa bác em tham lắm :DReply
solomen (14:38 12/12/2010)
thầy ơi cho e hỏi về cái giỏ hàng. Cái session của e nó lưu 2 thông tin là MaSP(mã sản phẩm)và MaCH(mã cửa hàng) e lưu thành mảng 2 chiều mà ko biết lấy ra sao ? Cái session của e la $_Session['cart']['sp']['ch']
Reply
nguyen hoang thuan (08:26 15/12/2010)
xem thong tin lich su qua trinh mua hang nhu the nao?viet bang phpReply
tran van tien (16:18 05/01/2011)
Các bài học này rất hay.mình cũng muốn học ngôn ngư này ,tuy nhiên mình chưa hiểu rõ về nó,mong các bạn chỉ mình với.cho hỏi tí:cái code giõ hàng này có thể áp dụng cho tất cả các trang web được ko.thankReply
Sat Thu (22:05 08/01/2011)
Cảm ơn bài viết của thầy nhiều lắm .Reply
trần minh tiến (10:30 10/01/2011)
sao anh ko viết tiêp phần thanh toán và quản lý hóa đơn? em là người mới tiếp cận với php lên còn kém. mong anh sơm viết. hay anh có thể gửi qua mail cho em được ko ạ? thank anh trước nhe.Reply
dinh huỳnh (17:18 13/01/2011)
cảm ơn bài viết của thầy . rất bỗ íchReply
Thái Nguyen (22:35 14/01/2011)
bài này hay quá thầy ơiReply
nguyenvantuong (21:50 11/03/2011)
bạn có thể send cho mình code được không . thanks bạn nhiềuReply
Phạm kỲ Khôi (11:19 25/03/2011)
Cảm ơn Thầy đã viết bài giỏ hảng này.Nó hay quá.Thầy có thể dạy em viết bài phân quyền trên trang web bằng PHP được khôngReply
nguyễn chí công (23:10 21/05/2011)
cảm ơn thấy rất nhiều về bài viết này!em gặp 1 vấn đề là trong hiển thị sản phẩm của em có phần xem chi tiết sản phẩm, và trong phần đó em cũng đặt 1 button thêm vào giỏ nhưng thêm vào giỏ từ trang chi tiết thì bị lỗi.Khi hiển thị trang chi tiết thì id đã dc get 1 lần và truy vấn dữ liệu cũng đã được xử lý nên xuất hiện lỗi ở phần truy vấn trong cart.php. Thầy cho em cách giải quyết trường hợp này được không ạ! Cảm ơn thầy nhiều
Reply
lê anh vũ (12:00 24/05/2011)
Bài này rất hay, dể hiểu nữa.cảm ơn thầy.
Reply
Mr Nghĩa (11:12 30/05/2011)
Bài viết rất hay cảm ơn anhReply
nguyễn trung trực (20:21 03/06/2011)
thầy ơi sao em chạy nó báo lỗiDemo Shopping Cart
Warning: Invalid argument supplied for foreach() in E:AppServwwwcart.php on line 49
Warning: implode() [function.implode]: Invalid arguments passed in E:AppServwwwcart.php on line 53
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in E:AppServwwwcart.php on line 59
Reply
Tan Thanh (17:39 07/06/2011)
Em cung k biet goi nhu the nao, em goi la thay nhe, thay co the viet tiep code thanh toan cho viec mua hang truc tuyen k thay, em cam on thay nhieu lam! Thay chi rat chi tiet, cam on thay nhieu lam!Reply
AAA (21:15 07/06/2011)
eX. Xử lí không theo mô hình hướng đối tượng,bạ đâu code đó. Không nên.Nên xây dựng thành 1 class cung cấp các phương thức thao tác với session của giỏ hàng . Như vậy code mới trong sáng ,dễ chỉnh sửa ,nâng cấp
Reply
Kenny (14:36 09/10/2011)
Chào bạn,Không phải tôi không code theo hướng đối tượng. Mà vì tôi muốn những người mới tiếp cận với PHP hiểu được bản chất của giỏ hàng là gì ?. Và khi họ đã hiểu được chúng thì việc chuyển chúng sang OOP cũng chỉ là điều rất đơn giản.
Chưa tập bò thì không nên tập chạy. Khi đã bò được rồi thì muốn đi hay muốn nhảy thì cũng sẽ không giờ té. Cái nền luôn quyết định tất cả, không có nền tảng vững vàng thì không nên nghiên cứu sâu làm gì. Vì không bền đâu bạn.
EricNgoc (13:56 18/07/2011)
Admin cho em hỏi ở chỗ đoạn SQL:$str=implode(",",$item);
$sql="select * from books where id in ($str)";
Ở trên Admin tao bảng theo kiểu "int"
và lúc gọi "id " thi theo bang CSDL thi truy van
$sql="select * from books where id in ($str)";
có "in". Con nếu trên CSDL . Tôi tạo theo kiểu "Varchar" thì trên chỗ câu truy vẫn
câu "$sql ='SELECT * FROM books WHERE id ? ($str)' "
Vậy Admin cho em hỏi chỗ đoạn đó nếu khai báo bằng "Varchar" thì mình dùng kiểu dữ liệu nào để lấy kiểu dữ liệu chuỗi
Reply
nguyen thanh luan (08:53 30/07/2011)
cam on ban nhieu. Minh moi tim hieu nen nhieu cho chua rochan thanh cam on
Reply
Cuongnx (01:10 13/08/2011)
CSDL của em có sản phẩm và phụ kiện, em phải viết thế nào mới hiển thị được khi chọn sản phẩm của cả 2 cái đó?Reply
tpc (15:16 19/08/2011)
sao không có phần quản lý các khách hàng đã mua hàng như khách hàng đó đã mua bao nhiêu sản phẩm...Reply
Kenny (14:28 09/10/2011)
Chào bạn,Code ở trên chỉ là demo cho mọi người hiểu cách xây dựng một hệ thống giỏ hàng trực tuyến thì phải làm như thế nào. Do đó không có đẩy đủ chức năng như một trang web hoàn chỉnh. Hy vọng các bạn sẽ phát huy tốt được chúng trong quá trình xây dựng ứng dụng thực tế.
buonqua (23:55 28/10/2011)
ai co the tao ung dung gio hang ma duongng cookie thay cho seision giup minh voi duoc khReply
lê phiết (10:28 01/12/2011)
mình thấy cái này rất hay.chuẩn bị làm đồ án php mà có cái này để tham khảo.thank bạn nhiều nhaReply
suncisco (09:56 15/12/2011)
repair erorở trang cart.php dòng số 56 các bạn nên xóa bỏ hoặc cut đoạn session_start(); đi ... sau đó các bạn thêm vào hoăc pass đoạn code session_start(); vào dòng số 2 trước đoạn code if(isset($_POST['submit'])) thì toàn bộ đoạn code sẽ ko bị lỗi !
Reply
quangtanck (12:02 24/12/2011)
Giúp mình với. Mình chạy code của thầy và bị cái lổi này.Notice: Use of undefined constant id - assumed 'id' in C:wampwwwshopping_cartcart.php on line 65
Dòng 65:
echo "<p align=right>So Luong: <input type=text name=qty[$row[id]] size=5 value={$_SESSION['cart'][$row[id]]}> - ";
pv (12:48 26/12/2011)
Đúng thư mình cần, chân thành cảm ơn adminReply
quangtanck (08:30 30/12/2011)
trong cart.php đoạn code đầu.<?php
if(isset($_POST['submit']))
{
foreach($_POST['qty'] as $key=>$value)
{
if( ($value == 0) and (is_numeric($value)))
{
unset ($_SESSION['cart'][$key]);
}
elseif(($value > 0) and (is_numeric($value)))
{
$_SESSION['cart'][$key]=$value;
}
}
header("location:cart.php");
}
cho mình hỏi dòng: foreach($_POST['qty'] as $key=>$value) vậy cái $_POST['qty'] cho mình hỏi cái 'qty' này lấy từ đâu dậy.