如何实现仅允许已购商品用户提交评价的验证功能?
商品评价系统的用户购买验证方案(适配Slug传参)
1. 先通过Slug获取商品ID
前端传参是商品slug,第一步需要将其转换为商品ID,才能关联订单明细进行校验:
// 获取GET参数中的商品slug $product_slug = $_GET['product']; // 从商品表查询对应ID(假设表名为products,slug字段为`slug`,主键为`id`) $stmt = $pdo->prepare("SELECT id FROM products WHERE slug = ?"); $stmt->execute([$product_slug]); $product = $stmt->fetch(PDO::FETCH_ASSOC); // 商品不存在时直接拦截 if (!$product) { exit("该商品不存在"); } $product_id = $product['id'];
2. 验证用户是否购买过该商品
关联订单主表(sales)和订单明细(details),用当前用户ID和商品ID做校验:
$current_user_id = $user['id']; // 统计用户是否有包含该商品的有效订单 $stmt = $pdo->prepare(" SELECT COUNT(*) AS purchased FROM sales s INNER JOIN details d ON s.id = d.sale_id WHERE s.user_id = ? AND d.product_id = ? -- 可选:如果订单有状态区分,只允许已完成订单评价,可添加 AND s.status = 'completed' "); $stmt->execute([$current_user_id, $product_id]); $purchase_check = $stmt->fetch(PDO::FETCH_ASSOC); // 校验通过则允许提交评价,否则拦截 if ($purchase_check['purchased'] > 0) { // 执行评价提交逻辑(插入评价表等操作) } else { exit("你未购买过该商品,无法提交评价"); }
关键注意点
- 给商品表的
slug字段添加唯一约束,避免重复slug导致查询混乱 - 全程使用预处理语句,杜绝SQL注入风险
- 若订单有状态区分(比如待付款、已完成),建议只允许对已完成的订单商品评价,避免用户恶意评价未完成订单
内容的提问来源于stack exchange,提问作者kowelt
相关产品推荐
相关产品推荐

