
本文详解如何在 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 传参 → 参数校验 → 预处理查询 → 单记录渲染。
发表于:后端开发
近三天内
复制链接