2015-06-14 126 views
0

嘿一個小問題。PDO bindParam正確的方式?

什麼是更好或最安全的方式來綁定參數,值和列? i'v看到了這兩種方式來做到這一點,但我無法弄清楚它們有什麼區別?

有:電子郵件和:email$email

$stmt = $db->prepare("SELECT `email` FROM `users` WHERE `email` = :email"); 
     $stmt->bindValue(':email', $email); 

還是問號?

$stmt = $db->prepare("SELECT `email` FROM `users` WHERE `email` = :?"); 
     $stmt->bindValue(1, $email); 
+1

如果您使用第一種方法(:email ...),您可以在大型查詢中檢測並分離參數。它們之間沒有任何區別。 – M2sh

+1

沒有區別。第一個使用名稱佔位符,第二個使用問號佔位符。兩者同樣安全。 –

+0

完美,謝謝 – user3426191

回答

2

沒有區別,但只有優勢它更具可讀性。

mysqli只有?這是不一樣好的閱讀時,你有太多的參數

想象這樣的事情:

$stmt = $db->prepare("Call store_procedure ?,?,?,?,?,?,?,?,?,?"); 

它可能是這麼多的錯誤傾向和難以調試

2

它們都是同樣有效的方式(但是,你的第二個例子在應該不存在的問號之前有一個冒號)。第一個例子更具可讀性。在第二個例子中,如果您稍後決定更改SQL語句,則可能必須對所有內容重新編號。

所以,如果你本來有這樣的:

$stmt = $db->prepare("INSERT INTO `users` (`fname`, `lname`, `address`, `email`) values (?, ?, ?, ?)"); 
    $stmt->bindValue(1, $fname); 
    $stmt->bindValue(2, $lname); 
    $stmt->bindValue(3, $address); 
    $stmt->bindValue(4, $email); 

,並想插入一箇中間名首字母。你可以在末尾插入,但爲便於閱讀,你很可能把它的姓和名之間將不得不重新編號您的代碼如下:

$stmt = $db->prepare("INSERT INTO `users` (`fname`, `initial`, `lname`, `address`, `email`) values (?, ?, ?, ?)"); 
    $stmt->bindValue(1, $fname); 
    $stmt->bindValue(2, $initial); 
    $stmt->bindValue(3, $lname); 
    $stmt->bindValue(4, $address); 
    $stmt->bindValue(5, $email); 

它只是使事情有點不太可讀而且修復起來有點麻煩。我用問號方法可以看到的唯一好處是少打字,但從長遠來看最好不用。另外,當插入和移動它時,更容易發生錯誤而不會發現它。例如,你可能會不小心放置了最初以錯誤的地點如下:

$stmt = $db->prepare("INSERT INTO `users` (`fname`, `initial`, `lname`, `address`, `email`) values (?, ?, ?, ?)"); 
    $stmt->bindValue(1, $fname); 
    $stmt->bindValue(2, $lname); 
    $stmt->bindValue(3, $initial); 
    $stmt->bindValue(4, $address); 
    $stmt->bindValue(5, $email); 

您的代碼不會知道這是不是你想要做什麼,它會嘗試把姓氏在初始列和最後名稱列中的inital。使用命名參數方法你不會有這個問題。