2015-04-20 29 views
8

比方說,我想選擇記錄Id = 30。準備語句允許綁定參數的方法有兩種:使用差異?和:參數準備聲明

問號

$id = 30; 
$q = $conn->prepare("SELECT * FROM pdo_db WHERE id > ?"); 
$q->execute(array($id)); // Here above ID will be passed 

命名參數

$sth = $conn->prepare("SELECT `id`, `title` FROM `pdo_db` WHERE `id` > :id"); 
$sth->execute(array(
    ':id' => 30 
)); 

兩者都工作正常,並給出精確的結果,但我無法獲得這兩者之間以及何時的確切區別我應該使用一個或另一個?

回答

7

問號參數被稱爲位置參數。

:定義的參數和名稱被稱爲名爲的參數。

規則是你不能在你準備好的聲明中混合兩者。

位置參數以簡單的方式工作 - 如果您有兩個位置參數,則可以指定一個包含兩個元素的數組。數組值將按照出現在數組中的順序進行綁定。

命名參數有點棘手,他們不必綁定,以便他們出現。您也可以在語句中多次重複一個命名參數,但您只能綁定一次以傳遞該值 - 當PDO通過$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);設置爲仿真時,最後一部分工作。

1

這些不同的佔位符

? -- > question mark placeholders 
    :name --> named Placeholders 

named and question mark placeholders之間的區別是,與問號佔位符你必須採取有關它們將被綁定到查詢順序護理。

4

這似乎更多的是基於偏好的問題,因爲沒有嚴格的正確或錯誤的答案。

個人而言,我避免了?,因爲它與參數順序緊密相關。儘管理論上你不應該通過添加或刪除綁定單個綁定來搞砸這件事,但它似乎是在尋求麻煩。儘管如此,(稍微)少一些工作。

:name更加簡潔,並且緊緊地綁定到綁定的標識上,而不是隨意綁定到綁定。它涉及(微小)更多的工作,但調試起來更容易,並且不易出錯。

我更喜歡在編寫(稍微)少一些的代碼時(略)簡潔。