如何在PHP循环生成的卡片中通过提交按钮传递住宿ID到详情页?
问题:循环生成卡片时传递住宿ID到详情页的问题
我用mysqli_query遍历accommodation表生成14张摘要卡片,每张卡片有提交按钮跳转到info.php详情页。现在想通过提交按钮传递对应行的accommodationID,这样一个详情页就能根据ID加载对应内容。
目前遇到的问题:
- 用GET方法时URL会追加ID,但用
$_GET['accommodationID']提示未定义索引 - 用
$_SESSION['accommodationID']只会得到循环最后一个ID(14)
附现有代码:
<?php $query = "SELECT * FROM accommodation"; $result = mysqli_query($conn, $query); if ($result){ if(mysqli_num_rows($result) > 0){ while($fetch = mysqli_fetch_assoc($result)){ ?> <div class="summary-card"> <img src="<?php echo $fetch['main_image'] ?>" > <p> <?php echo $fetch['name'], $fetch['ID'] ?> </p> <p> <?php echo $fetch['location'] ?> </p> <p>from <?php echo $fetch['price'] ?> </p> <form action="info.php" method="get"> <input type="submit" name="<?php echo $fetch['ID'] ?>" value="More info" > </form> </div> <?php } } } ?>
解决方案
问题出在表单的参数传递方式上:你把按钮的name设为了ID值,导致详情页无法通过固定的accommodationID索引获取值;而SESSION会被循环覆盖,最终只保留最后一个ID。
正确的做法是在表单里添加隐藏输入框传递ID,按钮的name保持统一即可:
修改后的卡片生成代码
<?php // 限制只查询14条数据,符合需求 $query = "SELECT * FROM accommodation LIMIT 14"; $result = mysqli_query($conn, $query); if ($result && mysqli_num_rows($result) > 0) { while($fetch = mysqli_fetch_assoc($result)){ ?> <div class="summary-card"> <img src="<?php echo htmlspecialchars($fetch['main_image']); ?>" alt="<?php echo htmlspecialchars($fetch['name']); ?>"> <p><?php echo htmlspecialchars($fetch['name']); ?> (ID: <?php echo $fetch['ID']; ?>)</p> <p><?php echo htmlspecialchars($fetch['location']); ?></p> <p>from <?php echo htmlspecialchars($fetch['price']); ?></p> <form action="info.php" method="get"> <!-- 隐藏输入框传递固定名称的ID参数 --> <input type="hidden" name="accommodationID" value="<?php echo $fetch['ID']; ?>"> <input type="submit" value="More info"> </form> </div> <?php } } ?>
详情页info.php的处理代码
在info.php中,通过$_GET['accommodationID']即可获取对应卡片的ID,再查询数据库加载内容:
<?php // 先校验参数合法性 if(isset($_GET['accommodationID']) && is_numeric($_GET['accommodationID'])){ $accommodationID = intval($_GET['accommodationID']); // 使用预处理语句防止SQL注入 $query = "SELECT * FROM accommodation WHERE ID = ?"; $stmt = mysqli_prepare($conn, $query); mysqli_stmt_bind_param($stmt, "i", $accommodationID); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if(mysqli_num_rows($result) > 0){ $accommodation = mysqli_fetch_assoc($result); // 输出详情内容示例 echo "<h1>" . htmlspecialchars($accommodation['name']) . "</h1>"; echo "<img src='" . htmlspecialchars($accommodation['main_image']) . "' alt=''>"; echo "<p>位置:" . htmlspecialchars($accommodation['location']) . "</p>"; echo "<p>价格:" . htmlspecialchars($accommodation['price']) . "</p>"; // 其他字段按需输出 } else { echo "未找到对应的住宿信息"; } } else { echo "无效的请求参数"; } ?>
关键说明
- 隐藏输入框:通过
<input type="hidden">传递ID,确保每个表单携带对应行的ID,且参数名统一为accommodationID,详情页可稳定获取。 - htmlspecialchars:输出用户提供的内容时转义,防止XSS攻击。
- 预处理语句:详情页查询用预处理绑定参数,避免SQL注入风险。
- LIMIT 14:在SQL中添加限制,确保只生成14张卡片。
内容的提问来源于stack exchange,提问作者Gospel77
相关产品推荐
相关产品推荐

