gpt4 book ai didi

php - 为什么无论绑定(bind)参数变量中是否包含冒号,PDO 'execute' 都有效?

转载 作者:可可西里 更新时间:2023-11-01 08:09:53 27 4
gpt4 key购买 nike

我正在开发一个使用 PDO 的应用程序。

我注意到,当绑定(bind)参数时,无论我在绑定(bind)参数变量上使用还是省略冒号,查询仍然有效。

例子:

$sql = "SELECT * FROM `" . $this->table . "` WHERE id = :id LIMIT 1";
$stmt = $this->ci->db->prepare($sql);
$result = $stmt->execute([
"id" => $id,
]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);

给出完全相同的结果:

$sql = "SELECT * FROM `" . $this->table . "` WHERE id = :id LIMIT 1";
$stmt = $this->ci->db->prepare($sql);
$result = $stmt->execute([
":id" => $id,
]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);

区别(可能很难发现)是 "id"=> $id vs ":id"=> $id

那么,应该使用哪个呢?他们给出相同的输出是预期的行为吗?

最佳答案

快速浏览 PHP 源代码会发现 this code in pdo_stmt.c (这是当前的 master 分支,所以是 PHP 7.1,但我想它在所有版本中基本相同):

if (param->name) {
if (is_param && ZSTR_VAL(param->name)[0] != ':') {
zend_string *temp = zend_string_alloc(ZSTR_LEN(param->name) + 1, 0);
ZSTR_VAL(temp)[0] = ':';
memmove(ZSTR_VAL(temp) + 1, ZSTR_VAL(param->name), ZSTR_LEN(param->name) + 1);
param->name = temp;
} else {
param->name = zend_string_init(ZSTR_VAL(param->name), ZSTR_LEN(param->name), 0);
}
}

大致来说,关键部分可以理解为:

if ( char 0 of param->name is not ':' ) {
set param->name to ':' concatenated with param->name
}

因此,前面带有 : 的形式是“正确的”形式,但是如果您传递任何没有 : 前缀的字符串,PDO 代码将添加一个在内部,只是为了用户友好。

请注意,这与数组 的工作方式无关:PHP 数组只是将一组名称-值对放入PDO 代码中的一种方式。这与 API 接受美式拼写“color”或英式拼写“colour”作为参数是一样的;它们不是“相同的 key ”,但 API 可以确定它们具有相同的含义。

在实践中,答案仍然是“使用您喜欢的任何一个”。

关于php - 为什么无论绑定(bind)参数变量中是否包含冒号,PDO 'execute' 都有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40929836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com