gpt4 book ai didi

php mysqli bind_param $insert->execute() 始终返回 true

转载 作者:行者123 更新时间:2023-11-29 10:34:51 26 4
gpt4 key购买 nike

我有一个模型方法,在执行时始终返回 true。即使我给它一个随机 ID 号,该 ID 号不存在于我的数据库中

我的模型方法

public function updateSetting($data, $id)
{
$con = new Database();
$insert = $con->mysqli->prepare('UPDATE `settings` SET `value` = ? WHERE `id` = ?');
$insert->bind_param('ss', $data, $id);
if ($insert->execute()) {
return true;
} else {
return false;
}
}

我的 Controller 方法

public function updatePasswordSetting()
{
if (isset($_POST['pw_setting'])) {
$strong_pw = 1;
} else {
$strong_pw = null;
}
if (!$this->settings_model->updateSetting($strong_pw, 'asdf')) {
exit('Could not update password setting');
}
}

在上面的方法中,我给 updateSetting Controller 方法提供了一个无意义的参数,例如“asdf”,并且该方法仍然返回 true,即使我的设置表中不存在这样的 id。

发生了什么?

最佳答案

这是正常行为。如果execute()返回true,这仅仅意味着执行该语句时没有SQL代码/数据库/网络错误。如果没有记录受语句影响,那么很自然不会将其视为错误

正如 @SearchAndResQ 所建议的,您可以检查受影响的行。但请注意,这有其警告,因此您应该阅读 MySQL 的 ROW_COUNT() documentationmysql_affected_rows() documentation首先(其中一个必须由 PHP 在幕后使用)。

值得注意的是,UPDATE 的行为取决于建立数据库连接时设置的标志,并且 REPLACEON 可能会出现意外行为重复 key 更新

就我个人而言,在这种情况下我更喜欢另一种方法。我首先SELECT有问题的记录FOR UPDATE,然后查看结果集以检查是否有任何记录受到影响。然后我在记录仍然锁定的情况下进行更新。您需要为此使用事务(无论如何我正在这样做,因此额外的努力并不算太糟糕)。

恕我直言,该方法更可移植,其结果更容易理解,因此它通常比 affected_rows 机制更安全。它的缺点是需要使用事务并且可能会比较慢。

关于php mysqli bind_param $insert->execute() 始终返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46628365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com