
本文详解如何在电商网站中实现“点击商品跳转详情页”功能,核心是使用带参数绑定的预处理语句(prepared statement)按 id 安全、精准地从数据库获取单条记录,避免返回全部数据。
本文详解如何在电商网站中实现“点击商品跳转详情页”功能,核心是使用带参数绑定的预处理语句(prepared statement)按 id 安全、精准地从数据库获取单条记录,避免返回全部数据。
在构建电商类网站时,product-details.php 页面的目标非常明确:仅展示用户当前点击的那一件商品的完整信息。但许多开发者初写时容易误用 SELECT * FROM products WHERE featured=1 这类无条件筛选的查询,导致页面一次性渲染所有“推荐商品”,违背了单页单商品的设计逻辑。
根本原因在于:原始代码未接收并利用 URL 中传递的唯一标识(如 id=123),也未限制查询结果集为单行——这正是问题症结所在。正确做法是:通过 GET 参数动态传入商品 ID,并在 SQL 查询中精确匹配该 ID,同时必须采用预处理语句防止 SQL 注入。
以下是优化后的 details.php 完整实现(含安全校验与结构优化):
<?php
// 1. 数据库连接(建议封装为独立配置文件)
$con = mysqli_connect('localhost', 'root', '', 'Test');
if (!$con) {
die("数据库连接失败: " . mysqli_connect_error());
}
// 2. 检查并过滤 ID 参数(关键防御步骤)
if (!isset($_GET['id']) || !is_numeric($_GET['id']) || (int)$_GET['id'] <= 0) {
http_response_code(400);
exit("错误:无效的商品 ID");
}
$product_id = (int)$_GET['id'];
// 3. 使用预处理语句安全查询单条记录
$sql = "SELECT * FROM products WHERE id = ?";
$stmt = mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, 'i', $product_id);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
// 4. 获取单条数据(注意:无需 while 循环)
$product = mysqli_fetch_assoc($result);
// 5. 若未找到对应商品,友好提示
if (!$product) {
http_response_code(404);
exit("<h3>抱歉,未找到该商品</h3>");
}
?>
<!DOCTYPE html>
<html>
<head><title><?= htmlspecialchars($product['title']); ?> - 商品详情</title></head>
<body>
<div class="col">
<div class="col-md-8">
<div class="row">
<h2 class="text-center">商品详情</h2>
<div class="col-md-5">
<h4><?= htmlspecialchars($product['title']); ?></h4>
@@##@@"
height="200" width="300"
alt="<?= htmlspecialchars($product['title']); ?>" />
<p class="price">价格:¥<?= number_format($product['price'], 2); ?></p>
<p class="desc">描述:<?= nl2br(htmlspecialchars($product['description'])); ?></p>
<p class="bname">品牌:<?= htmlspecialchars($product['brandname']); ?></p>
</div>
</div>
</div>
</div>
</body>
</html>✅ 关键改进说明:
立即学习“PHP免费学习笔记(深入)”;
- 精准查询:WHERE id = ? 替代宽泛条件,确保只返回一条记录;
- 安全防护:使用 mysqli_prepare() + bind_param() 阻断 SQL 注入;额外增加 is_numeric() 和范围校验,双重过滤恶意输入;
- 健壮性增强:添加数据库连接异常判断、ID 有效性验证及 404/400 状态码响应;
- XSS 防御:对所有输出到 HTML 的变量使用 htmlspecialchars() 转义;
- 用户体验优化:价格格式化、描述换行支持(nl2br)、语义化标题等。
⚠️ 注意事项:
- 切勿直接拼接 $_GET['id'] 到 SQL 字符串中(如 "WHERE id = {$_GET['id']}"),这是高危漏洞;
- 建议将数据库连接抽象为独立函数或使用 PDO,便于后续维护与迁移;
- 生产环境应禁用 display_errors,改用日志记录错误;
- 若需支持 SEO 友好的 URL(如 /product/123/shoes-name),可借助 .htaccess 重写 + 路由解析,但底层仍需 ID 查询逻辑。
通过以上重构,你的 details.php?id=123 将稳定、安全、高效地呈现唯一商品,为电商详情页打下坚实基础。











