【发布时间】:2017-01-21 08:49:25
【问题描述】:
来自http://php.net/manual/en/mysqli.quickstart.prepared-statements.php 的正确 MySQLi 参数化查询语法:
$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)");
$stmt->bind_param("i", $id);
但绝不会这样:
$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (:id_value)");
$stmt->bind_param("i", "id_value", $id);
在我看来,named parameter 替换是在 API 级别实现的合理功能。我很惊讶 MySQLi 只在库中实现了unnamed parameters。
有正当理由吗?看到 PDO、DQL、ORM 在查询中都采用了命名参数,这对我来说没有意义。
我希望 MySQLi 开发人员不会出现“我们很懒且不想”的情况。我相信一定有一个很好的理由,我正在寻找那个理由,或者寻找那个理由的方法。 MySQLi扩展库中没有实现命名参数的原因。
【问题讨论】:
-
mysql数据库引擎没有?它已经准备好查询,但没有命名参数。
-
mm 离题、太宽泛和基于意见的标记。我没想到关闭标志的多样性。
-
好吧,丹尼斯;你肯定会从熟悉 PHP.net 核心开发的人那里得到答案,以及他们为什么这样做的根本原因。这是你得到具体答案的唯一方法。我是其中之一,我不是那些人中的一员 ;-) 至少我在这里给了你正确的时间。
-
以我认为合乎逻辑的方式回答这个问题:冒号
:占位符将是一个(管道)字符,与 MySQLi_prepared statement 占位符?不同,其中 PDO 更多可跨不同平台传输,然后 MySQLi_ API 是。然而,它更“可移植”,核心开发人员(可能)希望人们能够同时使用:和?占位符作为熟悉的可能手段;我是否接近您正在寻找的答案? @丹尼斯 -
上述附录:The (PDO) manual on a prepared statement 声明:“PDO 将为不支持原生的驱动程序模拟准备好的语句/绑定参数,并且还可以重写命名或问号样式的参数标记如果驱动程序支持一种风格但不支持另一种风格,则更合适。” 另外,MySQL 也支持它作为核心字符,所以这可能就是他们选择冒号占位符的原因。另请参阅手册中的贡献者说明。
标签: php mysqli named-parameters