为什么MySQLi库本身不支持命名参数?

时间:2016-09-13 16:57:40

标签: php mysqli named-parameters

来自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扩展库中未实现命名参数的原因。

2 个答案:

答案 0 :(得分:1)

传统上,MySQLi是MySQL API的非常薄的包装器。它不会单独添加任何东西,这是有原因的:添加命名占位符之类的功能(如果您想到了)将需要整个 SQL查询解析的功能。绝对,这不是数据库API的工作。就像在其他答案中所说的那样,API不是DAL。它们用于不同的目的。

PDO是一项伟大的壮举,您几乎不会再用该语言再次看到它,而Wes Furlong是一位天才,几乎是专心承担这项任务的。但是,PDO又是另一回事了。这是一个数据库访问抽象层,要实现此目标,您需要一个查询解析器,无论是否喜欢。而且,由于您已经有了查询解析器,并且其中一个驱动程序已经支持命名占位符,因此很自然地将其添加到所有受支持的驱动程序中。如您所见,MySQLi完全不同。

简而言之,这与“懒惰”无关;它是关于遵循规范的。

答案 1 :(得分:0)

MYSQLi不支持命名参数,因为它的对应参数PDO可以。然后您使用当时最适合您需求的方法...

两者均随PHP 5(我相信PDO 5.3版)一起发布。

所以...您想要更快的执行时间?使用MYSQLi。您要命名参数吗?使用PDO。

您要MYSQLi利用客户端命名参数吗?好吧,现在您已经失去了更快的执行时间...我想您可以看到进展的方向...