数据库查询返回错误行

时间:2016-08-24 15:11:44

标签: php codeigniter session

我正在研究一些使用codeigniter和内置查询构建器访问数据库的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

1 个答案:

答案 0 :(得分:0)

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

记录$this->db->last_query()显示了这一点,因为生成的查询是:

SELECT * FROM tblusers WHERE username = 0 LIMIT 1;

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

我向getUser添加了一个条款,以便NULL返回$username == ''。我确实试过了=== 0,但是产生了同样的错误,所以有一些类型强制进行,我不是100%肯定的,但这比在每次调用getUser时处理案例更好