【问题标题】:Codeigniter active record update not working but works on adding a dummy statementCodeigniter 活动记录更新不起作用,但可以添加虚拟语句
【发布时间】:2014-02-02 15:48:04
【问题描述】:

codeigniter 代码序列的行为相当奇怪。 在模型中,下面的代码不起作用,并且不会更新数据库:

$this->db->set($data);
$this->db->where($this->_primaryKey, $id);
$this->db->update($this->_tableName);

如果我在它们之前添加一个虚拟指令并使序列如下所示

$this->db->update('pages', array('body'=>'hhfhj@gmail.com'), "id = 7"); 
//The above statement need not to have any connection with the table I am updating.
// But unless I add the above statement, the statement below are not able to update the database.

$this->db->set($data);
$this->db->where($this->_primaryKey, $id);
$this->db->update($this->_tableName);

我不明白,那个额外的语句做了什么,codeigniter 活动记录功能开始工作而不是其他情况。

第一种情况生成的查询是:

"UPDATE `users` SET `name` = 'Shashank Jagetiya', `email` = 'other@gmail.com', `password` = 'a' WHERE `id` != '2' AND `id` = 2" 

第二种情况生成的查询是:

"UPDATE `users` SET `name` = 'Shashank Jagetiya', `email` = 'adfddfaf@gmail.com', `password` = 'a' WHERE `id` = 2" 

好的,我知道之前的某些情况仍然存在或其他情况......我不知道这是从哪里来的,也不知道如何删除它

【问题讨论】:

  • 你打印了最后一个查询吗?
  • 请贴出您的完整代码,即$data的内容。
  • 如果之前的情况仍然存在,您可以在更新部分开始之前使用$this->db->reset();
  • 我已经发布了这两种情况下的查询。所以 $data 也很清楚。在第一种情况下 id != '2' 之后的额外部分,我不明白它来自哪里
  • 能否请您发布上次查询的回显结果?

标签: database codeigniter activerecord


【解决方案1】:

我怀疑你的问题在这里:

WHERE `id` != '2' 

虽然 2 将被转换为数字类型,但隐式转换会将其转换为浮点数,我敢打赌您的该列的数据类型是 int。

请在casting 上查阅此条目。我建议不要在这种情况下使用“2”,因为它可能会产生意想不到的结果,如上所述。

另外,这个说法

`id` != '2' AND `id` = 2" 

即使您不进行投射,这也总是会解析为 false。

`id` != 2 AND `id` = 2

【讨论】:

  • 是的,数据类型确实是整数,但是我在使用之前确实使用了intval($id)
  • 但是在您的查询中生成的内容仍然将 2 作为字符串传递,这将导致强制转换在 MySQL 方面的查询引擎中浮动。此外,请参阅第二点。
  • 很抱歉,我仍然无法解决此问题。我什至硬编码 '2' 和 2 而不是 $id 来检查任何差异但没有发现。我该如何解决这个问题。请帮忙...
  • 那额外的代码行怎么帮了我...请建议
  • 你看到我上面的第二点了吗?您使用的逻辑在 WHERE 子句中始终解析为 false,因此您的 WHERE 永远不会成功。
猜你喜欢
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2011-05-07
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多