
本文详解如何在电商产品详情页中,基于 url 参数 id 精准查询并展示唯一商品数据,避免返回全部记录;重点使用 mysqli 预处理语句防止 sql 注入,确保代码安全、健壮且符合最佳实践。
本文详解如何在电商产品详情页中,基于 url 参数 id 精准查询并展示唯一商品数据,避免返回全部记录;重点使用 mysqli 预处理语句防止 sql 注入,确保代码安全、健壮且符合最佳实践。
在构建电商平台的 product-details.php 页面时,一个常见误区是:页面加载时执行无条件查询(如 WHERE featured=1),导致所有“精选商品”一并渲染——这显然违背了“点击某商品才显示其详情”的交互逻辑。正确做法是通过 URL 传递唯一标识(如 id),并在服务端据此精确检索单条记录。
✅ 正确实现步骤
-
接收并验证 ID 参数
使用 $_GET['id'] 获取 URL 中的 id 值(例如 details.php?id=42),并务必检查其是否存在且为合法整数:if (!isset($_GET['id']) || !is_numeric($_GET['id'])) { die('Invalid or missing product ID.'); } $product_id = (int) $_GET['id']; -
改写 SQL 查询,使用预处理语句
将原始查询 SELECT * FROM products WHERE featured=1 替换为带占位符的参数化查询,并绑定 $product_id:$con = mysqli_connect('localhost', 'root', '', 'Test'); // 注意:补全密码参数(生产环境勿用空密码) if (!$con) die('Database connection failed.'); $sql = "SELECT * FROM products WHERE id = ?"; // 移除 featured=1 条件(除非业务明确要求“仅展示精选商品的详情”) $stmt = mysqli_prepare($con, $sql); mysqli_stmt_bind_param($stmt, 'i', $product_id); // 'i' 表示整型参数 mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); -
获取单条结果,而非循环遍历
使用 mysqli_fetch_assoc() 读取一条记录即可,无需 while 循环:$product = mysqli_fetch_assoc($result); if (!$product) { die('Product not found.'); } -
安全渲染页面内容
在 HTML 中直接输出已验证的 $product 字段(注意:若字段含用户输入内容,建议额外使用 htmlspecialchars() 转义):<div class="col-md-5"> <h4><?= htmlspecialchars($product['title']) ?></h4> @@##@@" height="200" width="300" alt="<?= htmlspecialchars($product['title']) ?>"> <p class="price">Price: <?= number_format($product['price'], 2) ?></p> <p class="desc">Description: <?= htmlspecialchars($product['description']) ?></p> <p class="bname">Brand: <?= htmlspecialchars($product['brandname']) ?></p> </div>
⚠️ 关键注意事项
- 安全性优先:永远不要拼接 $_GET 参数到 SQL 字符串中(如 "WHERE id = ".$_GET['id']),极易引发 SQL 注入攻击。预处理语句是强制标准。
- 连接参数完整性:mysqli_connect() 应包含用户名和密码(示例中缺失密码,生产环境必须补全)。
- 错误处理不可省略:需检查数据库连接、查询执行、结果是否存在等环节,避免空白页或致命错误。
- 业务逻辑校验:若需求是“仅允许查看 featured=1 的商品详情”,则 WHERE 条件应保留 AND featured = 1;否则应移除,以支持所有商品访问。
- URL 构建示例:在商品列表页中,每个商品链接应形如 View Details。
通过以上重构,details.php 将严格按 id 返回且仅返回一条匹配记录,既满足功能需求,又大幅提升应用安全性与可维护性。











