Почему библиотека MySQLi не поддерживает именованные параметры?

Соответствующий синтаксис синтаксиса MySQLi с параметром http://php.net/manual/en/mysqli.quickstart.prepared-statements.php:

$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.

Ответ 1

MYSQLi не поддерживает именованные параметры по двум основным причинам:

  1. Он "предназначен" (я использую этот термин свободно) для использования с оберткой и
  2. Это делает аналог PDO - и нет смысла заново изобретать колесо

Чтобы уточнить пункт 1: mysqli, несмотря на многочисленные недостатки по сравнению с PDO, становится легко сопоставимым с хорошей оберткой, то есть именованные параметры (среди прочих) поддерживаются оберткой, а не самим TG44. Это сделано по одной единственной причине:

  1. Mysqli предназначен для быстрой и гибкой библиотеки.

Если разработчики встраивают в базовую библиотеку гораздо больше функций, она становится, интуитивно понятным, менее гибкой и требует более длительного времени загрузки/выполнения.

И mysqli, и pdo были выпущены с PHP 5 (я думаю, PDO с версией 5.3) и поэтому предназначены для различных целей.

Вы хотите более быстрое время выполнения? используйте mysqli без оболочки. Вы хотите именованные параметры? используйте PDO или создайте оболочку mysqli для такой обработки - но будьте осторожны, это помешает вашему времени выполнения.

Ответ 2

MySQLi традиционно является очень тонкой оболочкой для MySQL API. Он ничего не добавляет сам по себе и по причине: добавление таких функций, как именованные заполнители, потребует, если вы подумаете, целого левиафана разбора SQL-запросов. Определенно, это не работа для API базы данных. Как сказано в другом ответе, API - это не DAL; они служат для разных целей.

ЗОП был великим подвигом, который вы вряд ли увидите снова на этом языке, а Уэс Фарлонг - гений, который выполнил задачу почти высокомерно. Но опять же, PDO - это другая история. Это уровень абстракции доступа к базе данных, и для достижения этой цели вам нужен анализатор запросов, нравится вам это или нет. А так как у вас уже есть анализатор запросов и один из драйверов уже поддерживает именованные заполнители, было бы естественно добавить его во все поддерживаемые драйверы. Как видите, с MySQLi все по-другому.

Короче говоря, речь идет не о "лени"; речь идет о следовании спецификации.

Ответ 3

Причина этого довольно проста: они не ленивы, и они, вероятно, хотели бы иметь эту функцию, но для них это может быть невозможно, а : может быть уже чем-то уже.

Хотя, я бы настоятельно предложил не использовать MySQLI и переходить на PDO, поскольку это проще, и это проще для таких людей, как я и вы, чтобы понять.