所以这是我在前面提到的一个问题中对真正问题的结论: SQL Select Query with CodeIgniter's active records and 'where sha1' returns first row entry
我也在CodeIgniter论坛中发帖双重: http://codeigniter.com/forums/viewthread/194502/(最新进展......)
您可以从两者中获得多个代码段。
简而言之,我遇到的问题如下,我不确定谁是真正的罪魁祸首:
我正在使用如下所示的数组来定义活动记录函数的select查询中的“where”。如果在下面列出的特定组合中使用,查询将为我提供表中的所有行。
粘贴---
实际上,当sha1返回原始输出数据和电子邮件时,实际上看起来这种错误组合才会发生。 1例如:$where = array(
'email' => 0,
'password' => sha1(false, true), # sha1($this->input>post('password'), true);
);
如果sha1(false,true)更改为sha1(无论如何),则没有错误。 ('无论'包括字符串,布尔等)。
如果数组未更改且'email'=> 0更改为'email'=>在SQL QueryA中发生'0',然后它正常工作。如果我从QueryA中的值中删除's,就像在Active Records中那样,我再次获取所有行...
另外,当'email'为>时,我没有得到任何行(这是正确的) 0.即'email'=> 1(2,3等),甚至当'email'=>空值。
'email'= 0和sha1('any value',true)的组合导致返回Active Records表中的每一行,因为没有为值0添加引号。但是,在''周围添加引号密码'='值'。如果原始哈希周围没有引号,那么SQL会返回一个错误并阻止脚本运行..(这比返回行更好......)
这可能是一个SQL错误,因为它只发生在0的值...但是引用where值是用户错误吗?如果是这样,那么Active Records是否应该为我自动引用该值,如果它是一个整数?它似乎是为字符串值而不是整数(false = 0,true = 1)......
答案 0 :(得分:0)
如果您想在查询中获得相同的结果,请将两者相等。在QUERY1中,您可以按如下方式定义术语:
WHERE `email` = \''.$data['email'].'\'
AND `password` = \''.$data['password'].'\'
# data for sql query
$where = array(
'email' => $this->input->post('email'),
'password' => sha1($this->input->post('password'), true);
);
对于QUERY1和QUERY2相等,QUERY2将是:
# data for sql query
$where = array(
'email' => "'".$this->input->post('email')."'",
'password' => sha1($this->input->post('password'), true);
);
Codeigniter不能自己确定0不应该是数字。你自己做QUERY1。