簡體   English   中英

Codeigniter MySQL按位運算符

[英]codeigniter mysql bitwise operator

我的數據庫(int)十進制中有一個值。 在我的codeigniter應用程序中,我有幾個常量鏈接到二進制1-2-4-8-...。

我想讓所有具有特定二進制訪問權限級別的用戶都可以顯示。

public function query($level = 0)
{
    $data = NULL;

    $this->db->select('user_id, user_email, user_name, user_firstname, user_imageammount, user_auth');
    $this->db->from('users');
    $this->db->where('user_auth' & $level);

    $query = $this->db->get();

    if ( $query->num_rows() > 0 )
    {
        $data = $query->result_array();
    }

    return $data;
}

當我直接在phpmyadmin中運行查詢時,我得到了所需的結果。

SELECT `user_id`, `user_email`, `user_name`, `user_firstname`, `user_imageammount`, `user_auth` FROM `users` WHERE `user_auth` & 1

當我在codeigniter中運行它時,出現錯誤。

嚴重性:警告消息:遇到非數字值

任何幫助或建議都將適用。

這顯然是錯誤的:

$this->db->where('user_auth' & $level);

一方面,你沒有. 將字符串部分連接到非字符串部分。 即使您有'user_auth' . & $level 'user_auth' . & $level ,因為運算符&應該被視為任何運算符&例如<><>!=等,仍然是錯誤的。因為它也應該是字符串。 就目前而言,這可能是語法(或類似的解析)錯誤,一個簡單的測試告訴我:

警告 :在第5行的[...]上遇到一個非數字值

因此,請嘗試以下操作:

 $this->db->where('user_auth & '.(int)$level);

一個簡單的例子清楚地表明了這一點:

 #this is wrong
 $sql = "SELECT * FROM table WHERE user_auth" & 1;

 #this is correct
 $sql = "SELECT * FROM table WHERE user_auth & 1";

對於這個家伙,您只需將level強制轉換為INT就可以擺脫困境,因為它只是一個整數值,應該可以對其進行很好的消毒。 我必須確保了解到消毒總是很重要的。 首選查詢,但如果它是一個簡單的INT(很可能是從類常量中提取的),我們可以將其強制轉換為非INT的任何東西都變為0 ,這在最壞的情況下不會返回任何結果。

關鍵是,即使在查詢中使用類常量時,也應進行清理。 特別是如果該常量作為函數參數傳入。 這是因為該函數可能與“不干凈的”數據一起使用,並且如果不查看大量代碼就無法知道它是否安全。 如果您通過查詢正確地對其進行清理,那么您就會知道它總是會得到處理等。

請享用!

暫無
暫無

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

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