PHP带URL ID参数页面表单提交无法入库且无法跳转回原页问题
问题原因梳理
1. 核心问题:表单提交时未传递会员ID参数
你在lid.php页面的两个表单都没有将当前页面URL里的lidnummer(会员ID)传给后端处理逻辑create.php,导致create.php中$lidnummer = $_GET['lidnummer']完全拿不到有效值,插入数据库时外键字段为空,直接触发写入失败。
2. 跳转语法错误
成功插入后的header跳转语句字符串拼接错误,生成的跳转URL携带多余的单引号,导致跳转路径失效:
// 错误写法:双引号内嵌套单引号拼接逻辑完全错误 header("location: ../lid.php?lidnummer=' . $lidnummer . '"); // 最终生成的URL会变成类似 lid.php?lidnummer=' . 4 . ' 格式错误无法正常访问
3. 其他潜在问题
- 会员查询SQL的
JOIN语句未写关联条件,会产生笛卡尔积,返回大量错误冗余数据 - 会员查询直接拼接用户输入的
lidnummer参数,存在SQL注入风险 INSERT语句未指定字段名,后续表结构调整会直接导致写入失败- 插入失败后依赖JS跳转,用户禁用JS时会无法返回原页面
修复方案
步骤1:修改lid.php的表单,新增隐藏字段传递会员ID
在两个表单内部都添加隐藏input,把当前页面的会员ID随表单一起提交:
<form action="includes/create.php" method="POST"> <!-- 新增隐藏字段传递会员ID --> <input type="hidden" name="lidnummer" value="<?php echo htmlspecialchars($lidnummer); ?>"> <b> <label for="telefoonnummer"> Telefoonnummer: <input type="text" name="telefoonnummer"> </label> <button type="submit" name='add_telnr'>Voeg telnr toe</button> </b> </form><br> <form action="includes/create.php" method="POST"> <!-- 新增隐藏字段传递会员ID --> <input type="hidden" name="lidnummer" value="<?php echo htmlspecialchars($lidnummer); ?>"> <b> <label for="email"> Email: <input type="text" name="email"> </label> <button type="submit" name='add_email'>Voeg email toe</button> </b> </form><br>
步骤2:修改create.php的手机号新增逻辑
邮箱新增逻辑可以参照这段同步修改:
if(isset($_POST['add_telnr'])) { $telnr = get_post($conn, 'telefoonnummer'); // 改为从POST参数拿会员ID,并且做非空校验 $lidnummer = $_POST['lidnummer'] ?? ''; if(empty($lidnummer) || !is_numeric($lidnummer)) { echo '<script> alert("参数错误,请重试") </script>'; echo '<script> window.location.href = "../" </script>'; exit(); } // INSERT语句指定字段名,避免后续表结构变更导致错误 $stmt_telnr = $conn->prepare("INSERT INTO telefoonnummers (telefoonnummer, lidnummer) VALUES(?,?)"); $stmt_telnr->bind_param('si', $telnr, $lidnummer); $execute_result = $stmt_telnr->execute(); if(!$execute_result || $stmt_telnr->affected_rows != 1) { echo '<script> alert("Telefoonnummer niet toegevoegd. Waarschijnlijk bestaat deze al. Controleer de lijst en/of probeer het opnieuw.") </script>'; echo '<script> window.location.href = "../lid.php?lidnummer=' . $lidnummer . '" </script>'; } else { // 修正跳转语法 header("Location: ../lid.php?lidnummer=" . $lidnummer); } $stmt_telnr->close(); exit(); }
步骤3:优化lid.php的会员查询逻辑,修复SQL问题并避免注入
if(isset($_GET['lidnummer'])) { $lidnummer = $_GET['lidnummer']; // 修正JOIN语句,补充关联条件(请替换为你实际的表关联字段名),并且用预处理查询 $select_lid_query = $conn->prepare("SELECT * FROM leden JOIN postcodes ON leden.postcode_id = postcodes.id WHERE lidnummer = ?"); $select_lid_query->bind_param('i', $lidnummer); $select_lid_query->execute(); $select_lid_result = $select_lid_query->get_result(); if($select_lid_result->num_rows == 0) die ("<span style='color:red'>" . "Kon geen gegevens van de database ophalen. Klik a.u.b. op het pijltje terug in de browser en probeert u het opnieuw" . "</span>"); $gegevens_lid = $select_lid_result->fetch_array(MYSQLI_ASSOC); // 后续原有逻辑保持不变 foreach($gegevens_lid as $data => $info) { if($data == 'lidnummer' || $data == 'adres' || $data == 'woonplaats') { echo '<tr>'; echo '<td><b>' . ucfirst(htmlspecialchars($data)) . '</b></td>'; echo '<td>' . htmlspecialchars($info) . '</td>'; echo '<td> ---- </td>'; echo '<td> ---- </td>'; echo '</tr>'; } else { echo '<tr>'; echo '<td><b>' . ucfirst(htmlspecialchars($data)) . '</b></td>'; echo '<td>' . htmlspecialchars($info) . '</td>'; echo '<td> update </td>'; echo '<td> ---- </td>'; echo '</tr>'; } } toon_contactgegevens('telefoonnummers', $gegevens_lid, $conn, 'telefoonnummer', 'lid_table'); toon_contactgegevens('emails', $gegevens_lid, $conn, 'email', 'lid_table'); $select_lid_result->close(); $conn->close(); }
内容的提问来源于stack exchange,提问作者Xavvey
相关产品推荐
相关产品推荐

