我在完全干净的CodeIgniter 2.0.2安装上重复了这个问题
以下代码已添加到默认的“welcome”控制器中,我创建了一个“test_model”来演示错误。
可以假设/更改config / autoload / database: - 正确定义基本网址 - 自动加载数据库库 - 记录设置为4(所有消息) - 数据库连接参数
这是我添加到controllers / welcome.php中的内容:
function test_me()
{
$this->load->model('test_model');
# data for sql query
$where = array(
'email' => $this->input->post('email'),
'password' => sha1($this->input->post('password'), true);
);
log_message('info', '----email: '.$where['email']);
log_message('info', '----password: '.$where['password']);
# exec query
$query = $this->test_model->get_user($where);
log_message('info', '----query->num_rows() ='.$query->num_rows());
if($query->num_rows() > 0)
{
$row = $query->row();
log_message('info', '----query->row()->email = '.$row->email);
print $row->email;
}
else
print "worked correctly."; # returned ZERO rows
}
这是models / test_model.php:
class Test_model extends CI_Model {
var $_user_table = 'users'; # user table name
// ------------------------------------------------------------------------
/**
* Constructor
*
* @access public
*/
public function __construct()
{
log_message('INFO', 'User model initialized');
parent::__construct();
}
/**
* Get_user
*
* Retrieves user data from the database
*
* @access public
* @param array sql select query data
* @param int default return limits to 1 user
* @param int offset
* @return mixed sql query result
*/
public function get_user($data, $limit = 1, $offset = 0)
{
foreach($data as $where)
log_message('INFO', 'Getting user data from db where: '.$where);
# refer this as QUERY1
$query = $this->db->query('SELECT *
FROM `users`
WHERE `email` = \''.$data['email'].'\'
AND `password` = \''.$data['password'].'\'
LIMIT 1
OFFSET 0
');
# refer this as QUERY2
#$query = $this->db->get_where($this->_user_table, $data, $limit, $offset);
log_message('info', 'get last sql query: '.$this->db->last_query());
return $query;
}
}
在QUERY1中,这只是使用带有传递给QUERY2的所有参数的直接SQL。区别在于QUERY2利用了CodeIgniter的活动记录。
现在,这是运行上面的日志:
INFO - 2011-07-19 23:34:01 - > - - 电子邮件: INFO - 2011-07-19 23:34:01 - > ----密码:Ú9£ì^kK2U¿ï•`¯Ø INFO - 2011-07-19 23:34:01 - >从db获取用户数据:
INFO - 2011-07-19 23:34:01 - >从db获取用户数据,其中:Ú9£^ ^kK2U¿ï•`¯Ø
INFO - 2011-07-19 23:34:01 - >获取最后一个sql查询:SELECT * FROM
users
WHEREpassword
='Ú9£î^kK2U¿ï•`¯Ø'LIMIT 1 OFFSET 0INFO - 2011-07-19 23:34:01 - > ---- query-> num_rows()= 0
DEBUG - 2011-07-19 23:34:01 - >最终输出发送到浏览器 DEBUG - 2011-07-19 23:34:01 - >总执行时间:0.0923
浏览器的输出是:正常工作。
当我注释掉QUERY1并运行QUERY2(CI的AR)时会发生这种情况:
INFO - 2011-07-19 23:40:05 - > ----电子邮件:
INFO - 2011-07-19 23:40:05 - > ----密码:ڹڹ^kK2U֠Я؇
INFO - 2011-07-19 23:40:05 - >从db获取用户数据,其中: INFO - 2011-07-19 23:40:05 - >从db获取用户数据,其中:ڹĮ^kK2U֠Я؇
INFO - 2011-07-19 23:40:05 - >获取最后一个sql查询:SELECT * FROM(
users
)WHEREpassword
='ڹڹ^ kK \r2U֠Я؇'LIMIT 1INFO - 2011-07-19 23:40:05 - > ---- query-> num_rows()= 1
INFO - 2011-07-19 23:40:05 - > ---- query-> row() - > email = myemail@gmail.com
DEBUG - 2011-07-19 23:40:05 - >最终输出发送到浏览器 DEBUG - 2011-07-19 23:40:05 - >总执行时间:0.0965
脚本的输出是myemail@gmail.com 这是表中的第一行,它总是返回表的第一行。如果我不使用LIMIT = 1默认值,则num_rows()实际上等于表中的行数。
现在,背景,我使用它显然是表单脚本检查,但表单不一定总是填写。我使用javascript进行检查,但这是一个浏览器无法启用javascript或者尝试将字段提交给用户空白的情况。数据库没有有效的空白条目,不应返回任何行。由于我将sha1哈希存储为原始二进制(20)数据,因此正在使用sha1('',true)。奇怪的是,这是我在CI中使用Active Records创建的某种错误,而不是返回错误,或返回零行(如预期的那样),它返回表中的EVER行!
我做错了什么或这是一个错误或不是使用活动记录的预期方式?因为我想保留在查询中接受where子句数组的方法。
由于
感谢下面的用户评论让我朝这个方向发展。似乎我错了sha1与此实际上有任何关系... $ this-> input-> post()如果没有帖子数据(在这种情况下),则返回'False',因此,'email'的值在数组中是'false'。
所以现在我实际上是在一个不同的问题,我可能会重新发布,这就是为什么email ='false'会返回整个表格?
实际上,我以前从未见过这个,因为它永远不会发生......在QUERY1(sql)中,它可以正常工作。在带有ActiveRecords的QUERY2中,它没有。所以仍然存在差异。