You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 "无效的请求参数";
}
?>

关键说明

  1. 隐藏输入框:通过<input type="hidden">传递ID,确保每个表单携带对应行的ID,且参数名统一为accommodationID,详情页可稳定获取。
  2. htmlspecialchars:输出用户提供的内容时转义,防止XSS攻击。
  3. 预处理语句:详情页查询用预处理绑定参数,避免SQL注入风险。
  4. LIMIT 14:在SQL中添加限制,确保只生成14张卡片。

内容的提问来源于stack exchange,提问作者Gospel77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:36:26