数据库查询返回错误的行


Database query returning incorrect row

我正在研究一些使用codeigniter和内置querybuilder访问数据库的web代码。

我尝试从数据库中为当前用户加载数据

$userModel = $this->loadModel('ModelUser');
$name = $this->session->userdata('user');
$user = $userModel->getUser($name);

getUser的代码:

function getUser($username)
{
    $this->db->where('username',$username);
    $query = $this->db->get('tblusers',1);
    $res = $query->result();
    if ($query->num_rows() > 0)
    {
        log_message('debug','Got user. ID = '.$res[0]->id);
        foreach($res[0] as $key => $val)
        {
            $this->$key = $val;
        }
        return $this;
    }
    else {
        log_message('info','failed to find user '.$username);
        return NULL;
    }
}

这很好,除了当我让会话过期时,在这种情况下,我得到了另一个用户的详细信息。

这些是测试getUser的结果:

$userModel->getUser("Admin"); //Got user. ID = Admin_ID
$userModel->getUser("john");  //Got user. ID = John_ID
$userModel->getUser("");      //Failed to find user
$userModel->getUser(null);    //Failed to find user

当我以Admin身份登录时,然后让会话超时,顶部代码段记录消息:

Got user. ID = John_ID

我希望Got user. ID = Admin_IDFailed to find user

$this->session->userdata('field')没有找到条目时,它返回0而不是我正在测试的""null

日志$this->db->last_query()显示了这一点,因为结果查询是:

SELECT * FROM tblusers WHERE username = 0 LIMIT 1;

MySQL将自动将字符串转换为整数,其中字符串以整数开头。不带整数的字符串将被强制转换为0,如本答案所述。查询返回它遇到的第一个条目,而不是找不到行,因为任何不以1-9开头的字符串都将匹配WHERE子句。

我给getUser添加了一个子句,如果$username == ''返回NULL。我确实尝试了=== 0,但产生了同样的错误,所以有一些类型的强制转换正在进行,我不是100%确定,但这涵盖了比每次处理getUser的情况更好的问题。