簡體   English   中英

數據庫查詢返回錯誤行

[英]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_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子句。

如果$username == ''我在getUser添加了一個返回NULL的子句。 我確實嘗試了=== 0但是產生了同樣的錯誤,所以有一些類型強制進行,我不是100%肯定,但這比在每次調用getUser處理案例更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM