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

Den*_*nis 10 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);
Run Code Online (Sandbox Code Playgroud)

但绝不是这样的:

$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (:id_value)");
$stmt->bind_param("i", "id_value", $id);
Run Code Online (Sandbox Code Playgroud)

在我看来,named parameter替换是在API级别实现的合理特性.我很惊讶MySQLi只unnamed parameters在库中实现.

有正当理由吗?看看PDO,DQL,ORM如何在查询中采用命名参数对我来说没有意义.

我希望MySQLi开发人员不是"我们很懒,不想"的情况.我相信一定有充分的理由,我正在寻找这个理由,或者寻找理由的方法.MySQLi扩展库中未实现命名参数的原因.

Mar*_*ark 5

MYSQLi 不支持命名参数有两个主要原因:

  1. 它是“打算”(我松散地使用这个术语)与包装器一起使用,并且
  2. 它是对应的,PDO确实 - 而且没有必要重新发明轮子

详细说明第 1 点:mysqli尽管与 相比有许多缺点,但它PDO很容易与好的包装器进行比较——也就是说,命名参数(以及其他参数)由包装器而不是mysqli它本身支持。这是设计使然,原因只有一个:

  1. Mysqli 旨在成为一个快速灵活的库。

如果开发人员将更多功能合并到基础库中,则与直觉相反,它变得不那么灵活并且需要更长的加载/执行时间。

双方mysqlipdo发布在PHP 5中(PDO 5.3版本,我相信),因此被用于不同的用途。

您想要更快的执行时间吗?使用mysqli无包装。你想要命名参数?使用PDO或构建一个mysqli包装器来处理这种情况 - 但请注意,这会阻碍您的执行时间。