我有一个执行方法时始终返回true的模型方法。即使我给它一个不存在于我的数据库中的随机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;
    }
}


我的控制器方法

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控制器方法一个无意义的参数,例如“ asdf”,即使我的设置表中不存在此类ID,该方法仍返回true。

怎么了?

最佳答案

这是正常现象。如果execute()返回true,则仅表示执行该语句时没有SQL代码/数据库/网络错误。如果没有记录受语句影响,则自然不将其视为错误。

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

值得注意的是,UPDATE的行为取决于建立与数据库的连接时设置的标志,并且REPLACEON DUPLICATE KEY UPDATE的行为可能会异常。

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

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

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

10-10 07:43