2012-04-13 3 views
21

Попытка узнать что-то новое - в частности, пытаясь выбрать, чтобы использовать MySQLi или PDO для будущих проектов при работе с MySQL. Я наткнулся на this page, в котором представлен обзор доступных мне вариантов.Что такое подготовленные на стороне клиента заявления?

В нижней части этой страницы приведена таблица, в которой сравниваются функциональные возможности трех основных методов связи с mysql. В строке «API поддерживает подготовленные заявления на стороне клиента», он говорит, что PDO поддерживает это, а MySQLi - нет.

Я знаю, какие подготовленные заявления есть. Ответ на this question - это простой пример того, что, на мой взгляд, является подготовленным оператором на стороне сервера. И PHP - это серверный язык, который, в свою очередь, должен означать, что не имеет значения, доступны ли подготовленные заявления на стороне клиента или нет. Но это заставляет меня задаться вопросом, почему это даже указано в руководстве по PHP.

Итак, какие подготовленные заявления на стороне клиента?

+3

Я предполагаю, что это использует клиент/сервер в другом контексте, чем веб-модель - то есть MySQL является сервером, а PHP является клиентом в этом контексте. Хотя они оба находятся на одном компьютере. –

+2

Скорее всего это относится к ['PDO :: ATTR_EMULATE_PREPARES'] (http://www.php.net/manual/en/pdo.setattribute.php), который имитирует подготовленные операторы с интерполяцией и экранированием. Это делается в библиотеке, так что технически клиентская сторона, прежде чем запросы будут переданы на сервер БД. – mario

+0

@MattFenwick Хотя это может иметь смысл, это не объясняет, почему одна и та же таблица показывает поддержку подготовленных операторов на стороне сервера, как и для всех библиотек, но только одна из них поддерживает клиентскую сторону, если мы принимаем предположение, что PHP является клиент. – Repox

ответ

28

Очевидно, что подготовленные на стороне клиента операторы - это операторы, которые подготовлены клиентом, а не сервером.

PDO - это уровень абстракции доступа к данным, который поддерживает несколько интерфейсов СУБД (драйверов), некоторые из которых поддерживают подготовленные операторы на стороне сервера (например, MySQL 4.1+), некоторые из которых не являются (например: MySQL 3) ,

В случае, если драйвер PDO не поддерживает подготовленные на стороне сервера операторы, PDO будет имитировать их на стороне клиента и использовать общий интерфейс запроса для их выполнения.

Причина, по которой MySQLi не поддерживает их, проста: MySQLi - это расширение, специфичное для MySQL, RDBMS, которое действительно поддерживает подготовленные на стороне сервера инструкции, поэтому нет никаких причин для имитации их.

13

Как было сказано в комментариях, в данном случае «клиент» относится к PHP и «серверу» к MySQL. PDO поддерживает базы данных, отличные от MySQL. Не все эти драйверы баз данных/db поддерживают подготовленные инструкции изначально, и в этих случаях PDO будет эмулировать эти утверждения самостоятельно. MySQLi не будет (я не знаю наверняка, когда это будет необходимо - может быть, когда дело касается старого драйвера MySQL?).

Еще один фактор, который вы, возможно, захотите рассмотреть - некоторые фреймворки PHP требуют PDO и не поддерживают mysqli.

2

С помощью PDO вы можете использовать подготовленные операторы (в коде), поддерживает ли база данных, с которой вы подключаетесь с PDO, или нет.

Если сервер обрабатывает подготовленные операторы, PDO позволяет серверу обрабатывать их (на стороне сервера). Если нет, то PDO просто эмулирует подготовленные операторы в PDO (на стороне клиента), но в конечном итоге приходится отправлять каждый запрос на сервер.

Смежные вопросы