【问题标题】:Codeigniter db->update() VS MySQL native UPDATE Affected rows: 0Codeigniter db->update() VS MySQL 本机 UPDATE 受影响的行:0
【发布时间】:2013-01-21 03:59:23
【问题描述】:

单独使用 MySQL - 如果我对这样的表进行基本更新:

UPDATE `SOMETABLE` SET `NAME` = 'John' WHERE `ID` = 1;

NAME = 'John' 的值已经是 'John' - 换句话说 - 没有什么是新的,没有什么可更新的。 MySQL 返回“受影响的行:0(查询耗时 0.0007 秒)

如果我进行相同的调用 - 现在使用 CodeIgniter - 然后像这样检索受影响的行:

$data = array(
               'NAME' => 'John'
            );

$this->db->where('ID', 1);
$this->db->update('SOMETABLE', $data); 
$affect = $this->db->affected_rows();

echo $affect; // $affect echos 1

$affect 最终等于 1。 我对此没有问题——我只是希望如果没有什么要更新的——codeigniter 的行为方式与 MySQL 相同,并且不会编辑不需要更新的内容,并为受影响的行()返回 0。

  • 我是不是搞错了?
  • codeigniter 是否覆盖了“John”?还是不行?

【问题讨论】:

  • 只是好奇:为什么将 ID 作为字符串传递?
  • 根据您的发现,我想知道负载是什么(我意识到这样一个基本查询为零)。显然,MySQL 正在访问数据库,基本上是在进行选择以查看是否需要更新,然后在需要时进行更新。而 CI 只是进行更新。我假设选择比更新更快/更少资源密集型。好问题。 1-up
  • 我的坏 - @Dwight 在这里提出的建议 $this->db->last_query();导致我发现我的错误。我添加了时间戳日期(DATE_RFC822)

标签: mysql codeigniter rows-affected


【解决方案1】:

尝试使用以下代码获取 CodeIgniter 正在运行的查询:

$this->db->last_query();

同时发布您用于与 MySQL 交互的查询,以确认正在运行完全相同的查询。

CodeIgniter 确实有一个针对 MySQL 的 hack,它可以调整受影响行的报告,但是我的印象是它只适用于 DELETE 查询。如果您查看system/database/drivers/mysql/mysql_driver.phpsystem/database/drivers/mysqli/mysqli_driver.php(无论您使用哪个驱动程序并查看变量var $delete_hack = TRUE;。调整可能会影响您的结果,值得一试吗?

【讨论】:

  • Codeigniter 的功能只有:function affected_rows() { return @mysql_affected_rows($this->conn_id);所以我相信这是你的查询
  • 我的坏 - @Dwight 在这里提出的建议 $this->db->last_query();导致我发现我的错误。我在通话中间添加了时间戳日期(DATE_RFC822),但我忽略了它......我的错......我现在感到尴尬:( - 但真的很高兴你们帮助......我们该怎么办现在这个问题?我不想让任何人对此感到困惑。
猜你喜欢
  • 2016-11-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多