我有这样的语法
$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);
没有区别
: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