Hướng dẫn php pdo comment system - hệ thống bình luận php pdo

Trong hướng dẫn này, chúng tôi sẽ tạo ra một hệ thống bình luận với PHP, MySQL và Ajax (JavaScript). Hệ thống nhận xét sẽ thêm chức năng vào trang web của bạn (blog, trang web tin tức, v.v.) mà khách của bạn có thể sử dụng để gửi nội dung và chia sẻ ý kiến.

Hệ thống bình luận chúng tôi sẽ phát triển ngày hôm nay sẽ tối thiểu, sạch sẽ và nhanh chóng! Và với việc sử dụng AJAX, bạn có thể triển khai hệ thống một cách liền mạch trên bất kỳ trang web nào.

Nhận xét đã gửi sẽ được lưu trữ và truy xuất trong và từ cơ sở dữ liệu MySQL và sau đó được điền với PHP và HTML.

Gói nâng cao bao gồm các tính năng bổ sung và liên kết tải xuống đến mã nguồn.

1. Bắt đầu

Bạn sẽ cần cài đặt môi trường máy chủ web nếu bạn sẽ kiểm tra hệ thống bình luận trên hệ thống máy tính của riêng bạn. Thực hiện theo các hướng dẫn dưới đây.

  • Cài đặt gói giải pháp môi trường máy chủ web - Tôi khuyên bạn nên cài đặt XAMPP.
  • Nếu bạn có máy chủ sản xuất của riêng mình (VPS, chuyên dụng, v.v.), bạn sẽ cần cài đặt PHP, Apache, MySQL và PHPMyAdmin (lưu ý: Chúng đã được bao gồm với XAMPP).
  • Cài đặt một trình soạn thảo mã. Bạn có thể sử dụng Notepad nhưng tôi không khuyên bạn nên sử dụng một trong những điều sau đây: Notepad ++, Visual Studio Code hoặc Atom.

2. Tạo cơ sở dữ liệu và bảng thiết lập

Chúng tôi cần tạo cơ sở dữ liệu MySQL và tạo bảng nhận xét vì đó là những gì chúng tôi sẽ sử dụng để lưu trữ và truy xuất tất cả các nhận xét của chúng tôi. Chúng ta có thể làm điều đó với phpmyadmin.

Điều hướng đến phpmyadmin (ví dụ: http: // localhost/phpmyadmin/) trong trình duyệt của bạn và làm theo các hướng dẫn dưới đây:

  • Nhấp vào tab Cơ sở dữ liệu ở trên cùng
  • Trong Tạo cơ sở dữ liệu, nhập PhpComments trong hộp văn bản
  • Chọn UTF8_General_Ci làm đối chiếu (UTF-8 là mã hóa mặc định trong HTML5)
  • Nhấp vào Tạo

Trong khi cơ sở dữ liệu được chọn, hãy nhấp vào tab SQL và thực hiện mã câu lệnh sau:

CREATE TABLE IF NOT EXISTS `comments` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`page_id` int(11) NOT NULL,
	`parent_id` int(11) NOT NULL DEFAULT '-1',
	`name` varchar(255) NOT NULL,
	`content` text NOT NULL,
	`submit_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `comments` (`id`, `page_id`, `parent_id`, `name`, `content`, `submit_date`) VALUES
(1, 1, -1, 'John Doe', 'Thank you for taking the time to write this article, I really enjoyed reading it!\r\n\r\nThank you, David!', '2020-07-22 14:35:15'),
(2, 1, 11, 'David Adams', 'It''s good to hear that you enjoyed this article.', '2020-07-22 14:36:19'),
(3, 1, -1, 'Michael', 'I appreciate the time and effort you spent writing this article, good job!', '2020-07-22 14:37:43');

Câu lệnh SQL trên sẽ tạo bảng nhận xét với các cột sau:

  • ID - ID bình luận độc đáo.
  • Trang_ID - Điều này sẽ xác định nhận xét nào là trang nào, đó sẽ là ID trang mà bạn có thể chỉ định trên bất kỳ trang web nào.
  • Parent_id - ID bình luận cha mẹ mà chúng tôi sẽ sử dụng để trả lời bình luận.
  • Tên - Tên của người dùng (ví dụ: Joe Bloggs).
  • Nội dung - Nội dung nhận xét sẽ là những gì người dùng nhập thông qua biểu mẫu.
  • đệ trình_date - ngày nhận xét đã được đăng.

Dữ liệu mà chúng tôi chèn vào bảng bình luận sẽ là cho mục đích kiểm tra.

Trong phpmyadmin, cấu trúc bảng sẽ trông giống như sau:

http://localhost/phpmyadmin/

Hướng dẫn php pdo comment system - hệ thống bình luận php pdo

3. Tạo bảng kiểu (CSS3)

Chúng tôi sẽ tạo hai bảng kiểu cho hệ thống bình luận của chúng tôi - một sẽ dành cho trang chủ của chúng tôi vì trang này sẽ được sử dụng như một ví dụ về cách chúng tôi thực hiện hệ thống bình luận. Các kiểu dáng khác sẽ được sử dụng cho chính hệ thống bình luận.

Các kiểu dáng được sử dụng để định dạng bố cục của hệ thống nhận xét của chúng tôi.

Tạo tệp style.css và thêm:

* {
    box-sizing: border-box;
    font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen, ubuntu, cantarell, "fira sans", "droid sans", "helvetica neue", Arial, sans-serif;
    font-size: 16px;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}
body {
    background-color: #FFFFFF;
    margin: 0;
}
.navtop {
    background-color: #3f69a8;
    height: 60px;
    width: 100%;
    border: 0;
}
.navtop div {
    display: flex;
    margin: 0 auto;
    width: 1000px;
    height: 100%;
}
.navtop div h2, .navtop div a {
    display: inline-flex;
    align-items: center;
}
.navtop div h2 {
    flex: 1;
    font-size: 24px;
    padding: 0;
    margin: 0;
    color: #ecf0f6;
    font-weight: normal;
}
.navtop div a {
    padding: 0 20px;
    text-decoration: none;
    color: #c5d2e5;
    font-weight: bold;
}
.navtop div a i {
    padding: 2px 8px 0 0;
}
.navtop div a:hover {
    color: #ecf0f6;
}
.content {
    width: 1000px;
    margin: 0 auto;
}
.content h2 {
    margin: 0;
    padding: 25px 0;
    font-size: 22px;
    border-bottom: 1px solid #ebebeb;
    color: #666666;
}

Tạo tệp bình luận.css và thêm:

.comments .comment_header {
    display: flex;
    justify-content: space-between;
    border-bottom: 1px solid #eee;
    padding: 15px 0;
    margin-bottom: 10px;
    align-items: center;
}
.comments .comment_header .total {
    color: #777777;
    font-size: 14px;
}
.comments .comment_header .write_comment_btn {
    margin: 0;
}
.comments .write_comment_btn, .comments .write_comment button {
    display: inline-block;
    background-color: #565656;
    color: #fff;
    text-decoration: none;
    margin: 10px 0 0 0;
    padding: 5px 10px;
    border-radius: 5px;
    font-size: 14px;
    font-weight: 600;
    border: 0;
}
.comments .write_comment_btn:hover, .comments .write_comment button:hover {
    background-color: #636363;
}
.comments .write_comment {
    display: none;
    padding: 20px 0 10px 0;
}
.comments .write_comment textarea {
    width: 100%;
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 5px;
    height: 150px;
    margin-top: 10px;
}
.comments .write_comment input {
    display: block;
    width: 250px;
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 5px;
    margin-top: 10px;
}
.comments .write_comment button {
    cursor: pointer;
}
.comments .comment {
    padding-top: 10px;
}
.comments .comment .name {
    display: inline;
    padding: 0 5px 3px 0;
    margin: 0;
    font-size: 16px;
    color: #555555;
}
.comments .comment .date {
    color: #888888;
    font-size: 14px;
}
.comments .comment .content {
    padding: 5px 0 5px 0;
}
.comments .comment .reply_comment_btn {
    display: inline-block;
    text-decoration: none;
    margin-bottom: 10px;
    font-size: 14px;
    color: #888888;
}
.comments .comment .replies {
    padding-left: 30px;
}

Hãy thoải mái tùy chỉnh các bảng kiểu ở trên và thêm các quy tắc CSS của riêng bạn.

Bây giờ chúng tôi sẽ bắt đầu mã hóa hệ thống bình luận của chúng tôi với PHP. Trong phần này, chúng tôi sẽ kết nối với cơ sở dữ liệu bằng cách sử dụng PDO, tạo các chức năng mẫu và thực hiện các truy vấn bằng cách sử dụng các câu lệnh đã chuẩn bị (ngăn chặn SQL tiêm).

Tạo tệp bình luận.php và thêm:

Mã trên sẽ kết nối với cơ sở dữ liệu MySQL của chúng tôi bằng giao diện PDO. Hãy nhớ cập nhật các biến kết nối nếu bạn khác nhau.

Thêm vào sau:

// Below function will convert datetime to time elapsed string
function time_elapsed_string($datetime, $full = false) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);
    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;
    $string = array('y' => 'year', 'm' => 'month', 'w' => 'week', 'd' => 'day', 'h' => 'hour', 'i' => 'minute', 's' => 'second');
    foreach ($string as $k => &$v) {
        if ($diff->$k) {
            $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
        } else {
            unset($string[$k]);
        }
    }
    if (!$full) $string = array_slice($string, 0, 1);
    return $string ? implode(', ', $string) . ' ago' : 'just now';
}

Hàm trên sẽ chuyển đổi ngày và thời gian của chúng tôi thành một chuỗi bị xóa, sẽ xuất hiện dưới dạng "1 ngày trước", v.v. trong phần bình luận.

Thêm vào sau:

// This function will populate the comments and comments replies using a loop
function show_comments($comments, $parent_id = -1) {
    $html = '';
    if ($parent_id != -1) {
        // If the comments are replies sort them by the "submit_date" column
        array_multisort(array_column($comments, 'submit_date'), SORT_ASC, $comments);
    }
    // Iterate the comments using the foreach loop
    foreach ($comments as $comment) {
        if ($comment['parent_id'] == $parent_id) {
            // Add the comment to the $html variable
            $html .= '
            

' . htmlspecialchars($comment['name'], ENT_QUOTES) . '

' . time_elapsed_string($comment['submit_date']) . '

' . nl2br(htmlspecialchars($comment['content'], ENT_QUOTES)) . '

Reply ' . show_write_comment_form($comment['id']) . '
' . show_comments($comments, $comment['id']) . '
'; } } return $html; }

Hàm trên sẽ chuyển đổi ngày và thời gian của chúng tôi thành một chuỗi bị xóa, sẽ xuất hiện dưới dạng "1 ngày trước", v.v. trong phần bình luận.

Hàm này sẽ điền vào mảng bình luận và trả về giá trị ở định dạng HTML. Các câu trả lời được điền bằng cách thực hiện cùng một chức năng cùng với ID nhận xét cha mẹ.

Thêm vào sau:

// This function is the template for the write comment form
function show_write_comment_form($parent_id = -1) {
    $html = '
    
'; return $html; }

Hàm trên sẽ chuyển đổi ngày và thời gian của chúng tôi thành một chuỗi bị xóa, sẽ xuất hiện dưới dạng "1 ngày trước", v.v. trong phần bình luận.

Thêm vào sau:

// Page ID needs to exist, this is used to determine which comments are for which page
if (isset($_GET['page_id'])) {
    // Check if the submitted form variables exist
    if (isset($_POST['name'], $_POST['content'])) {
        // POST variables exist, insert a new comment into the MySQL comments table (user submitted form)
        $stmt = $pdo->prepare('INSERT INTO comments (page_id, parent_id, name, content, submit_date) VALUES (?,?,?,?,NOW())');
        $stmt->execute([ $_GET['page_id'], $_POST['parent_id'], $_POST['name'], $_POST['content'] ]);
        exit('Your comment has been submitted!');
    }
    // Get all comments by the Page ID ordered by the submit date
    $stmt = $pdo->prepare('SELECT * FROM comments WHERE page_id = ? ORDER BY submit_date DESC');
    $stmt->execute([ $_GET['page_id'] ]);
    $comments = $stmt->fetchAll(PDO::FETCH_ASSOC);
    // Get the total number of comments
    $stmt = $pdo->prepare('SELECT COUNT(*) AS total_comments FROM comments WHERE page_id = ?');
    $stmt->execute([ $_GET['page_id'] ]);
    $comments_info = $stmt->fetch(PDO::FETCH_ASSOC);
} else {
    exit('No page ID specified!');
}
?>

Hàm trên sẽ chuyển đổi ngày và thời gian của chúng tôi thành một chuỗi bị xóa, sẽ xuất hiện dưới dạng "1 ngày trước", v.v. trong phần bình luận.

Hàm này sẽ điền vào mảng bình luận và trả về giá trị ở định dạng HTML. Các câu trả lời được điền bằng cách thực hiện cùng một chức năng cùng với ID nhận xét cha mẹ.

Thêm vào sau:

comments Write Comment

Hàm trên sẽ chuyển đổi ngày và thời gian của chúng tôi thành một chuỗi bị xóa, sẽ xuất hiện dưới dạng "1 ngày trước", v.v. trong phần bình luận.

Hàm show_write_comment_form () sẽ hiển thị biểu mẫu mà khách truy cập có thể sử dụng để viết và gửi nhận xét.

Đó là tất cả mọi thứ chúng ta cần để mã trong tệp này. Bước tiếp theo là triển khai hệ thống nhận xét trên trang web bằng AJAX.

Bây giờ chúng tôi đã tạo tệp PHP phía máy chủ của mình, chúng tôi có thể triển khai hệ thống nhận xét trên trang web của chúng tôi.

Tạo tệp index.html và thêm:



	
		
		Comments System
		
		
	
	

	    

		

Article

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam tristique vel leo a vestibulum. Praesent varius ex elit, vitae pretium felis laoreet in. Nullam sit amet pretium nulla. Aliquam convallis sem vitae tincidunt pulvinar. Integer id ex efficitur, vulputate ante et, vulputate risus. Maecenas ac nunc est. Donec nisl turpis, aliquet quis turpis mollis, dictum pulvinar est. Vivamus ut suscipit turpis. Sed metus leo, dignissim non vehicula non, tincidunt ac velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Nunc id lacinia mauris. Aliquam pellentesque orci et neque egestas, vel lobortis risus egestas. Curabitur non rhoncus nibh. Donec ante lorem, luctus eget ex eget, malesuada ornare nisl. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam consectetur egestas magna non dignissim. Pellentesque sit amet mollis mauris. Nunc quis arcu ac diam tempus auctor. Proin nec commodo nisl. Duis gravida lorem quis ipsum mattis, id finibus tortor pretium. Nam maximus pretium nisi, ullamcorper tincidunt dolor sagittis ac. Donec suscipit neque lectus, id fringilla tortor pellentesque ut. Maecenas quam lectus, pharetra vitae commodo sit amet, iaculis quis massa. Aenean varius quam quis posuere viverra. Nullam varius condimentum sem, sit amet bibendum augue porttitor in.

Morbi purus turpis, finibus vel fermentum nec, egestas eu elit. Fusce eleifend ac massa sit amet eleifend. Suspendisse sit amet facilisis augue. Praesent vitae dui lacus. Suspendisse sodales nisl massa, quis vehicula ante rutrum vitae. Proin scelerisque vestibulum purus, ac ultrices sapien malesuada vel. Proin sit amet tristique orci. Vestibulum in tortor ante.

Đây là trang mẫu mà chúng tôi sẽ sử dụng để hiển thị nhận xét của chúng tôi, tệp không cần phải ở định dạng PHP vì chúng tôi sẽ sử dụng AJAX để truy xuất các bình luận từ trang bình luận của chúng tôi.php.

Thêm mã này ngay trước khi thẻ kết thúc thẻ:

* {
    box-sizing: border-box;
    font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen, ubuntu, cantarell, "fira sans", "droid sans", "helvetica neue", Arial, sans-serif;
    font-size: 16px;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}
body {
    background-color: #FFFFFF;
    margin: 0;
}
.navtop {
    background-color: #3f69a8;
    height: 60px;
    width: 100%;
    border: 0;
}
.navtop div {
    display: flex;
    margin: 0 auto;
    width: 1000px;
    height: 100%;
}
.navtop div h2, .navtop div a {
    display: inline-flex;
    align-items: center;
}
.navtop div h2 {
    flex: 1;
    font-size: 24px;
    padding: 0;
    margin: 0;
    color: #ecf0f6;
    font-weight: normal;
}
.navtop div a {
    padding: 0 20px;
    text-decoration: none;
    color: #c5d2e5;
    font-weight: bold;
}
.navtop div a i {
    padding: 2px 8px 0 0;
}
.navtop div a:hover {
    color: #ecf0f6;
}
.content {
    width: 1000px;
    margin: 0 auto;
}
.content h2 {
    margin: 0;
    padding: 25px 0;
    font-size: 22px;
    border-bottom: 1px solid #ebebeb;
    color: #666666;
}
0

Mã JavaScript ở trên sẽ truy xuất các nhận xét bằng API tìm nạp và nối chúng vào thùng chứa nhận xét.

Nếu bạn sẽ thêm nhận xét trên một trang khác, bạn sẽ cần cập nhật biến bình luận_page_id vì số phải là duy nhất trên mỗi trang, trừ khi bạn sẽ hiển thị các nhận xét tương tự.

Và bây giờ nếu chúng tôi điều hướng đến tệp này trong trình duyệt web của chúng tôi (qua localhost), chúng tôi sẽ thấy một cái gì đó như sau:

http://localhost/phpcomments/index.html

Hướng dẫn php pdo comment system - hệ thống bình luận php pdo

Hãy nhớ kiểm tra các tính năng của hệ thống bình luận và đảm bảo mọi thứ hoạt động như bình thường.

Sự kết luận

Xin chúc mừng! Bạn đã tạo thành công một hệ thống bình luận với PHP, MySQL và AJAX.

Tiếp theo là gì? Xem xét triển khai các tính năng của riêng bạn cho hệ thống và tích hợp hệ thống với các dự án của riêng bạn.

Hãy chia sẻ bài viết này và bỏ bình luận nếu bạn thích nó.

Nếu bạn muốn hỗ trợ chúng tôi, hãy xem xét việc mua một gói bên dưới vì nó sẽ giúp chúng tôi tạo ra nhiều hướng dẫn hơn và giữ cho máy chủ của chúng tôi hoạt động. Các gói bao gồm mã được cải thiện và các tính năng sáng tạo hơn.

Nâng cao

Mã nguồn

Cơ sở dữ liệu Tệp SQL

Hệ thống bình luận an toàn

Mẫu trang chủ

Nhận xét lớp JavaScript

Sắp xếp theo tính năng (phiếu bầu, mới nhất, lâu đời nhất)

Tính năng bình luận phiếu bầu

Nhận xét tính năng hình ảnh

Tính năng tạo tài khoản

Nhận xét định dạng tính năng

Tính năng phê duyệt

Tính năng phân trang

Cải thiện mã

Bảng điều khiển quản trị - Bảng điều khiển - Xem/Tạo/Chỉnh sửa Nhận xét - Bình luận phê duyệt - Bộ lọc - Quản lý tài khoản - Cài đặt
— Dashboard
— View/create/edit comments
— Approve comments
— Filters
— Manage Accounts
— Settings

Thiết kế đáp ứng (thân thiện với thiết bị di động)

Tệp SCSS

Mã nhận xét

Cập nhật và hỗ trợ miễn phí (lỗi và các vấn đề nhỏ)

Hướng dẫn sử dụng

* Thanh toán được xử lý với PayPal/Stripe. * Gói nâng cao cũng bao gồm nguồn hướng dẫn.
* Advanced package also includes the tutorial source.

Để biết thêm thông tin chi tiết về gói nâng cao, bấm vào đây.