当可能没有更新行时,使用 Codeigniter 检查 db->update 是不是成功

Posted

技术标签:

【中文标题】当可能没有更新行时,使用 Codeigniter 检查 db->update 是不是成功【英文标题】:Check if db->update successful with Codeigniter when potentially no rows are updated当可能没有更新行时,使用 Codeigniter 检查 db->update 是否成功 【发布时间】:2013-11-30 14:11:22 【问题描述】:

我一直在使用$this->db->affected_rows() 来检查更新是否成功。但是,当用户输入已存储的要存储的相同数据时,这不起作用(因为实际上没有更新任何列)。我的解决方法是获取存储的数据,与输入的数据进行比较,如果不同则更新,如果相同则返回 NO_CHANGE 常量。对于 JSON 数据,有一个额外的解析步骤。

有没有更简单的方法来检查更新没有错误?例如,不需要事先获取存储数据的东西?

【问题讨论】:

这能回答你的问题吗? How can I detect a create, update, delete query is successful in Codeigniter 【参考方案1】:

如果我理解正确,您可以使用事务来确保更新没有错误:

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->update('table',$array);
$this->db->trans_complete();

if ($this->db->trans_status() === FALSE)

    // generate an error... or use the log_message() function to log your error

请记住,这仅验证在事务中的所有查询期间没有 SQL 错误。

这里是更多信息的链接Code Igniter Active Record Transaction

【讨论】:

这很有帮助,使用 $this->db->affected_rows() >=0 将在没有新数据提交时返回 false。这个建议为我解决了这个问题。谢谢!【参考方案2】:

除了接受的答案解决方案之外,您还可以扩展如下代码以区分 affected_rowstrans_status 结果/错误。

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->update('table',$array);
$this->db->trans_complete();
// was there any update or error?
if ($this->db->affected_rows() == '1') 
    return TRUE;
 else 
    // any trans error?
    if ($this->db->trans_status() === FALSE) 
        return false;
    
    return true;

【讨论】:

【参考方案3】:

Mirov 当我们使用 codeigniter 时,数据只有在输入字段的值发生一些变化时才会更新,然后$this->db->affected_rows() 将返回大于 0 的值。

假设我们有两个字段nameemail,如果我们尝试在不更改任何字段的情况下提交表单,那么$this->db->affected_rows() 将返回 0,否则它将返回 1。

所以更好的方法是使用

if($this->db->affected_rows() >=0)
  return true; //add your code here
else
  return false; //add your your code here

【讨论】:

这不应该是 $this->db->affected_rows() > 0 那么吗? 所以如果有更新应该显示 1 或 0,只是对此感到困惑 @Freddy Sidauruk 它应该大于 0,我使用了 >= 0,因为有时用户打开某个编辑面板并点击更新按钮而不更改面板中的任何内容。在那种情况下,我将使用 =0,在其他情况下,我将使用 >= 0。希望你明白我的意思。 如果您不想编写一些额外的代码行(即事务),这是一个很好的答案......【参考方案4】:

我的“解决方法”很简单——包括一个总是更新的字段。例如,如果您有一个字段并使用带有秒数的日期和时间值更新它——那么即使其他更新值仍然相同,日期时间秒数也将始终不同。

奖励是您在 db 记录中有一个日期时间,用于显示上次更新完成的时间。

【讨论】:

【参考方案5】:

我不知道为什么我们不能只使用这个:

if ($this->db->update('table',$array) === FALSE)
    // generate an error... or use the log_message() function to log your error

【讨论】:

因为没有语法错误且不影响行的查询与没有语法错误且成功影响行的查询之间存在差异。

以上是关于当可能没有更新行时,使用 Codeigniter 检查 db->update 是不是成功的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 当一个表可能没有对应的行时,如何在查询中组合 2 个表

在 UITableView 中选择行时变量不更新

Codeigniter 查询更新所有行而不是 1

在单元格编辑模式下,单击其他行时,不会更新kendo(可排序)网格值

Codeigniter 3.1 - 获取数据库错误号

原子指令:当比较和交换指令正在进行时,其他线程如何更新值?