使用之间的差异?和 :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
更简洁,紧扣绑定标识,不随意顺序。它涉及(微小的)更多工作,但调试起来更容易,而且更不容易出错。
我更喜欢(稍微)简洁而不是编写(稍微)更少的代码。
假设我想 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
更简洁,紧扣绑定标识,不随意顺序。它涉及(微小的)更多工作,但调试起来更容易,而且更不容易出错。
我更喜欢(稍微)简洁而不是编写(稍微)更少的代码。