它们都是同样有效的方式(但是,你的第二个例子在应该不存在的问号之前有一个冒号)。第一个例子更具可读性。在第二个例子中,如果您稍后决定更改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