php点赞实现
PHP 点赞功能实现
PHP 点赞功能的实现通常涉及前端交互、后端处理和数据库存储。以下是实现点赞功能的详细方法:
前端部分
创建一个简单的点赞按钮,使用 HTML 和 JavaScript 实现点击事件:
<button id="like-btn" onclick="likePost(1)">点赞</button>
<span id="like-count">0</span>
<script>
function likePost(postId) {
fetch('like.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: 'post_id=' + postId
})
.then(response => response.json())
.then(data => {
if(data.success) {
document.getElementById('like-count').innerText = data.likes;
}
});
}
</script>
后端处理
创建 like.php 文件处理点赞请求:
<?php
header('Content-Type: application/json');
// 假设已连接数据库
$db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$postId = $_POST['post_id'] ?? 0;
// 防止SQL注入
$postId = filter_var($postId, FILTER_VALIDATE_INT);
if(!$postId) {
echo json_encode(['success' => false]);
exit;
}
// 更新点赞数
$stmt = $db->prepare("UPDATE posts SET likes = likes + 1 WHERE id = :id");
$stmt->bindParam(':id', $postId, PDO::PARAM_INT);
$success = $stmt->execute();
// 获取更新后的点赞数
$stmt = $db->prepare("SELECT likes FROM posts WHERE id = :id");
$stmt->bindParam(':id', $postId, PDO::PARAM_INT);
$stmt->execute();
$likes = $stmt->fetchColumn();
echo json_encode([
'success' => $success,
'likes' => $likes
]);
?>
数据库结构
创建存储点赞数的数据表:
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT,
likes INT DEFAULT 0
);
防止重复点赞
为防止用户多次点赞,可以添加用户标识和记录表:
CREATE TABLE post_likes (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT,
user_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY (post_id, user_id)
);
修改 like.php 添加用户验证:
// 添加用户验证
session_start();
$userId = $_SESSION['user_id'] ?? 0;
// 检查是否已点赞
$stmt = $db->prepare("SELECT id FROM post_likes WHERE post_id = :post_id AND user_id = :user_id");
$stmt->bindParam(':post_id', $postId);
$stmt->bindParam(':user_id', $userId);
$stmt->execute();
if($stmt->fetch()) {
echo json_encode(['success' => false, 'message' => '已点赞']);
exit;
}
// 记录点赞
$stmt = $db->prepare("INSERT INTO post_likes (post_id, user_id) VALUES (:post_id, :user_id)");
$stmt->bindParam(':post_id', $postId);
$stmt->bindParam(':user_id', $userId);
$stmt->execute();
// 更新点赞数
$stmt = $db->prepare("UPDATE posts SET likes = likes + 1 WHERE id = :id");
$stmt->bindParam(':id', $postId);
$success = $stmt->execute();
AJAX 优化
优化前端 AJAX 请求,添加错误处理和加载状态:
function likePost(postId) {
const btn = document.getElementById('like-btn');
btn.disabled = true;
fetch('like.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: 'post_id=' + postId
})
.then(response => {
if(!response.ok) throw new Error('Network error');
return response.json();
})
.then(data => {
if(data.success) {
document.getElementById('like-count').innerText = data.likes;
} else {
alert(data.message || '操作失败');
}
})
.catch(error => {
console.error('Error:', error);
alert('请求失败');
})
.finally(() => {
btn.disabled = false;
});
}
安全性增强
添加 CSRF 防护和更多验证:
// 添加 CSRF token 验证
session_start();
if(!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
echo json_encode(['success' => false, 'message' => '无效请求']);
exit;
}
// 前端添加 CSRF token
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
以上实现涵盖了基本的点赞功能,包括前端交互、后端处理、数据库存储和安全性考虑。根据实际需求可以进一步扩展功能,如取消点赞、点赞列表展示等。







