我正在研究一些使用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_ID
或Failed to find user
答案 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
时处理案例更好