
通过 url 参数传递商品 id,在单一详情页(如 item1.php)中动态查询并渲染对应商品的完整信息,避免为每个商品创建独立页面,提升可维护性与扩展性。
通过 url 参数传递商品 id,在单一详情页(如 item1.php)中动态查询并渲染对应商品的完整信息,避免为每个商品创建独立页面,提升可维护性与扩展性。
要实现“所有商品共用一个详情页,点击不同商品显示对应信息”,核心思路是:将商品唯一标识(如 product_id)作为查询参数附加在链接中,由详情页接收该参数、查询数据库,并动态输出内容。这比为每个商品硬编码跳转链接(如当前 onclick="location.href='item1.php'")更规范、可扩展且符合 RESTful 原则。
✅ 正确实现步骤
1. 在首页(index.php)中为每个商品生成带 ID 的链接
假设你的商品数据来自 MySQL 表 products,含字段 id, name, price, original_price, image_path 等。请替换静态 HTML 为 PHP 循环查询结果,并生成语义化 标签:
<!-- 替换你原有的 div.onclick 块 -->
<?php $result = mysqli_query($con, "SELECT id, name, price, original_price, image_path FROM products");
while ($row = mysqli_fetch_assoc($result)) { ?><div class="col-1">
<a href="item1.php?id=<?php%20echo%20urlencode(%24row['id']);%20?>" style="display: block; text-decoration: none; color: inherit;">
@@##@@" alt="<?php echo htmlspecialchars($row['name']); ?>">
<h4><?php echo htmlspecialchars($row['name']); ?></h4>
<p>$<?php echo number_format($row['price'], 2); ?><?php if ($row['original_price'] > $row['price']): ?>
<strike> $<?php echo number_format($row['original_price'], 2); ?></strike>
<?php endif; ?></p>
</a>
</div>
<?php } ?>
? 关键点:使用 ?id=123 传递主键(推荐整型 ID),而非随机字符串;urlencode() 防止特殊字符破坏 URL;htmlspecialchars() 防止 XSS。
2. 在 item1.php 中安全获取 ID 并查询详情
确保该文件包含数据库连接,并严格校验输入:
<?php session_start();
include("connection.php");
include("functions.php");
// 1. 安全获取并验证 product ID
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
http_response_code(400);
die("Invalid or missing product ID.");
}
$product_id = (int)$_GET['id'];
// 2. 查询单条商品数据(使用预处理防止 SQL 注入)
$stmt = $con->prepare("SELECT id, name, description, price, original_price, image_path, stock FROM products WHERE id = ?");
$stmt->bind_param("i", $product_id);
$stmt->execute();
$product = $stmt->get_result()->fetch_assoc();
if (!$product) {
http_response_code(404);
die("Product not found.");
}
?>
<title>
<?php echo htmlspecialchars($product['name']); ?> - Details</title><div class="product-detail">
@@##@@"
alt="<?php echo htmlspecialchars($product['name']); ?>">
<h1><?php echo htmlspecialchars($product['name']); ?></h1>
<p><?php echo nl2br(htmlspecialchars($product['description'])); ?></p>
<div class="price">
<span class="current">$<?php echo number_format($product['price'], 2); ?></span>
<?php if ($product['original_price'] > $product['price']): ?>
<span class="original"><strike>$<?php echo number_format($product['original_price'], 2); ?></strike></span>
<?php endif; ?>
</div>
<p>Stock: <?php echo $product['stock']; ?></p>
</div>
⚠️ 注意事项与最佳实践
- 永远不要信任 $_GET 输入:必须类型转换(如 (int))或白名单校验,再用于 SQL 查询;
- 使用预处理语句(Prepared Statements):杜绝 SQL 注入风险(示例中已采用);
- 添加 HTTP 状态码:ID 无效返回 400 Bad Request,商品不存在返回 404 Not Found;
- 转义输出内容:所有用户数据(如 name, description)必须经 htmlspecialchars() 处理;
- 优化体验:可在 item1.php 中添加“返回列表”链接,例如 ← Back to Products;
- SEO 友好建议:后续可升级为 item1.php?id=123&slug=rooster-chicken-18,用 slug 提升 URL 可读性(但查询仍以 id 为主键)。
通过以上结构,你只需维护一个 item1.php 文件,即可支持无限商品扩展——新增商品仅需插入数据库,无需修改任何前端跳转逻辑。这才是现代电商页面的可持续开发模式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











