Php 为什么';MySQLi库是否本机支持命名参数?

Php 为什么';MySQLi库是否本机支持命名参数?,php,mysqli,named-parameters,Php,Mysqli,Named Parameters,正确的MySQLi参数化查询语法来自: 但决不是这样的: $stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (:id_value)"); $stmt->bind_param("i", "id_value", $id); 在我看来,命名参数替换是在API级别实现的合理功能。我很惊讶MySQLi只在库中实现了未命名参数 有正当理由吗?看到PDO、DQL和ORM在查询中都采用了命名参数,我觉得这毫无意义 我希望这不是MySQLi开

正确的MySQLi参数化查询语法来自:

但决不是这样的:

$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (:id_value)");
$stmt->bind_param("i", "id_value", $id);
在我看来,
命名参数
替换是在API级别实现的合理功能。我很惊讶MySQLi只在库中实现了
未命名参数

有正当理由吗?看到PDO、DQL和ORM在查询中都采用了命名参数,我觉得这毫无意义


我希望这不是MySQLi开发人员“我们很懒&不想”的情况。我相信一定有一个很好的原因,我正在寻找这个原因,或者寻找一种方法来寻找这个原因。MySQLi扩展库中未实现命名参数的原因。

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

  • 它“有意”(我松散地使用这个术语)用于包装器和
  • 与之相对应的是,PDO,确实如此——而重新发明轮子是没有意义的
  • 要详细说明第1点:
    mysqli
    ,尽管与
    PDO
    相比有许多缺点,但它很容易与一个好的包装器相比较——也就是说,命名参数(以及其他参数)由包装器支持,而不是由
    mysqli
    本身支持。这是出于一个设计原因:

  • Mysqli
    旨在成为一个快速灵活的库 如果开发人员将更多的特性合并到基本库中,那么它就变得不那么灵活,并且需要更长的加载/执行时间

    mysqli
    pdo
    都是用PHP5发布的(我相信是5.3版的pdo),因此有不同的用途


    你想要更快的执行时间?使用不带包装的mysqli。要命名参数吗?使用
    PDO
    或构建一个
    mysqli
    包装器来处理这样的问题-但请注意,这将阻碍您的执行时间。

    mysqli传统上是一个非常薄的包装器。它本身并没有添加任何内容,这是有原因的:添加命名占位符这样的功能需要SQL查询解析的整个利维坦(leviathan)。当然,这不是数据库API的工作。正如在另一个答案中所说,API不是一个;它们有不同的用途

    PDO是一个伟大的壮举,你很难再在语言中看到,韦斯·弗隆是一个天才,他几乎是单枪匹马地完成了这项任务。但是,PDO又是一个不同的故事。这是一个数据库访问抽象层,为了实现这个目标,您需要一个查询解析器,不管您喜欢与否。由于您已经有了一个查询解析器,并且其中一个驱动程序已经支持命名占位符,因此将其添加到所有支持的驱动程序中是很自然的。正如您所看到的,MySQLi与MySQLi完全不同


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

    mysql数据库引擎没有?它已准备好查询,但未将parameters.mm命名为主题外、太宽和基于意见的标志。我没想到在近距离的旗帜上会有这样的多样性;您肯定会从熟悉PHP.net核心开发的人那里得到答案,以及他们为什么这样做的根本原因,这是您得到具体答案的唯一方法。我不是那种人;-)至少我给了你一天中正确的时间。在我看来合乎逻辑的回答是:冒号
    占位符将是一个(管道)字符,区别于MySQLi_uuuu准备语句占位符
    ,其中PDO比MySQLi_uuuuAPI更易于跨不同平台传输。然而,由于它更“可移植”,核心开发人员(可能)希望人们能够同时使用
    占位符作为熟悉的可能手段;我接近你想要的答案了吗@DennisAddendum对上述内容进行了说明:“PDO将为本机不支持的驱动程序模拟准备好的语句/绑定参数,如果驱动程序支持一种样式但不支持另一种样式,还可以将命名或问号样式的参数标记重写为更合适的样式。”此外,MySQL还支持将其作为核心字符,这可能就是他们选择冒号占位符的原因。另请参见手册中的参与者注释。当PDO::ATTR_EMULATE_PREPARES设置为true时,PDO仅返回字符串是谁的错?@要消除首字母缩写“DAL”的歧义,请解释或链接您指的是数据访问层或数据库抽象层。我以为是后者,但当我用谷歌搜索验证时,我发现了前者。
    $stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (:id_value)");
    $stmt->bind_param("i", "id_value", $id);