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

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也是可行的,但要解决切换记录时的更新问题:

  1. 页面开头必须启动Session:在所有输出之前加session_start();
  2. 选择记录时立即更新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); 
} 
?>
  1. 更新时从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:12:28