[英]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.