
本文详解如何在 php 中基于 url 参数(如 id)安全、高效地从 mysql 数据库中获取单个商品详情,避免误查全部数据,并使用预处理语句防范 sql 注入。
本文详解如何在 php 中基于 url 参数(如 id)安全、高效地从 mysql 数据库中获取单个商品详情,避免误查全部数据,并使用预处理语句防范 sql 注入。
在构建电商类网站时,产品详情页(如 details.php)的核心需求是:点击某个商品后,仅展示该商品的完整信息,而非所有商品列表。你当前的代码问题在于——它始终执行 SELECT * FROM products WHERE featured=1,即固定查询所有“推荐商品”,而未利用用户点击所携带的唯一标识(如商品 ID)。这导致无论点击哪个商品,页面都渲染全部匹配项。
要实现“按需加载单条记录”,关键在于两点:动态接收 ID 参数 + 安全参数化查询。以下是完整、可落地的解决方案:
✅ 正确做法:使用预处理语句绑定 $_GET['id']
首先确保你的链接正确传递 ID,例如在商品列表页中这样写:
<a href="details.php?id=123">查看商品详情</a> <a href="details.php?id=456">查看商品详情</a>
然后修改 details.php 如下(已优化错误处理与结构):
立即学习“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'])) {
die("错误:无效的商品 ID");
}
$product_id = (int)$_GET['id'];
// 3. 使用预处理语句防止 SQL 注入
$sql = "SELECT * FROM products WHERE id = ?";
$stmt = mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, 'i', $product_id); // 'i' 表示整型参数
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
// 4. 获取单条记录(注意:不是 while 循环!)
$product = mysqli_fetch_assoc($result);
// 5. 检查记录是否存在
if (!$product) {
die("未找到 ID 为 {$product_id} 的商品");
}
?>
<!-- HTML 渲染部分 -->
<div class="col">
<div class="col-md-8">
<div class="row">
<h2 class="text-center">Product Details</h2>
<div class="col-md-5">
<h4><?= htmlspecialchars($product['title']); ?></h4>
@@##@@"
height="200" width="300"
alt="<?= htmlspecialchars($product['title']); ?>" />
<p class="price">Price: <?= htmlspecialchars($product['price']); ?></p>
<p class="desc">Description: <?= htmlspecialchars($product['description']); ?></p>
<p class="bname">Brandname: <?= htmlspecialchars($product['brandname']); ?></p>
</div>
</div>
</div>
</div>⚠️ 关键注意事项
- 绝不拼接 $_GET 到 SQL 中:原始写法 WHERE id=".$_GET['id'] 极易引发 SQL 注入攻击;
- 始终验证输入类型:用 (int) 强制转换或 filter_var($_GET['id'], FILTER_VALIDATE_INT);
- 启用错误报告(开发阶段):添加 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 可捕获底层异常;
- 输出内容需转义:使用 htmlspecialchars() 防止 XSS 攻击,尤其对用户可控字段(如 title, description);
- 处理空结果:若 ID 不存在,应友好提示而非报错或空白页;
- 考虑扩展性:如需同时满足「ID 查询」和「featured=1」条件,WHERE 子句应为 WHERE id = ? AND featured = 1(本例中原需求含 featured=1,请按实际业务调整)。
✅ 总结
实现单品详情页的本质,是将前端动作(点击)映射为后端精准查询。通过 $_GET['id'] 接收标识、预处理语句绑定参数、单行结果提取与安全渲染,即可彻底解决“显示全部而非单个”的问题。这套模式不仅适用于商品详情,也广泛用于用户资料页、文章详情页等场景——核心逻辑一致:URL 传参 → 参数校验 → 预处理查询 → 单记录渲染。











