SQL选择查询与CodeIgniter的活动记录和'其中sha1'返回第一行条目

时间:2011-07-19 21:14:09

标签: php mysql codeigniter activerecord sha1

我在完全干净的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 WHERE email =''AND password ='Ú9£î^kK2U¿ï•`¯Ø'LIMIT 1 OFFSET 0

     

INFO - 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)WHERE email = 0 AND password ='ڹڹ^ kK \r2U࠯֠Я؇'LIMIT 1

     

INFO - 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中,它没有。所以仍然存在差异。

0 个答案:

没有答案