当前位置:首页 > PHP

php实现评分功能

2026-02-16 12:47:34PHP

数据库设计

创建数据库表存储评分数据,表结构可包含字段:id(主键)、item_id(被评分项ID)、user_id(用户ID)、score(分数)、created_at(评分时间)。示例SQL:

CREATE TABLE ratings (
    id INT AUTO_INCREMENT PRIMARY KEY,
    item_id INT NOT NULL,
    user_id INT NOT NULL,
    score TINYINT NOT NULL CHECK (score BETWEEN 1 AND 5),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

评分表单

前端使用HTML表单提交评分,限制分数范围为1-5星。表单需包含CSRF防护:

php实现评分功能

<form action="rate.php" method="post">
    <input type="hidden" name="item_id" value="123">
    <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
    <select name="score">
        <option value="1">1星</option>
        <option value="5">5星</option>
    </select>
    <button type="submit">提交评分</button>
</form>

后端处理

PHP接收表单数据并验证,防止重复评分:

// rate.php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('CSRF验证失败');
    }

    $itemId = (int)$_POST['item_id'];
    $score = (int)$_POST['score'];
    $userId = $_SESSION['user_id'] ?? 0;

    // 验证分数范围
    if ($score < 1 || $score > 5) {
        die('无效评分');
    }

    // 检查是否已评分
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
    $stmt = $pdo->prepare('SELECT id FROM ratings WHERE item_id = ? AND user_id = ?');
    $stmt->execute([$itemId, $userId]);

    if ($stmt->fetch()) {
        die('您已评分');
    }

    // 插入新评分
    $stmt = $pdo->prepare('INSERT INTO ratings (item_id, user_id, score) VALUES (?, ?, ?)');
    $stmt->execute([$itemId, $userId, $score]);

    header('Location: item.php?id='.$itemId);
}

显示平均分

计算并显示项目平均评分:

php实现评分功能

// item.php
$itemId = (int)$_GET['id'];
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');

// 获取平均分
$stmt = $pdo->prepare('SELECT AVG(score) as avg_score FROM ratings WHERE item_id = ?');
$stmt->execute([$itemId]);
$avgScore = round($stmt->fetch()['avg_score'], 1);

echo "当前评分: {$avgScore}星";

星级显示

使用HTML/CSS显示星级评分:

<div class="stars">
    <?php for ($i = 1; $i <= 5; $i++): ?>
        <span class="star <?= $i <= round($avgScore) ? 'filled' : '' ?>">★</span>
    <?php endfor; ?>
</div>

<style>
.star { color: #ccc; font-size: 24px; }
.star.filled { color: #ffcc00; }
</style>

防止刷分

添加IP限制和频率控制:

// 在rate.php中追加
$ip = $_SERVER['REMOTE_ADDR'];
$stmt = $pdo->prepare('SELECT COUNT(*) FROM ratings WHERE ip = ? AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)');
$stmt->execute([$ip]);
if ($stmt->fetchColumn() > 10) {
    die('评分过于频繁');
}

标签: 评分功能
分享给朋友:

相关文章

h5能实现的功能

h5能实现的功能

H5能实现的功能 H5(HTML5)是一种现代的网页技术标准,具备丰富的功能和特性,适用于多种场景。以下是H5能够实现的主要功能: 多媒体支持 H5原生支持音频和视频播放,无需依赖Flash等插件。…

vue实现注册功能

vue实现注册功能

前端实现注册功能 在Vue中实现注册功能通常需要结合表单验证、HTTP请求和状态管理。以下是一个基于Vue 3和Element Plus的完整实现方案: 模板部分 <template>…

vue 实现多选功能

vue 实现多选功能

Vue 实现多选功能的方法 使用 v-model 绑定数组 在 Vue 中,可以通过 v-model 绑定一个数组来实现多选功能。适用于复选框组(checkbox)或下拉多选(select multi…

php实现回复功能

php实现回复功能

实现回复功能的基本步骤 在PHP中实现回复功能通常涉及数据库操作、表单处理和前后端交互。以下是实现回复功能的关键步骤: 数据库设计 创建包含回复数据的表结构,例如: CREATE TABLE re…

vue 实现拖拽功能

vue 实现拖拽功能

Vue 实现拖拽功能的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue实现备注功能

vue实现备注功能

实现备注功能的基本思路 在Vue中实现备注功能通常涉及表单输入、数据绑定和状态管理。可以通过以下方法实现: 使用v-model进行双向数据绑定 创建一个textarea或input元素,使用v-mo…