它們都是同樣有效的方式(但是,你的第二個例子在應該不存在的問號之前有一個冒號)。第一個例子更具可讀性。在第二個例子中,如果您稍後決定更改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。使用命名參數方法你不會有這個問題。
如果您使用第一種方法(:email ...),您可以在大型查詢中檢測並分離參數。它們之間沒有任何區別。 – M2sh
沒有區別。第一個使用名稱佔位符,第二個使用問號佔位符。兩者同樣安全。 –
完美,謝謝 – user3426191