为什么这个 PDO 准备语句不更新记录?

Why does this PDO prepared statement not update the record?

我有一个登录系统,我目前正在将它转换为 PDO,但我认为我的代码有问题,因为每当我 运行 原始代码工作时,当我 运行 PDO 它没有(控制台中没有错误)。

这是我的原始代码:

 $update_otp = "UPDATE classadmin SET code = $code, status = $status WHERE code = $fetch_code";
 $update_res = mysqli_query($con, $update_otp);

这是我的 PDO 转换代码:

$update_otp  = $conn->prepare("UPDATE classadmin SET code = :code, status = :status WHERE code = :code");
$update_res = $update_otp->execute(['code' => $code, 'status' => $status, 'code' => $fetch_code]);

code 在给定语句中作为命名参数出现两次,有两个 不同的 值。这不会起作用,除非 $code === $fetch_code.


这可能会对您有所帮助,使用 distinct 名称作为命名参数(您完全可以自由选择它们,它们不需要与列名匹配):

$update_otp  = $conn->prepare("UPDATE classadmin SET code = :newCode, status = :status WHERE code = :oldCode");
$update_res = $update_otp->execute(['newCode' => $code, 'status' => $status, 'oldCode' => $fetch_code]);

使用模拟准备语句时(这是 PDO 的默认设置),相同的占位符可以在 SQL 中出现多次。您在 SQL 中有两次 :code。您在 execute 中为 :code 提供的值将替换名为 :code.

的两个占位符

在PHP中,关联数组不能具有相同键的相同值。后面的会用相同的键覆盖值。

$update_otp  = $conn->prepare("
    UPDATE classadmin 
    SET 
      code     = :code, 
      status   = :status 
    WHERE code = :code
");
$update_res = $update_otp->execute([
    'code'   => $code, 
    'status' => $status, 
    'code'   => $fetch_code // <-- This one will overwrite the first $code
]);

要解决此问题,请使用明确命名的占位符或改用位置参数。