【发布时间】:2011-11-30 18:58:55
【问题描述】:
我在调试CodeIgniter活动记录时发现了这个问题,如下所示:
$this->db->from("table_name");
$this->db->where("field_name", "");
$result = $this->db->get()->result_array();
结果查询是:
SELECT * FROM `table_name` WHERE `field_name` = 0; // Returns all rows in table
即使将空字符串强制转换为 0,我们仍希望得到一个空结果,因为 table_name.field_name 充满了非空字符串值。但是,我从这个查询中得到了整个表。有谁明白为什么?这一点都不直观。
我尝试了没有强制转换为 0 的查询,它可以工作:
SELECT * FROM `table_name` WHERE `field_name` = ""; // Empty result
为什么要强制转换为 0?
编辑:使用这种替代 CodeIgniter 语法会发生相同的强制转换为 0:
$this->db->query('SELECT * FROM table_name WHERE field_name = ?', array(""));
【问题讨论】:
-
您使用的是什么数据库驱动程序?字段类型?我怀疑是 Active Record 参数化的一部分,您可以查看它的核心
-
可以快速浏览一下 db 库中的
where函数。可能是一个简单的条件,您可以通过覆盖来修复。 -
如果 field_name 字段是 char/varchar,它们也将被转换为整数,并且很可能映射为 0,因此您仍然匹配整个表。
-
因为 field_name 是
varcharMYSQL 期望比较的两边都有一个字符串。现在您在右侧有整数,它使mysql将左侧评估为整数,最终条件为0=0 -
谢谢大家。我明白为什么与 0 的比较会产生所有结果。也就是说,我剩下的问题是:为什么要强制转换为 0?这是最不直观的部分,也是破坏预期行为的部分。也许我们可以将其称为 CodeIgniter 的错误
标签: php mysql codeigniter casting