2015-10-21 80 views
3

使用MySQL和PHP,一個典型的(PDO)查詢看起來是這樣的:消毒查詢使用in_array()

// prepare the query 
$q = $DB->prepare("SELECT * FROM table_name WHERE property = :value"); 
// run the query 
$q->execute(array(':value'=>$value)); 

這是SQL注入安全的,因爲屬性值被單獨處理,查詢。

但是,如果我想使用相同的代碼編寫可能檢索不同字段或不同分組的查詢,則無法單獨使用prepare/execute方法,因爲您無法對字段(see here)使用PDO參數。

你能簡單地使用in_array()來檢查一個字段名稱,如:

// return false if the field is not recognised 
if(! in_array($field_name, array('field1','field2','field3')) return false 
// run the query 
$q = $DB->query("SELECT * FROM table_name ORDER BY " . $field_name); 

是否有一個更安全的/更快的方法?

+2

其安全速度更快。有更好的解決方法,即當你有具有定義字段的實體/模型,但in_array是可以的;) – Daimos

回答

2

已經看起來相當快速和安全。也許在查詢中的字段名稱周圍添加反引號。

爲了加快它的速度,你可以使用assoc數組並檢查索引是否存在而不是搜索數組的內容。

$fields = array('field1' => null, 'field2' => null, 'field3' => null); 
if (!array_key_exists($field_name, $fields)) return false; 

此外isset比array_key_exists

if (!isset($fields[$field_name])) return false; 

function benchmarks

足夠