[英]Database query failed: Incorrect integer value: '' for column 'id' at row 1
[英]Database query returning incorrect row
我正在研究一些使用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
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子句。
如果$username == ''
我在getUser
添加了一個返回NULL
的子句。 我確實嘗試了=== 0
但是產生了同樣的錯誤,所以有一些類型強制進行,我不是100%肯定,但這比在每次調用getUser
處理案例更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.