BÀI TẬP THỰC HÀNH 01 Mục đích: Ơn tập cú pháp PHP. Sử dụng vòng lặp foreach để duyệt các phần tử trong mảng (bảng dữ liệu). Sử dụng các lệnh include, require để chèn nội dung một tập tin khác vào tập tin hiện hành. Yêu cầu: Tạo các trang: profile.php: lưu thông tin của host và cấu hình. database.php: kết nối đến CSDL. database_error.php: thông báo lỗi kết nối CSDL. category_list.php: hiển thị danh sách các danh mục. product_list.php: hiển thị danh sách các mặt hàng tương ứng với danh mục. Với cơ sở dữ liệu quản lý hàng hóa (qlhh) gồm 2 bảng (danhmuc, mathang) như sau:
Hướng dẫn:
Trang profile.php:
Trang database.php:
1
Trang database_error.php:
Trang category_list.php:
require_once ("database.php"); $query = "SELECT * FROM danhmuc ORDER BY madm"; $result = $db->query($query); ?> <!DOCTYPE html> <head> <title>My Shop</title> <meta charset="utf-8">
// 2. Lấy tên của danh mục hàng hóa hiện tại $query = "SELECT * FROM danhmuc WHERE madm = $madm"; $bangdm = $db->query($query); $danhmuc = $bangdm->fetch(PDO::FETCH_BOTH); $tendm = $danhmuc['tendm']; // 3. Lấy danh sách tất cả danh mục hàng hóa $query = "SELECT * FROM danhmuc ORDER BY madm"; $bangdm = $db->query($query); // 4. Lấy tất cả mặ hàng thuộc danh mục đã chọn $query = "SELECT * FROM mathang WHERE madm = $madm ORDER BY mahang"; $bangmh = $db->query($query); ?>
Hiển thị lên trang: <body> <div id="page"> <div id="header">
ABC Shop
</div>
<div id="main">
Danh sách mặt hàng
<!-- Hiển thị danh sách danh mục dưới dạng liên kết --> <div id="sidebar">
Danh mục
<ul class="nav"> <?php foreach($bangdm as $r){ ?> <li>?> </a></li> <?php } ?> </div> <!-- Hiển thị danh sách mặt hàng thuộc danh mục đã chọn --> <div id="content">
BÀI TẬP THỰC HÀNH 02 Mục đích: Tương tác cơ sở dữ liệu (thêm, xóa, sửa). Chuyển hướng trang theo yêu cầu. Yêu cầu: Tạo các trang: category_list.php: trang chính quản lý danh mục. Từ trang này sẽ gọi thực hiện các chức năng thêm, xóa, sửa. add_category_form.php: form thêm danh mục. add_category.php: xử lý thêm danh mục. delete_category.php: xử lý xóa danh mục. update_category_form.php: form cập nhật danh mục. update_category.php: xử lý cập nhật danh mục. Sử dụng cơ sở dữ liệu quản lý hàng hóa (qlhh.sql). Thư mục inc chứa các tập tin hỗ trợ kết nối CSDL của bài thực hành trước. Hướng dẫn:
Trang category_list.php có giao diện như sau:
Chuyển sang delete_category.php để xử lý, gửi kèm mã danh mục được chọn. Sau khi xóa chuyển hướng về lại category_list.php.
Chuyển sang update_category_form.php, gửi kèm mã danh mục được chọn. Chuyển sang add_category_form.php.
Trang update_category.php: require_once ("inc/database.php"); try{ // Lấy mã và tên danh mục từ form if(isset($_POST["txtten"])) $tendm = $_POST["txtten"]; if(isset($_POST["txtma"])) $madm = $_POST["txtma"]; // Cập nhật danh mục vào CSDL $sql = "UPDATE danhmuc SET tendm='$tendm' WHERE madm=$madm"; $db->exec($sql); } catch (PDOException $e){ // Xử lý lỗi tương tự trang trước } // Quay về trang quản lý chính header("Location: category_list.php"); ?>
Trang add_category_form.php có giao diện như sau: Chuyển sang add_category.php để xử lý. Sau khi thêm quay về
category_list.php.
Quay về category_list.php. <?php // Chèn header.php ?>
Trang add_category.php: require_once ("inc/database.php"); try{ // Lấy tên danh mục do nd nhập từ form if(isset($_POST["txtten"]))
4
$tendm = $_POST["txtten"]; // Thêm mới danh mục vào CSDL $sql = "INSERT INTO danhmuc(tendm) VALUES('$tendm')"; $db->exec($sql); } catch (PDOException $e){ // Xử lý lỗi tương tự trang trước } // Quay về trang quản lý chính header("Location: category_list.php"); ?>
Tự thực hành: Tạo các trang quản lý (thêm, xóa, sửa) sản phấm: product_list.php: trang chính quản lý sản phẩm. Từ trang này sẽ gọi thực hiện các chức năng thêm, xóa, sửa. add_product_form.php: form thêm sản phẩm. add_product.php: xử lý thêm sản phẩm. delete_product.php: xử lý xóa sản phẩm. update_product_form.php: form cập nhật sản phẩm. update_product.php: xử lý cập nhật sản phẩm. Giao diện trang chính (product_list.php):
5
BÀI TẬP THỰC HÀNH 03 Mục đích: Tổ chức ứng dụng theo mơ hình MVC. u cầu:
Trong bài thực hành này, các trang sẽ được tổ chức lại theo mơ hình MVC như sau: Thư mục model chứa: profile.php: lưu thông tin của host và cấu hình. database.php: kết nối đến CSDL. danhmuc_db.php: tương tác bảng danh mục trong CSDL. Thư mục view chứa database_error.php: thông báo lỗi. header.php: nội dung phần đầu trang. footer.php: nội dung phần cuối trang. Thư mục qldanhmuc (controller) chứa: index.php: trang chính. dsdanhmuc.php: quản lý danh mục. Hướng dẫn:
Chạy thử ứng dụng để kiểm tra kết quả (qldanhmuc):
3
Tự thực hành: Bổ sung chức năng Thêm, Xóa như hình:
Hướng dẫn:
Trang index.php:
Trang dsdanhmuc.php:
4
BÀI TẬP THỰC HÀNH 04 Mục đích: Làm quen với cách viết hướng đối tượng. Yêu cầu: Viết lại các trang database.php, danhmuc_db.php thành các lớp (tổ chức các tập tin như bài thực hành 03). Hướng dẫn:
Trang database.php:
include("profiles.php"); class DATABASE{ private static $username = DB_USER; private static $password = DB_PASS; private static $options = array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION); private static $dns = "mysql:host=localhost;dbname=qlhh;port=3306"; private static $db; private function __construct(){} public static function taoketnoi(){ if(!isset(self::$db)){ try{ self::$db = new PDO(self::$dns, self::$username, self::$password, self::$options); } catch(PDOException $e){ $error_message = $e->getMessage(); include("../view/database_error.php"); exit(); } } return self::$db; } public static function dongketnoi(){
self::$db = null; } } ?>
Trang danhmuc_db.php:
class DANHMUC_DB{ public function laytatcadanhmuc(){ $db = DATABASE::taoketnoi(); try{ $sql = "SELECT * FROM danhmuc"; $cmd = $db->prepare($sql); $cmd->execute(); $ketqua = $cmd->fetchAll(); return $ketqua;
BÀI TẬP THỰC HÀNH 05 Mục đích: Minh họa chức năng đăng ký, đăng nhập cơ bản. Yêu cầu: 1. Bổ sung thêm vào CSDL các bảng:
nguoidung
diachi
mand
INT-AI-PRIMARY
madc
INT-AI-PRIMARY
email
VARCHAR(50)
diachi
VARCHAR(50)
matkhau
VARCHAR(50)
quanhuyen
VARCHAR(50)
hoten
VARCHAR(50)
tinhthanh
VARCHAR(50)
loaind
TINYINT
dienthoai
VARCHAR(50)
mand
INT
2. Trong thư mục model, viết các lớp sau: nguoidung_db.php: có các phương thức: thêm người dùng, kiểm tra người dùng hợp lệ, lấy thông tin người dùng. diachi_db.php: phương thức thêm địa chỉ. 3. Tạo thư mục khachhang (controller), viết các trang sau: regisform.php: form đăng ký người dùng/khách hàng mới. loginform.php: form đăng nhập. index.php: trang điều khiển chính. main.php: nếu đăng nhập thành cơng sẽ hiển thị trang này. Hướng dẫn:
Tạo bảng nguoidung:
Lớp nguoidung_db.php: 1
class NGUOIDUNG_DB{ // khai báo các thuộc tính (SV tự viết) public function kiemtranguoidunghople($email,$matkhau){ $db = DATABASE::taoketnoi(); try{ $sql = "SELECT * FROM nguoidung WHERE email=:email AND matkhau=:matkhau"; $cmd = $db->prepare($sql); $cmd->bindValue(":email", $email); $cmd->bindValue(":matkhau", md5($matkhau)); $cmd->execute(); $valid = ($cmd->rowCount () == 1); $cmd->closeCursor (); return $valid; } catch(PDOException $e){ $error_message=$e->getMessage(); include("../view/database_error.php"); exit(); } } public function laythongtinnguoidung($email){ $db = DATABASE::taoketnoi(); try{
// 1. Xuất thông tin khách hàng // 2. Thông tin đơn hàng (sẽ thực hiện ở bài kế) // Lấy thông tin từ session $hoten = $_SESSION["khachhang"]["hoten"]; ?> <?php include("../view/header.php"); ?> <div>
Chào <?php echo $hoten; ?>!
<!-- Bổ sung chức năng thoát / signout (SV tự viết) --> </div>
4
<?php include("../view/footer.php"); ?>
Trang index.php:
require("../ultils/main.php"); require("../model/database.php"); require("../model/nguoidung_db.php"); // Biến cho biết khách hàng đăng nhập chưa $isLogin = isset($_SESSION["khachhang"]); if(isset($_REQUEST["action"])){ $action = $_REQUEST["action"]; } elseif($isLogin == FALSE){ $action = "dangnhap"; } else{ $action="main"; } $kh_db = new NGUOIDUNG_DB(); switch($action){ case "main": include("main.php"); break; case "thoat": unset($_SESSION["khachhang"]); header("Location: ."); break; case "dangnhap": include("loginform.php"); break; case "xldangnhap": $email = $_POST["txtemail"];
$matkhau = $_POST["txtmatkhau"]; if($kh_db->kiemtranguoidunghople($email,$matkhau)==TRUE){ $_SESSION["khachhang"] = $kh_db->laythongtinnguoidung($email); include("main.php"); } else{ display_error("Đăng nhập không thành công!"); } break; case "dangky": include("regisform.php"); break; case "xldangky": $email = $_POST["txtemail"]; $matkhau = $_POST["txtmatkhau"]; $hoten = $_POST["txthoten"]; $diachi = $_POST["txtdiachi"]; $quanhuyen = $_POST["txtquanhuyen"]; $tinhthanh = $_POST["txttinhthanh"]; $dienthoai = $_POST["txtdienthoai"]; /* Lưu ý: Trước khi thêm cần kiểm tra (bằng javascript hoặc php): - Email không trùng/chưa tồn tại trong CSDL? - Mật khẩu gõ 2 lần có khớp nhau */ // 1. Thêm thông tin người dùng $makh = $kh_db->themnguoidung($email,$matkhau,$hoten); // 2. Thêm địa chỉ giao nhận (SV tự viết)
Cập nhật thông tin người dùng (người dùng tự thực hiện). Reset mật khẩu, Phân quyền đơn giản (chỉ admin thực hiện).
6
BÀI TẬP THỰC HÀNH 06 Mục đích: Minh họa chức năng mua hàng. Yêu cầu: 1. Trong thư mục model, viết lớp giohang_db.php gồm các phương thức xử lý hàng trong giỏ. 2. Tạo trang chủ mặc định cho ứng dụng, tại thư mục gốc của ứng dụng có các trang sau: index.php: trang điều khiển ứng dụng. home.php: hiển thị (tùy ý) các mặt hàng mới, hàng bán chạy, hàng nổi bật, ... 3. Tạo thư mục giohang, viết các trang sau:
mathang.php: hiển thị thông tin chi tiết mặt hàng được chọn, có thể nhập số lượng và chọn mua (đưa hàng vào giỏ). index.php: trang điều khiển giỏ hàng. main.php: hiển thị thông tin giỏ hàng. Hướng dẫn:
Lớp giohang_db:
// Tạo mảng SESSION giohang rỗng (khi khách hàng mới sử dụng lần đầu) if (!isset($_SESSION['giohang']) ) { $_SESSION['giohang'] = array(); } // Hàm thêm mặt hàng vào giỏ function themhangvaogio($mahang, $soluong) { //Tạo thể hiện của lớp mathang_db $mh_db = new MATHANG_DB(); //Cập nhập Số lượng và SESSION - Làm trịn $_SESSION['giohang'][$mahang] = round($soluong, 0); //Lấy thơng tin của mặt hàng dựa vào $mahang $mh = $mh_db->laymathangtheoma($mahang); //Cập nhật thông tin của Mã danh mục và Tên danh mục vào SESSION $_SESSION['madm_cuoi'] = $mh['madm']; $_SESSION['tendm_cuoi'] = $mh['tendm']; } // Hàm lấy thông tin các mặt hàng có trong giỏ hàng function laygiohang() { //Tạo mảng rỗng để lưu danh sách mặt hàng trong giỏ $mh = array();
$mh_db = new MATHANG_DB(); //Duyệt mảng SESSION giohang lấy từng Mã hàng (mahang) và Số lượng (soluong) foreach ($_SESSION['giohang'] as $mahang => $soluong ) { // Lấy thông tin mặt hàng theo mã $m = $mh_db->laymathangtheoma($mahang); $dongia = $m['giaban']; $solg = intval($soluong); // Tính tiền $sotien = round($dongia * $soluong, 2);
1
// Lưu thông tin trong mảng items để hiển thị lên giỏ hàng $mh[$mahang]['tenhang'] = $m['tenhang']; $mh[$mahang]['giaban'] = $dongia; $mh[$mahang]['soluong'] = $solg; $mh[$mahang]['sotien'] = $sotien; } return $mh; } // Hàm đếm số mặt hàng trong giỏ hàng function demhangtronggio() { return count($_SESSION['giohang']); } // Hàm tính tổng thành tiền trong giỏ hàng function tinhtiengiohang () { $tong = 0; $giohang = laygiohang(); foreach ($giohang as $mh) {