Khoá học lập trình PHP/MySQL [Video]Cookie: Xây dựng cart (giỏ hàng) + checkout (thanh toán) sử dụng Cookie & localStorage - Lập trình PHP/MySQL
- 5.0/5.0
- 2k Đăng ký
- Học lập trình
- Tiếng việt
Thông tin khóa học
Mở bài
Trong thương mại điện tử, chức năng giỏ hàng (cart) và thanh toán (checkout) là trái tim của trải nghiệm mua sắm. Với lập trình viên mới học PHP/MySQL, một trong những cách đơn giản, nhanh chóng để triển khai giỏ hàng là tận dụng Cookie và localStorage ở phía client — kết hợp với backend PHP để xử lý đặt hàng. Việc hiểu rõ khi nào nên lưu tạm dữ liệu trên trình duyệt (cookie/localStorage), khi nào cần đồng bộ lên server (PHP/MySQL), sẽ giúp bạn thiết kế hệ thống linh hoạt, an toàn và thân thiện với người dùng.
Bài viết này hướng dẫn từng bước để xây dựng cart + checkout sử dụng Cookie & localStorage: từ phân tích kiến trúc, thiết kế database, cài đặt front-end JavaScript đến xử lý backend bằng PHP và lưu dữ liệu vào MySQL. Ngoài kỹ thuật, bạn sẽ nhận được lời khuyên bảo mật, xử lý các tình huống thực tế (đồng bộ, tràn cookie, cross-device), và các mẹo tối ưu UX. Đây là tài liệu thực hành lý tưởng cho khóa học PHP/MySQL căn bản muốn mở rộng sang ứng dụng thương mại điện tử nhỏ.
Tại sao chọn Cookie và localStorage cho giỏ hàng?
Cookie và localStorage là hai cơ chế lưu trữ dữ liệu tại trình duyệt, có ưu/nhược khác nhau. Trước khi bắt tay vào xây dựng, hãy hiểu rõ mục tiêu dùng chúng cho cart.
-
Sử dụng Cookie: Cookie được trình duyệt gửi tự động kèm mỗi request đến server (tùy domain/path). Vì vậy cookie phù hợp để lưu một token hoặc dữ liệu nhỏ cần gửi đến server mà không cần logic client phức tạp. Cookie có hạn chế kích thước (~4KB) và nên dùng cho thông tin nhẹ như
cart_idhoặcsession token. -
Sử dụng localStorage: localStorage cho phép lưu dữ liệu lớn hơn ( vài MB tùy browser) và dễ thao tác bằng JavaScript. Nó thích hợp để lưu nội dung giỏ hàng toàn bộ (các item, số lượng, giá tạm thời). Dữ liệu localStorage không tự gửi kèm request nên cần đồng bộ với server khi checkout/đăng nhập.
Lợi ích khi dùng client-side storage cho cart:
-
Không cần đăng nhập: Khách hàng có thể thêm sản phẩm trước khi đăng nhập, trải nghiệm mượt mà.
-
Tốc độ UI: Thao tác thêm/xóa cập nhật nhanh mà không cần gọi server.
-
Giảm tải server: Truy vấn/ghi DB chỉ khi checkout, không cho mỗi thao tác thêm/xóa.
Nhưng cần lưu ý:
-
Cookie dễ bị gian lận nếu chứa dữ liệu nhạy cảm; cần mã hóa hoặc chỉ lưu token.
-
localStorage có thể bị xóa khi người dùng clear browser; cần cung cấp cơ chế restore (ví dụ đồng bộ khi login).
Tóm lại, chiến lược phổ biến: lưu “source of truth” tạm thời trên localStorage, lưu token/cart_id trên cookie để có thể đồng bộ với server khi cần.
Kiến trúc tổng quan: client + server interaction
Thiết kế hệ thống cart + checkout sử dụng Cookie & localStorage cần rõ ràng hai tầng: Front-end (JS) và Back-end (PHP/MySQL).
-
Front-end (browser)
-
Quản lý giỏ hàng tạm thời bằng
localStorage.cart(object chứa item id, qty, price, options). -
Hiển thị cart, cập nhật số lượng, xóa item.
-
Khi user nhấn “Checkout”: validate trên client, gửi payload lên server bằng
fetch()(POST JSON hoặc form). -
Nếu có “remember cart”: gửi hoặc lưu
cart_idvàodocument.cookieđể server nhận biết cart đã tồn tại.
-
-
Back-end (PHP/MySQL)
-
Endpoint API:
/api/cart/sync(đồng bộ cart),/api/checkout(thực hiện checkout). -
Nếu nhận
cart_idtừ cookie: load cart từ DB (server-side). Nếu không, tạo cart mới, lưu vàocartstable, trả vềcart_idvà gợi ý client lưu cookie. -
Khi checkout: validate stock/price, tạo
ordersvàorder_itemstrong MySQL trong transaction, giảm tồn kho, trả về kết quả thành công/ lỗi.
-
-
Bảng chính trong DB
-
carts(id, token, user_id nullable, created_at, updated_at) -
cart_items(id, cart_id, product_id, qty, price_snapshot, options_json) -
orders(id, user_id, total, status, created_at, address, payment_method) -
order_items(order_id, product_id, qty, price)
-
Luồng cơ bản: người dùng thao tác trên localStorage → khi cần lưu server (login hoặc checkout), gửi cart JSON → server lưu vào DB, trả cart_id → client lưu cookie cart_id để phục hồi sau. Trường hợp người dùng vừa có cookie cart_id vừa localStorage, server sẽ hợp nhất (merge) 2 giỏ.
Thiết kế database và API backend bằng PHP/MySQL
Trước khi code, tạo schema cơ bản trong MySQL:
API endpoints (quy ước):
-
POST /api/cart/sync— nhận cart JSON từ client (items[]), trảcart_id(tạo mới hoặc merge). -
GET /api/cart/:id— trả cart hiện tại (dành cho AJAX render). -
POST /api/checkout— nhận data thanh toán, validate, tạo order.
Ví dụ PHP - pseudo code cho sync:
Lưu ý: generateToken() có thể là random 32 byte hex. Khi user đăng nhập, bạn có thể gán user_id cho cart để lưu lâu dài.
Lưu trữ cart: chi tiết code JavaScript (localStorage) và cookie
Dưới đây là ví dụ tập trung front-end để quản lý cart bằng localStorage và lưu cart_token vào cookie.
1. Thêm/xóa item trong localStorage
2. Đồng bộ local -> server (khi cần)
3. Hợp nhất khi người dùng vừa có cookie vừa localStorage
Khi client mở trang, gọi GET /api/cart nếu cookie cart_token tồn tại, server trả cart; client merge với localStorage (cộng qty). Sau merge, sync lại server để có phiên bản cuối cùng.
Xử lý checkout: PHP side (validation, transaction, order insertion)
Bước quan trọng nhất là checkout: chuyển cart thành order trong DB, trừ tồn kho, xử lý thanh toán.
Kiểm tra nạp đồ: validation
-
Kiểm tra mỗi
product_idcòn đủ tồn kho (SELECT ... FOR UPDATE khi dùng InnoDB) -
Kiểm tra
price_snapshotkhớp với giá hiện tại (ngăn thao túng client) -
Kiểm tra thông tin giao hàng, phương thức thanh toán
Sử dụng transaction để đảm bảo nguyên tử
Ghi nhớ: phải validate tất cả dữ liệu server-side. Không tin tưởng giá trị truyền từ client (localStorage/cookie).
Bảo mật, xử lý edge cases và best practices
Xây cart trên client mang lại tiện ích nhưng cũng nhiều rủi ro. Một số lưu ý quan trọng:
-
Không lưu thông tin nhạy cảm trong cookie/localStorage (mật khẩu, thẻ tín dụng).
-
Server phải luôn kiểm tra giá & tồn kho trước khi tạo order — dùng giá snapshot chỉ để hiển thị trước; so sánh với DB lúc checkout.
-
Token hóa cart: cookie chỉ chứa
cart_token, không chứa chi tiết items; server mới là nguồn dữ liệu cuối cùng khi checkout. -
Bảo vệ CSRF: dùng token cho form checkout nếu sử dụng form POST từ browser.
-
Xử lý xung đột: nếu user mở nhiều tab, dùng locking hoặc transaction để tránh double checkout / oversell.
-
Fallback khi cookie disabled: nếu cookie không bật, dựa vào localStorage và yêu cầu user đăng nhập để lưu cart server-side.
-
Expiration & cleanup: tự động xóa cart cũ (ví dụ older than 30 days) để không chiếm DB.
-
Rate limiting: chống spam checkout/requests.
Ngoài ra, hãy log các lỗi và hành vi bất thường để debug và theo dõi tấn công giả mạo.
Tối ưu UX và performance cho giỏ hàng & thanh toán
Một checkout tốt không chỉ an toàn mà còn phải nhanh và rõ ràng:
-
Hiển thị tiến trình: Cart → Shipping → Payment → Review → Confirm.
-
Lưu tự động: khi user thay đổi giỏ, lưu localStorage ngay và hiển thị tooltip “Đã lưu”.
-
Preview shipping cost & tax: tính ước lượng trên client hoặc gọi API nhanh để tính.
-
Minimize server calls: chỉ đồng bộ khi cần (login, checkout, explicit save).
-
Lazy load images: để danh sách cart tải nhanh.
-
Show price changes: nếu giá thay đổi trước khi checkout, thông báo rõ ràng và yêu cầu user confirm.
Về performance backend, tạo index cho cart_id, product_id, và tối ưu transaction để giảm lock contention. Sử dụng cache (Redis) cho produk catalog nhưng không cache stock/tính năng quan trọng.
Kết luận
Xây dựng cart (giỏ hàng) và checkout sử dụng Cookie & localStorage kết hợp với backend PHP/MySQL là giải pháp thực tế, phù hợp cho các dự án nhỏ và giai đoạn học tập. Chiến lược hợp lý là lưu tạm dữ liệu trên client với localStorage để có trải nghiệm mượt mà, lưu cart_token trong cookie để server có thể nhận diện và đồng bộ, rồi thực hiện checkout an toàn bằng transaction trên MySQL.
Trong khi cài đặt, bạn cần ưu tiên bảo mật: không tin dữ liệu client, luôn kiểm tra giá và tồn kho server-side, dùng prepared statements và transactions. Đồng thời chú trọng UX bằng cách tối ưu thời gian phản hồi, hiển thị thông báo rõ ràng khi có thay đổi giá/tồn kho, và cung cấp cơ chế khôi phục cart khi user đăng nhập trên thiết bị khác.
Bắt tay vào thực hành: bắt đầu với schema DB đơn giản, triển khai front-end localStorage, viết API sync và checkout bằng PHP, rồi mở rộng tính năng merge cart khi login, hỗ trợ guest checkout và tích hợp payment gateway khi cần. Với quy trình này, bạn sẽ có hệ thống giỏ hàng/checkout thực tế, an toàn và sẵn sàng cho mở rộng trong các dự án thương mại điện tử. Chúc bạn triển khai thành công!
Đăng nhập để làm bài kiểm tra
Chưa có kết quả nào trước đó
Chương trình
Phản hồi từ học viên
5
Đánh giá
Câu hỏi thường gặp
B2. Đăng ký học
B3. Hoàn thành mua khoá học
B4. Thanh toán theo hướng dẫn
B5. Đợi chúng tôi kiểm tra thông tin và thêm bạn vào lớp học
Bước 1: Truy cập website https://qviet.vn/teacher/form
Bước 2: Điền thông tin theo yêu cầu. Để bản đăng ký được duyệt nhanh nhất, anh chị hãy điền đủ thông tin nhé.
Bước 3: Click vào "đăng ký ngay" để hoàn thành
Lưu ý:
Link video bài giảng mẫu: Video bài giảng mẫu là căn cứ để Trắc Nghiệm Việt duyệt về hình thức và chất lượng giảng dạy. Vì vậy anh chị hãy điền link này để đăng ký được duyệt nhanh nhất nhé.
Anh chị cũng nên mô tả kỹ về kinh nghiệm giảng dạy để Trắc Nghiệm Việt đánh giá nhé.
Chúc các anh chị và các bạn thành công, sớm gia nhập đội ngũ giảng viên Trắc Nghiệm Việt!
Hình thức học như thế nào?
Việc tạo thói quen học tập sẽ giúp bạn tăng khả năng đạt được mục tiêu. Dành thời gian để học và nhận lời nhắc bằng cách sử dụng công cụ quản lý học tập của bạn.Bước 1: Truy cập mục tài khoản, đăng nhập và chọn Quản lý học tập và ấn Thêm lịch học
Bước 2: Cài đặt lịch học tập của bạn:
- Đặt tiêu đề và chọn khóa học muốn tạo lịch học sau đó ấn tiếp tục.
- Cài đặt tần suất học, thời gian học, thời gian bắt đầu học, lịch thông báo nhắc nhở trước lúc bắt đầu học, ngày kết thúc sau đó bạn ấn tiếp tục.
- Bạn kiểm tra lại lịch học tập lần nữa, nếu đúng bạn ấn Hoàn thành.
- Nếu muốn chỉnh sửa, bạn ấn mục Quay lại và chỉnh lại.
- Khi tạo xong bạn có thể ấn thanh ngang bên phải để xóa, sửa lịch học.
Việc lên lịch học sẽ giúp em bạn dễ dàng đạt được các mục tiêu mong muốn, tăng hiệu quả học tập. Đặc biệt, khi bạn học được 90% nội dung khóa học, bạn sẽ nhận chứng nhận hoàn thành khóa học.
Hình thức học tại Trắc Nghiệm Việt
1. Học như thế nào?- Khóa học tại Trắc Nghiệm Việt được học **online** trên điện thoại hoặc máy tính có kết nối Internet.
- Các video bài giảng đã được biên tập sẵn, học viên có thể học bất cứ lúc nào, không giới hạn thời gian và số lần học.
- Chỉ cần đăng ký và thanh toán một lần.
2. Có thể học trên nhiều thiết bị không?
- Học viên có thể đăng nhập và học trên nhiều thiết bị khác nhau (điện thoại, máy tính, máy tính bảng). Tuy nhiên, tại cùng một thời điểm chỉ **một thiết bị** được phép xem video.
- Truy cập website: https://qviet.vn để đăng nhập và học.
- Với điện thoại hoặc máy tính bảng, học viên có thể tải ứng dụng Trắc Nghiệm Việt tại: https://qviet.vn
3. Có thể học trên Smart TV không?
- Trắc Nghiệm Việt đang phát triển để hỗ trợ học trực tiếp trên Smart TV. Hiện tại, tùy theo từng dòng TV mà có thể mở website và học được hoặc không.
- Bạn có thể thử bằng cách mở trình duyệt trên TV và truy cập: https://qviet.vn
- Trải nghiệm học tập tốt nhất hiện nay là trên **điện thoại** và **máy tính**.
4. Thời hạn sử dụng khóa học?
- Sau khi đăng ký, học viên sẽ sở hữu khóa học **vĩnh viễn**, có thể học đi học lại không giới hạn.
5. Có được tải khóa học về thiết bị không?
- Video bài giảng thuộc bản quyền của Trắc Nghiệm Việt và giảng viên. Học viên **không được tải xuống** dưới bất kỳ hình thức nào để tránh việc phát tán trái phép.
- Khóa học là tài sản trí tuệ và công sức của giảng viên, mong học viên hiểu và tôn trọng quyền sở hữu này.
- Bên dưới mỗi video có mục **Thảo luận**, bạn tích chọn và đặt câu hỏi tại đây. Thông thường trong vòng 24h giảng viên sẽ phản hồi lại bạn.
- Để xem câu trả lời của giảng viên, bạn vào mục **Thảo luận** của bài học đã đặt câu hỏi và tích vào mục trả lời để xem.
Học viên có thể liên hệ trực tiếp với giảng viên qua điện thoại, email, Facebook không?
- Khóa học online, giảng viên có hàng nghìn học viên trên cả nước nên việc liên hệ trực tiếp với giảng viên qua điện thoại là không tiện và Trắc Nghiệm Việt cam kết bảo mật thông tin cá nhân của giảng viên.
- Đa phần các khóa học, giảng viên hỗ trợ học viên qua **mục Thảo luận**. Một số khóa học giảng viên có thể hỗ trợ thêm qua email, Facebook, Zalo hoặc nhóm hỗ trợ trên Facebook. Trong những trường hợp này, giảng viên và Trắc Nghiệm Việt sẽ cung cấp thông tin liên hệ phù hợp.
Bình luận
Tổng quan khóa học
- Bài học 59
- Thời gian Linh hoạt
- Mức độ Mới bắt đầu
- Ngôn ngữ Tiếng việt
- Thời lượng Trọn đời
- Chứng chỉ Không
Trần Văn Điệp
Founder tại QViet.vn
- 5.0/5.0
Mình là Điệp, mình là lập trình viên Full Stack. Hiện mình là Senior Developer, mình là người yêu thích lập trình và viết các mã lệnh và yêu thích khi tạo ra những sản phẩm cho mình. Mình luôn thích thú mỗi khi tối ưu lại chức năng của từng chức năng, làm sao để nó trở lên tối ưu và smooth. Làm tăng trải nghiệm người dùng. Mình cũng rất thích tìm hiểu các công nghệ mới, tìm hiểu các tính năng mới trong các bản nâng cấp mới. Mảng mình làm việc lâu nhất là Mobile (Android & iOS). Mình là người thích chia sẻ kiến thức, những gì mình biết đều muốn chia sẻ ra. Blog này cũng là nơi mình chia sẻ các kiến thức và công nghệ mình đã làm trong các dự án. Blog mình hướng tới là chia sẻ kiến thức kết hợp với trải nghiệm thực tế khi làm ở doanh nghiệp.