我正在研究一些使用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_ID
或Failed 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
的情况更好的问题。