为什么这个 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
]);
要解决此问题,请使用明确命名的占位符或改用位置参数。
我有一个登录系统,我目前正在将它转换为 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
]);
要解决此问题,请使用明确命名的占位符或改用位置参数。