CodeIgniter 的 Active Records 中 0 和 sha1(value, true) 的值组合返回所有行的 SQL
Posted
技术标签:
【中文标题】CodeIgniter 的 Active Records 中 0 和 sha1(value, true) 的值组合返回所有行的 SQL【英文标题】:SQL where value combination of 0 and sha1(value, true) in CodeIgniter's Active Records returns all rows 【发布时间】:2011-10-09 04:57:36 【问题描述】:所以这是我从我之前在这里提出的一个问题中得出的真正问题的结论: SQL Select Query with CodeIgniter's active records and 'where sha1' returns first row entry
我还在 CodeIgniter 论坛上重复发帖: http://codeigniter.com/forums/viewthread/194502/(最新进展...)
您可以从两者中获取多个代码 sn-ps。
简而言之,我遇到的问题如下,我不确定谁才是真正的罪魁祸首:
我正在使用如下所示的数组来定义活动记录函数的选择查询中的“位置”。如果以下面概述的特定组合使用,该查询会为我提供表中的所有行。
粘贴---
实际上看起来这种错误组合只发生在 sha1 返回原始输出数据和电子邮件
$where = array(
'email' => 0,
'password' => sha1(false, true), # sha1($this->input>post('password'), true);
);
如果将 sha1(false, true) 更改为 sha1(whatever),则没有错误。 (“whatever”包括字符串、布尔值等)
如果数组没有改变并且 'email' => 0 更改为 'email' => '0' 这发生在 SQL QueryA 中,那么它可以正常工作。如果我像在 Active Records 中一样从 QueryA 中的值中删除“,那么我会再次获得所有行......
此外,当“电子邮件”> 0 时,我没有得到任何行(这是正确的)。即“电子邮件”=> 1(2,3 等),即使当“电子邮件”=> 为空时也是如此。
'email' = 0 和 sha1('any value', true) 的组合会导致在 Active Records 中返回表中的每一行,因为值 0 中没有添加引号。但是在 ' 周围添加了引号密码'='价值'。如果原始哈希周围没有引号,则 SQL 返回错误并阻止脚本运行..(这比返回任何行要好......)
这可能是一个 SQL 错误,因为它只发生在值 0 上……但是不引用 where 值是用户错误吗?如果是这样,那么 Active Records 是否应该自动为我引用该值(如果它是一个整数)?它似乎对字符串值这样做,但不是整数(false = 0,true = 1)......
【问题讨论】:
您可能应该激活分析器以查看生成的查询。这可以给你一个线索。 我有,查询看起来像:SELECT * FROM (users
) WHERE email
= 0 AND password
= 'Ú9£î^kK\r2U¿ï•`¯Ø '日志准确地显示了我所描述的内容。更多日志发布在我帖子顶部链接的原始问题中。
当我在 phpMyAdmin 中运行它们时,生成的查询返回相同的结果。不足为奇。
【参考方案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 身份自行完成。
【讨论】:
是的,这似乎是一个可靠的解决方案。我认为这更多地变成了一个关于为什么 false = 0 = 全选的 SQL 问题。不过感谢您的回答。 This 可以帮助...和this。问候。以上是关于CodeIgniter 的 Active Records 中 0 和 sha1(value, true) 的值组合返回所有行的 SQL的主要内容,如果未能解决你的问题,请参考以下文章
使用 CodeIgniter Active Record 语句
如何在 codeigniter 中将 class="active" 设置为导航菜单?
CodeIgniter Active Record 中的 SQL 注释?