php实现评分
PHP 实现评分功能
评分功能通常涉及用户输入评分、计算平均分以及存储评分数据。以下是几种常见的实现方式:
数据库表设计
创建一个数据库表来存储用户评分数据:
CREATE TABLE ratings (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
item_id INT,
rating INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
提交评分表单
创建一个简单的 HTML 表单让用户提交评分:
<form method="post" action="rate.php">
<input type="hidden" name="item_id" value="123">
<select name="rating">
<option value="1">1 星</option>
<option value="2">2 星</option>
<option value="3">3 星</option>
<option value="4">4 星</option>
<option value="5">5 星</option>
</select>
<button type="submit">提交评分</button>
</form>
处理评分提交
创建 rate.php 文件处理评分提交:
<?php
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
// 获取表单数据
$item_id = $_POST['item_id'];
$rating = $_POST['rating'];
$user_id = $_SESSION['user_id']; // 假设用户已登录
// 插入评分数据
$stmt = $db->prepare("INSERT INTO ratings (user_id, item_id, rating) VALUES (?, ?, ?)");
$stmt->execute([$user_id, $item_id, $rating]);
// 重定向回原页面
header("Location: item.php?id=$item_id");
exit();
?>
计算平均评分
在显示物品的页面计算并显示平均评分:
<?php
// 获取物品ID
$item_id = $_GET['id'];
// 计算平均评分
$stmt = $db->prepare("SELECT AVG(rating) as avg_rating FROM ratings WHERE item_id = ?");
$stmt->execute([$item_id]);
$result = $stmt->fetch();
$avg_rating = round($result['avg_rating'], 1);
// 显示评分
echo "平均评分: $avg_rating 星";
?>
显示星级评分
可以用HTML和CSS显示星级评分:
<?php
function displayStars($rating) {
$fullStars = floor($rating);
$halfStar = ($rating - $fullStars) >= 0.5 ? 1 : 0;
$emptyStars = 5 - $fullStars - $halfStar;
$output = '';
for ($i = 0; $i < $fullStars; $i++) {
$output .= '<span class="star full">★</span>';
}
if ($halfStar) {
$output .= '<span class="star half">★</span>';
}
for ($i = 0; $i < $emptyStars; $i++) {
$output .= '<span class="star empty">★</span>';
}
return $output;
}
echo displayStars($avg_rating);
?>
.star {
color: #ccc;
font-size: 24px;
}
.star.full {
color: gold;
}
.star.half {
position: relative;
}
.star.half:after {
content: '★';
position: absolute;
left: 0;
width: 50%;
overflow: hidden;
color: gold;
}
防止重复评分
如果需要防止用户对同一物品多次评分:

// 检查是否已评分
$stmt = $db->prepare("SELECT * FROM ratings WHERE user_id = ? AND item_id = ?");
$stmt->execute([$user_id, $item_id]);
if ($stmt->rowCount() > 0) {
// 用户已评分,更新评分
$stmt = $db->prepare("UPDATE ratings SET rating = ? WHERE user_id = ? AND item_id = ?");
$stmt->execute([$rating, $user_id, $item_id]);
} else {
// 新评分
$stmt = $db->prepare("INSERT INTO ratings (user_id, item_id, rating) VALUES (?, ?, ?)");
$stmt->execute([$user_id, $item_id, $rating]);
}
这些方法可以根据具体需求进行调整和扩展,实现更复杂的评分系统功能。






