Почему библиотека 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
не поддерживает именованные параметры по двум основным причинам:
- Он "предназначен" (я использую этот термин свободно) для использования с оберткой и
- Это делает аналог
PDO
- и нет смысла заново изобретать колесо
Чтобы уточнить пункт 1: mysqli
, несмотря на многочисленные недостатки по сравнению с PDO
, становится легко сопоставимым с хорошей оберткой, то есть именованные параметры (среди прочих) поддерживаются оберткой, а не самим TG44. Это сделано по одной единственной причине:
Mysqli
предназначен для быстрой и гибкой библиотеки.
Если разработчики встраивают в базовую библиотеку гораздо больше функций, она становится, интуитивно понятным, менее гибкой и требует более длительного времени загрузки/выполнения.
И mysqli
, и pdo
были выпущены с PHP 5 (я думаю, PDO с версией 5.3) и поэтому предназначены для различных целей.
Вы хотите более быстрое время выполнения? используйте mysqli
без оболочки. Вы хотите именованные параметры? используйте PDO
или создайте оболочку mysqli
для такой обработки - но будьте осторожны, это помешает вашему времени выполнения.
Ответ 2
MySQLi традиционно является очень тонкой оболочкой для MySQL API. Он ничего не добавляет сам по себе и по причине: добавление таких функций, как именованные заполнители, потребует, если вы подумаете, целого левиафана разбора SQL-запросов. Определенно, это не работа для API базы данных. Как сказано в другом ответе, API - это не DAL; они служат для разных целей.
ЗОП был великим подвигом, который вы вряд ли увидите снова на этом языке, а Уэс Фарлонг - гений, который выполнил задачу почти высокомерно. Но опять же, PDO - это другая история. Это уровень абстракции доступа к базе данных, и для достижения этой цели вам нужен анализатор запросов, нравится вам это или нет. А так как у вас уже есть анализатор запросов и один из драйверов уже поддерживает именованные заполнители, было бы естественно добавить его во все поддерживаемые драйверы. Как видите, с MySQLi все по-другому.
Короче говоря, речь идет не о "лени"; речь идет о следовании спецификации.
Ответ 3
Причина этого довольно проста: они не ленивы, и они, вероятно, хотели бы иметь эту функцию, но для них это может быть невозможно, а :
может быть уже чем-то уже.
Хотя, я бы настоятельно предложил не использовать MySQLI и переходить на PDO, поскольку это проще, и это проще для таких людей, как я и вы, чтобы понять.