当前位置:首页 > 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('评分过于频繁');
}

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

相关文章

原生实现vue功能

原生实现vue功能

原生 JavaScript 实现 Vue 核心功能 使用原生 JavaScript 模拟 Vue 的核心功能(如数据绑定、虚拟 DOM、响应式更新等),可以通过以下方式实现: 数据响应式系统 通过…

vue功能实现难点

vue功能实现难点

Vue 功能实现的常见难点 响应式系统深度监听 Vue 的响应式系统基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3),但对嵌套对象或数组的深层属性变化需要额外…

vue实现模态功能

vue实现模态功能

Vue 实现模态框功能 方法一:使用组件和v-if/v-show控制显示 创建独立的模态框组件(如Modal.vue),通过props接收标题、内容等数据,使用v-if或v-show控制显示状态。…

h5能实现抽题功能吗

h5能实现抽题功能吗

H5实现抽题功能的技术方案 H5完全能够实现抽题功能,主要通过前端技术结合后端数据交互完成。以下是具体实现方式: 前端技术实现 HTML5结合JavaScript可以动态生成和展示题目,利用DOM操…

php实现回复功能

php实现回复功能

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

vue实现全选功能

vue实现全选功能

实现全选功能的基本思路 在Vue中实现全选功能通常需要绑定一个全选复选框的状态,并通过v-model或事件监听控制子选项的选中状态。核心逻辑包括全选按钮与子选项的双向数据绑定,以及状态同步。 数据准…