使用之间的差异?和 :param 在 prepare 语句中

Differences between using ? and :param in prepare statement

假设我想 select 记录 Id = 30。准备好的语句允许两种绑定参数的方式:

question marks

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

named parameters

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

两者都工作正常并提供准确的结果,但我无法获得这两者之间的确切差异,也不知道何时应该使用其中之一?

这些是不同的占位符

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

named and question mark placeholders 之间的区别在于,对于问号占位符 ,您必须注意它们绑定到查询的顺序

问号参数称为位置参数。

使用 : 和名称定义的参数称为 named 参数。

规则是您不能在准备好的语句中混合使用这两者。

位置参数的工作方式很简单 - 如果您有两个位置参数,您可以指定一个包含两个元素的数组。数组值将按照它们在数组中出现的顺序绑定。

命名参数有点棘手,它们不必按顺序显示。您还可以在语句中多次重复一个命名参数,但您只能绑定一次以传递值 - 当 PDO 通过 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);.

设置为仿真时,最后一部分有效

这似乎更像是一个基于偏好的问题,因为没有严格的正确或错误答案。

我个人避免使用 ?,因为它与参数的顺序紧密相关。虽然从理论上讲,您不应该通过添加或删除单个绑定来解决这个问题,但这似乎是在自找麻烦。不过,它(稍微)减少了工作量。

:name更简洁,紧扣绑定标识,不随意顺序。它涉及(微小的)更多工作,但调试起来更容易,而且更不容易出错。

我更喜欢(稍微)简洁而不是编写(稍微)更少的代码。