2015-10-19 52 views
1

我有AA類系列ID的一個陣列中,他們進入我的查詢,如:MySQL的安全

WHERE category IN(".implode(',',$categories)) 

現在出於安全目的,我想,以確保每個值來自數組實際上是一個整數。有沒有簡單的方法來做到這一點,或者我應該分解我的數組,(int)$ val每一個,然後再次構造數組?

謝謝!

馬特

+0

播下你的PHP腳本的完整片段 – Alex

回答

0

可悲的是,這是不可能逃脫使用數據庫查詢的整體「in'部分。所以你有兩種可能性:

a)創建一個臨時表,插入並連接到原來的表。 (在可能的情況下是首選,你不用INT你想擁有在where -clause的和你的工作非常大的數據集:

  • 創建一個臨時表:create temporary table yourTempTable (tempColumn varchar(42)) ENGINE=MEMORY;
  • 插入所有值使用預處理語句以防止SQL-注射
  • 查詢數據庫:SELECT FROM orig_table INNER JOIN yourTempTable ON category = tempColumn

二)從技術上說,這是你所建議的解決方案:建立查詢之前修改陣列。爲了使代碼更清晰可讀,我建議使用array_map。然後,只需修改代碼:

WHERE category IN(".implode(',',array_map($categories, function($a){return (int)$a;})) 

在這裏,你得到所有返回值的新陣列consisisting的callable你提供的,這是在這種情況下,只是其中的每一個值強制轉換爲一個int的函數。這個數組直接輸入到implode,所以你不需要任何新變量,全局函數,for -loops或其他任何東西。

+0

好的,謝謝我會試試! –