2013-04-28 40 views
0

我有如下語法「?」有什麼不同?和PDO中的「:用戶名」?

$query = "SELECT * FROM people WHERE username = ?"; 
$username = "foo"; 
$stmt->execute(array($username)); 

$query = "SELECT * FROM people WHERE username = :username"; 
$params = array(":username"=>"foo"); 
$stmt->execute($params); 
+4

第一個依靠值的順序填寫'?'。第二個數組中的順序無關緊要。 – sachleen 2013-04-28 17:28:19

+2

@Rio你能否停止發佈要求語言輔導或手動閱讀替代品的問題? – mario 2013-04-28 17:36:53

+0

Aw @mario,不錯':-)'。我同意OP可以首先搜索這些問題(所以近距離投票是有道理的),否則,這是一個很好的,明確的問題。 – halfer 2013-04-28 18:01:53

回答

3

沒有什麼區別

:username一個僅僅是通過PDO支持的語法糖,它就會在內部或者與文字取代?或轉義數據取決於設置(PDO::ATTR_EMULATE_PREPARES一)

這是一個廣泛傳播的觀點,命名佔位符更具可讀性。但是,在我看來,他們只會讓代碼不必要地膨脹,而根本不增加可讀性。重複相同的字段名稱六次不會​​使代碼可讀。如果在查詢中有超過3-5個佔位符,現在是時候考慮一​​些自動化,一個循環。

由於sachleen在評論中指出,唯一的區別是綁定數據的可能順序。

隨着你必須遵循嚴格的順序,同時與指定的佔位符,你可以按任何順序將它們綁定規則?佔位符:

$stm = $pdo->prepare("SELECT name FROM table WHERE name=? AND age=?"); 
$stm->execute(array($name,$age)); // strict order matching one in the query 

$stm = $pdo->prepare("SELECT name FROM table WHERE name=:name AND age=:age"); 
$stm->execute(array(":age"=>$age,":name"=>$name)); // whatever order 
+1

值得注意的是,內部替換破壞了基於名稱的佔位符的優點之一:不能可靠地重複參數。其他DB庫中不存在此PDO限制。 – 2013-04-28 17:34:18

+1

在添加關於可讀性的最後一段之前,我給了你+1。我試圖刪除+1(我不會,但我很想),因爲你完全錯過了使用命名佔位符的主要賣點之一 - 這意味着參數不需要按照它們在查詢中出現的順序指定。在很多情況下,參數數組和/或查詢是動態生成的,這是一個非常有價值的特性。 – Spudley 2013-04-28 17:35:36

+0

我特別討厭''''計數或當我編輯我的SQL時必須重新排序我的參數。假設可讀性是主觀的,我們都會很高興。 – 2013-04-28 17:36:53

相關問題