Step 1: tạo file xử lý Thanh toán
- Tạo file
/frontend/thanhtoan/thanhtoan.php
<?php // Hiển thị tất cả lỗi trong PHP // Chỉ nên hiển thị lỗi khi đang trong môi trường Phát triển (Development) // Không nên hiển thị lỗi trên môi trường Triển khai (Production) ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Load các thư viện (packages) do Composer quản lý vào chương trình require_once __DIR__ . '/../../vendor/autoload.php'; // Sử dụng thư viện PHP Mailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // hàm `session_id()` sẽ trả về giá trị SESSION_ID (tên file session do Web Server tự động tạo) // - Nếu trả về Rỗng hoặc NULL => chưa có file Session tồn tại if (session_id() === '') { // Yêu cầu Web Server tạo file Session để lưu trữ giá trị tương ứng với CLIENT (Web Browser đang gởi Request) session_start(); } // Đã người dùng chưa đăng nhập -> hiển thị thông báo yêu cầu người dùng đăng nhập if (!isset($_SESSION['kh_tendangnhap_logged']) || empty($_SESSION['kh_tendangnhap_logged'])) { echo 'Vui lòng Đăng nhập trước khi Thanh toán! <a href="/php/myhand/backend/auth/login.php">Click vào đây để đến trang Đăng nhập</a>'; die; } else { // Nếu giỏ hàng trong session rỗng, return if (!isset($_SESSION['giohangdata']) || empty($_SESSION['giohangdata'])) { echo 'Giỏ hàng rỗng. Vui lòng chọn Sản phẩm trước khi Thanh toán!'; die; } // Nếu đã đăng nhập, tạo Đơn hàng // Truy vấn database // 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn include_once(__DIR__ . '/../../dbconnect.php'); /* --- --- 2.Truy vấn dữ liệu Khách hàng --- Lấy giá trị khóa chính được truyền theo dạng QueryString Parameter key1=value1&key2=value2... --- */ $kh_tendangnhap = $_SESSION['kh_tendangnhap_logged']; // var_dump($kh_tendangnhap);die; $sqlSelectKhachHang = <<<EOT SELECT * FROM `khachhang` kh WHERE kh.kh_tendangnhap = '$kh_tendangnhap' EOT; // var_dump($sqlSelectKhachHang);die; // Thực thi câu truy vấn SQL để lấy về dữ liệu ban đầu của record $resultSelectKhachHang = mysqli_query($conn, $sqlSelectKhachHang); // Khi thực thi các truy vấn dạng SELECT, dữ liệu lấy về cần phải phân tích để sử dụng // Thông thường, chúng ta sẽ sử dụng vòng lặp while để duyệt danh sách các dòng dữ liệu được SELECT // Ta sẽ tạo 1 mảng array để chứa các dữ liệu được trả về $khachhangRow; while ($row = mysqli_fetch_array($resultSelectKhachHang, MYSQLI_ASSOC)) { $khachhangRow = array( 'kh_tendangnhap' => $row['kh_tendangnhap'], 'kh_ten' => $row['kh_ten'], 'kh_email' => $row['kh_email'], 'kh_diachi' => $row['kh_diachi'], ); } /* --- End Truy vấn dữ liệu Khách hàng --- */ // Thông tin đơn hàng $dh_ngaylap = date('Y-m-d'); // Lấy ngày hiện tại theo định dạng yyyy-mm-dd $dh_ngaygiao = date('Y-m-d'); $dh_noigiao = ''; $dh_trangthaithanhtoan = 0; // Mặc định là 0 chưa thanh toán $httt_ma = 1; // Mặc định là 1 // 2. Thực hiện câu lệnh Tạo mới (INSERT) Đơn hàng // Câu lệnh INSERT $sqlInsertDonHang = <<<EOT INSERT INTO `dondathang` (`dh_ngaylap`, `dh_ngaygiao`, `dh_noigiao`, `dh_trangthaithanhtoan`, `httt_ma`, `kh_tendangnhap`) VALUES ('$dh_ngaylap', '$dh_ngaygiao', N'$dh_noigiao', '$dh_trangthaithanhtoan', '$httt_ma', '$kh_tendangnhap'); EOT; // print_r($sqlInsertDonHang); die; // Thực thi INSERT Đơn hàng mysqli_query($conn, $sqlInsertDonHang); // 3. Lấy ID Đơn hàng mới nhất vừa được thêm vào database // Do ID là tự động tăng (PRIMARY KEY và AUTO INCREMENT), nên chúng ta không biết được ID đă tăng đến số bao nhiêu? // Cần phải sử dụng biến `$conn->insert_id` để lấy về ID mới nhất // Nếu thực thi câu lệnh INSERT thành công thì cần lấy ID mới nhất của Đơn hàng để làm khóa ngoại trong Chi tiết đơn hàng $dh_ma = $conn->insert_id; // var_dump($dh_ma);die; // Thông tin các dòng chi tiết đơn hàng $giohangdata = $_SESSION['giohangdata']; // 4. Duyệt vòng lặp qua mảng các dòng Sản phẩm của chi tiết đơn hàng được gởi đến qua request POST foreach ($giohangdata as $item) { // 4.1. Chuẩn bị dữ liệu cho câu lệnh INSERT vào table `sanpham_dondathang` $sp_ma = $item['sp_ma']; $sp_dh_soluong = $item['soluong']; $sp_dh_dongia = $item['gia']; // 4.2. Câu lệnh INSERT $sqlInsertSanPhamDonDatHang = <<<EOT INSERT INTO `sanpham_dondathang` (`sp_ma`, `dh_ma`, `sp_dh_soluong`, `sp_dh_dongia`) VALUES ($sp_ma, $dh_ma, $sp_dh_soluong, $sp_dh_dongia); EOT; // 4.3. Thực thi INSERT mysqli_query($conn, $sqlInsertSanPhamDonDatHang); } // 5. Gởi mail thông báo cho khách hàng về Đơn hàng đã đặt $mail = new PHPMailer(true); // Passing `true` enables exceptions try { //Server settings $mail->SMTPDebug = 2; // Enable verbose debug output $mail->isSMTP(); // Set mailer to use SMTP $mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = 'hotro.nentangtoituonglai@gmail.com'; // SMTP username $mail->Password = 'yjkkdiyfjwksktot'; // SMTP password $mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted $mail->Port = 587; // TCP port to connect to $mail->CharSet = "UTF-8"; // Bật chế bộ tự mình mã hóa SSL $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) ); //Recipients $mail->setFrom('hotro.nentangtoituonglai@gmail.com', 'Mail Liên hệ'); $mail->addAddress($khachhangRow['kh_email']); // Add a recipient // $mail->addCC('cc@example.com'); // $mail->addBCC('bcc@example.com'); //Attachments // $mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments // $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name //Content $mail->isHTML(true); // Set email format to HTML // Tiêu đề Mail $mail->Subject = "[Có đơn hàng vừa thanh toán] - Mã đơn hàng $dh_ma"; // Nội dung Mail // Lưu ý khi thiết kế Mẫu gởi mail // - Chỉ nên sử dụng TABLE, TR, TD, và các định dạng cơ bản của CSS để thiết kế // - Các đường link/hình ảnh có sử dụng trong mẫu thiết kế MAIL phải là đường dẫn WEB có thật, ví dụ như logo,banner,... $templateDonHang = '<ul>'; $templateDonHang .= '<li>Họ tên khách hàng: ' . $khachhangRow['kh_ten'] . '</li>'; $templateDonHang .= '<li>Địa chỉ khách hàng: ' . $khachhangRow['kh_diachi'] . '</li>'; $templateDonHang .= '<ul>'; $stt = 1; $templateChiTietDonHang = '<table border="1" width="100%">'; $templateChiTietDonHang .= '<tr>'; $templateChiTietDonHang .= '<td>STT</td>'; $templateChiTietDonHang .= '<td>Sản phẩm</td>'; $templateChiTietDonHang .= '<td>Số lượng</td>'; $templateChiTietDonHang .= '<td>Giá</td>'; $templateChiTietDonHang .= '<td>Thành tiền</td>'; $templateChiTietDonHang .= '</tr>'; foreach ($giohangdata as $item) { $templateChiTietDonHang .= '<tr>'; $templateChiTietDonHang .= '<td>' . $stt . '</td>'; $templateChiTietDonHang .= '<td>' . $item['sp_ten'] . '</td>'; $templateChiTietDonHang .= '<td>' . $item['soluong'] . '</td>'; $templateChiTietDonHang .= '<td>' . $item['gia'] . '</td>'; $templateChiTietDonHang .= '<td>' . ($item['soluong'] * $item['gia']) . '</td>'; $templateChiTietDonHang .= '</tr>'; $stt++; } $templateChiTietDonHang .= '</table>'; $body = <<<EOT <table border="1" width="100%"> <tr> <td colspan="2"> <img src="http://learning.nentang.vn/php/myhand/assets/shared/img/logo-nentang.jpg" style="width: 100px; height: 100px; border: 1px solid red;" /> </td> </tr> <tr> <td>Có Đơn hàng vừa thanh toán</td> <td> <h2>Thông tin đơn hàng</h2> $templateDonHang <h2>Chi tiết đơn hàng</h2> $templateChiTietDonHang </td> </td> </table> EOT; $mail->Body = $body; $mail->send(); } catch (Exception $e) { echo 'Lỗi khi gởi mail: ', $mail->ErrorInfo; } // 5. Thực thi hoàn tất, điều hướng về trang Danh sách // Hủy dữ liệu giỏ hàng trong session unset($_SESSION['giohangdata']); echo 'Đặt hàng thành công. <a href="/php/myhand/frontend/">Bấm vào đây để quay về trang chủ</a>'; }
Chương trình học
Các bài học
Bài học trước Bài học tiếp theo
Chương trình học
Bao gồm Module, Chương, Bài học, Bài tập, Kiểm tra...Chương trình học
Bài học trước Bài học tiếp theo