PHP开发中两次POST请求/函数间bejelentesID变量丢失导致数据库更新失败问题
解决PHP数据库更新时bejelentesID丢失的问题
嘿,作为PHP新手遇到这种变量丢失的问题太正常了!我帮你分析下原因,再给几个靠谱的解决方案:
问题根源
你现在的流程是:选择记录(第一次POST)→ 显示可修改内容 → 提交更新(第二次POST)。两次POST是独立的请求,第二次请求里根本没带上bejelentesID,自然就找不到要更新的记录了。直接在SQL工具里能生效是因为你手动指定了ID,但代码里第二次请求没传这个值。
最稳妥的解决方案:表单隐藏字段传递ID
这是最简单直接的方法,完全不会有切换记录的冲突问题。在你显示可修改内容的表单里,加一个隐藏字段把bejelentesID存起来,提交更新的时候就会自动带上这个值。
具体修改:
在回显修改表单的代码里(比如你展示megjegyzesSzoveg的地方),添加这个隐藏字段:
<form method="post" action="你的处理页面.php"> <!-- 你的可修改字段,比如备注输入框 --> <textarea name="megjegyzes"><?php echo htmlspecialchars($bejelMegjegyz); ?></textarea> <!-- 其他字段:intezkedes、szerelo的选择框等 --> <!-- 重点:添加隐藏字段保存bejelentesID --> <input type="hidden" name="bejelentesID" value="<?php echo htmlspecialchars($bejelentesID); ?>"> <button type="submit" name="updateBejelentes">更新记录</button> </form>
然后在处理更新的逻辑里,直接从$_POST获取这个ID:
<?php if(isset($_POST['updateBejelentes'])){ // 直接拿到传递过来的bejelentesID $bejelentesID = $_POST['bejelentesID']; $intezkedes = $_POST['intezkedes']; $megjegyzes = $_POST['megjegyzes']; $szerelo = $_POST['szerelo']; // 调用更新函数 $modObj = new adatlekerdezes(); $modObj->bejelentesMod($intezkedes, $megjegyzes, $szerelo, $bejelentesID); } ?>
这样每次提交更新都会对应正确的记录ID,切换记录时新的表单会带新的ID,完全不会冲突。
关于Session的可行性:可以用,但要注意细节
如果你想用Session保存ID也是可行的,但要解决切换记录时的更新问题:
- 页面开头必须启动Session:在所有输出之前加
session_start(); - 选择记录时立即更新Session:当用户选择新的记录时,把ID存入Session,覆盖旧值:
<?php session_start(); if(isset($_POST['bejelentesKivalasztas'])){ $bejelentesID = $_POST['bejelentes_ID']; $_SESSION['bejelentesID'] = $bejelentesID; // 每次选新记录都更新Session $boltCimBeolvasas = new adatlekerdezes($bejelentesID); $boltCimBeolvasas->boltCimBeolvasas($bejelentesID); } ?>
- 更新时从Session取ID:
if(isset($_POST['updateBejelentes'])){ $bejelentesID = $_SESSION['bejelentesID']; // 从Session获取 // 其他参数获取... $modObj->bejelentesMod($intezkedes, $megjegyzes, $szerelo, $bejelentesID); }
⚠️ 注意:Session的缺点是如果用户开多个标签页修改不同记录,后选的记录ID会覆盖Session里的值,导致第一个标签页更新时用错ID。所以隐藏字段的方式更可靠。
额外建议:修复SQL注入漏洞
你的代码现在直接把用户输入拼到SQL里,非常危险,容易被SQL注入攻击。建议改用mysqli预处理语句,既安全又能避免字符串拼接的语法错误(比如备注里有单引号会导致SQL报错)。
举个更新函数的修改例子:
public function bejelentesMod($intezkedes, $megjegyzes, $szerelo, $bejelentesID){ $this->kapcsolodas(); // 先查szereloID,用预处理 $sqlSzerelo = "SELECT szereloID FROM szerelo WHERE szerelo_nev = ?"; $stmt = mysqli_prepare($this->kapcs, $sqlSzerelo); mysqli_stmt_bind_param($stmt, "s", $szerelo); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $szereloAdat = mysqli_fetch_array($result); $this->szereloID = $szereloAdat['szereloID']; // 更新语句用预处理 $sqlUpdate = "UPDATE hibarogzites SET megjegyzesSzoveg = ?, intezkedesID = ?, szereloID = ?, felhasznaloID = ? WHERE bejelentesID = ?"; $stmt = mysqli_prepare($this->kapcs, $sqlUpdate); // 绑定参数:s=字符串,i=整数(根据你的字段类型调整) mysqli_stmt_bind_param($stmt, "siiii", $megjegyzes, $intezkedes, $this->szereloID, $this->felhasznaloID, $bejelentesID); $updateSuccess = mysqli_stmt_execute($stmt); if($updateSuccess){ $this->message = "A bejegyzés módosítva"; } else{ // 加上错误信息方便调试 $this->message = "A bejegyzés módosítása nem sikerült: " . mysqli_error($this->kapcs); } }
这样不仅安全,还能帮你排查可能的SQL语法问题。
内容的提问来源于stack exchange,提问作者krolga
相关产品推荐
相关产品推荐

