php实现和MySQL实现评论
PHP 实现评论功能
创建数据库表存储评论数据,表结构通常包含评论ID、用户ID、内容、时间戳等字段。示例SQL语句如下:
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
建立PHP连接数据库的配置文件,使用PDO或MySQLi扩展:
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
插入评论的PHP处理脚本:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$content = htmlspecialchars($_POST['content']);
$stmt = $db->prepare("INSERT INTO comments (user_id, content) VALUES (?, ?)");
$stmt->execute([$_SESSION['user_id'], $content]);
}
显示评论的PHP代码示例:
$stmt = $db->query("SELECT * FROM comments ORDER BY created_at DESC");
while ($row = $stmt->fetch()) {
echo "<div class='comment'><p>{$row['content']}</p></div>";
}
MySQL 实现评论功能
优化评论表结构设计,添加外键约束和索引:
ALTER TABLE comments
ADD CONSTRAINT fk_user
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE;
创建存储过程处理评论插入:
DELIMITER //
CREATE PROCEDURE add_comment(IN user_id INT, IN content TEXT)
BEGIN
INSERT INTO comments (user_id, content) VALUES (user_id, content);
END //
DELIMITER ;
使用触发器自动更新评论计数:
CREATE TRIGGER update_comment_count
AFTER INSERT ON comments
FOR EACH ROW
UPDATE users SET comment_count = comment_count + 1 WHERE id = NEW.user_id;
实现评论分页查询的SQL:
SELECT * FROM comments
WHERE post_id = 123
ORDER BY created_at DESC
LIMIT 10 OFFSET 0;
安全增强措施
参数化查询防止SQL注入:
$stmt = $db->prepare("SELECT * FROM comments WHERE id = ?");
$stmt->execute([$comment_id]);
内容过滤处理XSS攻击:
$content = filter_var($_POST['content'], FILTER_SANITIZE_STRING);
实现CSRF防护机制:
$_SESSION['token'] = bin2hex(random_bytes(32));
if ($_POST['token'] !== $_SESSION['token']) {
die('Invalid CSRF token');
}
性能优化方案
为常用查询字段添加索引:
CREATE INDEX idx_comment_user ON comments(user_id);
CREATE INDEX idx_comment_time ON comments(created_at);
实现评论缓存机制:
$cache = new Redis();
$cache->connect('127.0.0.1', 6379);
if (!$cache->get('comments_'.$post_id)) {
$comments = fetch_comments_from_db($post_id);
$cache->set('comments_'.$post_id, serialize($comments), 3600);
}






