Попытка узнать что-то новое – в частности, пытаясь выбрать, использовать MySQLi или PDO для будущих проектов при работе с MySQL – я наткнулся на эту страницу, на которой представлен обзор доступных мне вариантов.
В нижней части этой страницы находится таблица, сравнивающая функциональность трех основных методов связи с mysql. В строке « API поддерживает подготовленные заявления на стороне клиента » говорится, что PDO поддерживает это, а MySQLi – нет.
Я знаю, какие подготовленные заявления есть. Ответ на этот вопрос является простым примером того, что, по моему мнению, является подготовленными на стороне сервера заявлениями. И PHP – это серверный язык, который, в свою очередь, должен означать, что не имеет значения, доступны ли подготовленные заявления на стороне клиента или нет. Но это заставляет меня задаться вопросом, почему это даже указано в руководстве по PHP.
Итак, какие подготовленные заявления на стороне клиента?
Очевидно, что подготовленные на стороне клиента операторы являются операциями, которые готовятся клиентом, а не сервером.
PDO – это уровень абстракции доступа к данным, который поддерживает несколько интерфейсов СУБД (драйверов), некоторые из которых поддерживают подготовленные на стороне сервера операторы (например, MySQL 4.1+), некоторые из которых не являются (например, MySQL 3).
В случае, когда драйвер PDO не поддерживает подготовленные операторы на стороне сервера, PDO будет имитировать их на стороне клиента и использовать общий интерфейс запросов для их выполнения.
Причина, по которой MySQLi не поддерживает их, проста: MySQLi – это расширение, специфичное для MySQL, RDBMS, которое действительно поддерживает подготовленные на стороне сервера инструкции, поэтому нет никаких оснований для имитации их.
Как было сказано в комментариях, в этом случае «клиент» относится к PHP и «сервер» к MySQL. PDO поддерживает базы данных, отличные от MySQL. Не все эти драйверы баз данных / db поддерживают подготовленные инструкции изначально, и в этих случаях PDO будет эмулировать эти утверждения самостоятельно. MySQLi не будет (я не знаю наверняка, когда это будет необходимо – может быть, когда дело касается старого драйвера MySQL?).
Еще один фактор, который вы, возможно, захотите рассмотреть – некоторые фреймворки PHP требуют PDO и не поддерживают mysqli.
С помощью PDO вы можете использовать подготовленные операторы (в коде), поддерживает ли база данных, с которой вы подключаетесь с PDO, или нет.
Если сервер обрабатывает подготовленные операторы, PDO позволяет серверу обрабатывать их (на стороне сервера). Если нет, то PDO просто эмулирует подготовленные операторы в PDO (на стороне клиента), но в конечном итоге приходится отправлять каждый запрос на сервер.