SQL在CodeIgniter's Active Records中的值组合0和sha1(value, true)


SQL where value combination of 0 and sha1(value, true) in CodeIgniter's Active Records returns all rows

这就是我之前问的一个问题对真正问题的结论:SQL Select查询CodeIgniter's活动记录'where sha1'返回第一行条目

我也在CodeIgniter论坛上发帖:http://codeigniter.com/forums/viewthread/194502/(最新进展…)

您可以从两者中获得几个代码片段。

总之,我遇到的问题是这样的,我不确定谁是真正的罪魁祸首:

我使用如下所示的数组来定义活动记录函数的选择查询中的'where'。如果在下面列出的特定组合中使用,该查询将给出表中的所有行。

粘贴——

实际上看起来这种错误组合只发生在sha1返回原始输出数据和电子邮件<1例如:

$where = array(
          'email'     => 0,
          'password'  => sha1(false, true), # sha1($this->input>post('password'), true);
         ); 

如果sha1(false, true)被更改为sha1(无论如何),则没有错误。(' whatever '包括字符串、布尔值等)

如果数组不变,'email' => 0更改为'email' => '0',这发生在SQL QueryA中,那么它可以正常工作。如果我从QueryA中的值中删除"s",就像在活动记录中一样,那么我再次获得所有行…

另外,当'email'> 0时,我没有得到任何行(这是正确的)。即。'email' => 1(2,3等),甚至当'email' => null时也是如此。

' email ' = 0和sha1(' any value ', true)的组合导致在活动记录中返回表中的每一行,因为没有引号添加到值0。然而,在' password ' = ' value '周围添加引号。如果原始哈希周围没有引号,那么SQL将返回Error并阻止脚本运行。(这比返回每一行…要好)

这可能是一个SQL错误,因为它只发生在值为0时…但是不引用where值是用户错误吗?如果是这样,那么Active Records应该为我自动引用值,如果它是一个整数或不是吗?它似乎对字符串值这样做,但不是整数(false = 0, true = 1)…

如果您希望在查询中得到相同的结果,请将两个查询写入相等。在QUERY1中,您定义的术语如下:

WHERE `email` = '''.$data['email'].''' 
AND `password` = '''.$data['password'].''' 
在QUERY2

# 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执行。