当前位置:首页 > 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防护:

<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);
}

显示平均分

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

// 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('评分过于频繁');
}

php实现评分功能

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

相关文章

vue修改功能实现

vue修改功能实现

Vue 修改功能的实现方法 在 Vue 中实现修改功能通常涉及表单绑定、数据更新和事件处理。以下是几种常见的实现方式: 数据双向绑定 使用 v-model 指令实现表单元素与 Vue 实例数据的双…

vue实现星星评分

vue实现星星评分

vue实现星星评分的方法 使用组件实现星星评分 创建一个可复用的星星评分组件,通过v-for循环渲染星星图标,利用动态绑定类名实现选中和未选中状态。 <template> <…

uniapp实现选项卡功能

uniapp实现选项卡功能

实现选项卡功能的基本方法 在uniapp中实现选项卡功能通常需要使用uni-segmented-control组件或自定义样式结合swiper组件。以下是两种常见实现方式: 使用uni-segme…

vue功能实现难点

vue功能实现难点

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

php购物车功能实现

php购物车功能实现

数据库设计 购物车功能通常需要设计数据库表来存储商品和用户信息。常见的表包括: products 表:存储商品信息,如商品ID、名称、价格、库存等。 users 表:存储用户信息,如用户ID、用户名…

h5能实现抽题功能吗

h5能实现抽题功能吗

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