2013-12-15 51 views
1

我對自己在PDO查詢2點的問題撰寫查詢問題,1:哪個佔位符的類型是更好的PDO使用,例如比較這樣的:夫婦的有關使用PDO

$stmt = $db->prepare('SELECT model FROM cars WHERE brand = :brand'); 
$stmt->bindValue(':brand', $brand, PDO::PARAM_STR); 
$stmt->execute(); 

與此:

$stmt = $db->prepare('SELECT model FROM cars WHERE brand = ?'); 
$stmt->bindValue(1, $brand, PDO::PARAM_STR); 
$stmt->execute(); 

並且允許在同一查詢中使用兩種類型的佔位符。


第二:如果我願意使用一些功能來組成一個通用查詢,像:

public function genQuery($qType, qFieldsArray, qTablesArray, qWhereArray, qOrderArray, qGroupArray){ 
    switch($type){ 
     case 'select'; 
      //Call to slctFunction 
      break; 
     case 'update'; 
      //Call to updtFunction 
      break; 
     //**etc.. 
} 

請糾正我,如果我錯了,但只要我在slctFunction,updtFunction等中分別綁定用戶輸入數據的值,並且不直接將它們注入到查詢中,那麼我不會使它對sql注入敏感,對吧?

由於提前

+0

我可以知道爲什麼這個問題被拒絕嗎? –

回答

0

問題1:您可以使用命名或編號的參數,但不能在同一個語句同時使用。從PDO::prepare

您不能在同一個SQL語句中同時使用命名和問號參數標記;選擇一個或另一個參數樣式。

我認爲命名參數更好,因爲它們是自我記錄的,如果更新查詢以添加更多參數不會受到影響。

問題2:你是對的,使用綁定參數代替插值到查詢中可以保護你免受SQL注入。

+0

非常感謝:) –

0

第一個問題沒有意義。沒有全部「更好」的方法。每個都適合自己使用。位置佔位符是不可缺少的,因爲它們可以使代碼更加臃腫,而不是每次寫入每個字段名稱十次。 命名是好的,因爲幾個同名的佔位符可以綁定到單個變量。 順便說一句,後者已經被牢記,你可以在執行中只傳遞整個$ _POST數組。在這種情況下,指定的佔位符可以縮短您的代碼。但是,當陣列按鍵都是手工寫的,像

$sql = "SELECT * FROM table WHERE field1=:foo AND field2=:baz"; 
$data = DB::getAll($sql, array('foo'=>$foo, 'baz'=>$baz)); 

,他們就沒有任何意義,並且必須寫成

$sql = "SELECT * FROM table WHERE field1=? AND field2=?"; 
$data = DB::getAll($sql, array($foo, $baz)); 

使你的代碼DRY

要回答通常情況下如果你可以混合使用它們 - 老實說,你可以在幾秒鐘內嘗試自己看看它。

第二個比較好。但是,您的一些場所是不好的

只要我綁定用戶輸入的值數據

你就錯了。
數據源應該沒有分離。這是安全性的基石原則:不僅臭名昭着,模糊的「用戶輸入」,而且每個價值。任何進入查詢的值都必須被硬編碼或由佔位符替代。沒有例外。

這也使得你的通用函數不安全。更不用說,這種功能的想法被設計所破壞。你爲什麼需要它?爲了讓自己說一說兩句話?你得到什麼回報?一個混淆廢話寶貴的SQL和束縛你自己的枷鎖。什麼是使用此功能的例子?你有沒有試圖看到他們的行動?你有沒有嘗試將它們與regulart SQL進行比較?

查詢如JOINTS,INSERT DELAYED等怎麼樣?你打算在PHP中編寫完整的SQL方言嗎?

對於確實簡單查詢你應該使用ORM。它會使你的代碼確實很短但仍然可讀。但是爲了所有的好處 - 放棄這樣的建設者的想法。