Heim  >  Fragen und Antworten  >  Hauptteil

Warum unterstützt die MySQLi-Bibliothek benannte Parameter nicht nativ?

Korrekte MySQLi-parametrisierte Abfragesyntax von http://php.net/manual/en/mysqli.quickstart.prepared-statements.php:

$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)");
$stmt->bind_param("i", $id);

Aber tu das niemals:

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

Meiner Meinung nach 命名参数替换是在API级别实现的合理功能。令我惊讶的是,MySQLi 在库中只实现了 未命名参数.

Gibt es einen triftigen Grund? Angesichts der Tatsache, dass PDO, DQL und ORM alle benannte Parameter in Abfragen verwenden, ergibt das für mich keinen Sinn.

Ich hoffe, MySQLi-Entwickler geraten nicht in die Situation „Wir sind faul und wollen nicht“. Ich glaube, dass es einen guten Grund geben muss, und ich suche nach diesem Grund oder nach einer Möglichkeit, diesen Grund zu finden. Der Grund, warum benannte Parameter nicht in der MySQLi-Erweiterungsbibliothek implementiert sind.

P粉024986150P粉024986150377 Tage vor621

Antworte allen(2)Ich werde antworten

  • P粉792026467

    P粉7920264672023-11-01 09:02:19

    传统上,MySQLi 是 MySQL API。它本身不会添加任何内容,并且是有原因的:添加命名占位符等功能将需要(如果您想到的话)整个 SQL 查询解析的庞然大物。当然,这不是数据库 API 的工作。就像其他答案中所说的那样,API 不是 DAL 或 DBAL;它们有不同的用途。

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

    简单来说,不是“懒”,而是“懒”。这是关于遵循规范。

    Antwort
    0
  • P粉533898694

    P粉5338986942023-11-01 00:14:00

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

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

    详细说明第 1 点:mysqli,尽管与 PDO 相比有许多缺点,但很容易与一个好的包装器相媲美 - 即命名参数(除其他外) )由包装器而不是 mysqli 本身支持。这是设计使然,只有一个原因:

    1. Mysqli 被设计为一个快速且灵活的库。

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

    mysqlipdo 都是随 PHP 5 发布的(我相信 PDO 版本为 5.3),因此有不同的用途。

    您想要更快的执行时间吗?使用没有包装器的mysqli。您想要命名参数吗?使用 PDO 或构建 mysqli 包装器来处理此类问题 - 但请注意,这会阻碍您的执行时间。

    Antwort
    0
  • StornierenAntwort