PHP PDO и MySQLi

Я только что закончил вводный курс в PHP, и на протяжении всего форума stackoverflow люди рекомендовали переключиться на PDO, подготовленные заявления или MYSQLi, я вкратце проверил руководство, но большая часть его прошла по моей голове.

Я использую функции mysql_ * до сих пор, поэтому эти понятия для меня новы. Я думаю, что они используются для доступа и выполнения конкретных действий с базой данных, но я не уверен.

Итак, какова разница между PDO, подготовленными операциями и MySQLi, являются ли они разными функциями, которые выполняют одну и ту же задачу? Являются ли они совместимыми в сценарии или они «выбирают один или другой»? И, наконец, что дает лучшую производительность?

Обновление: спасибо за ответы, я буду охотиться за дополнительными учебниками PDO.

Для справки я также нашел следующие сообщения полезными:

Какой из них быстрый и легкий – mysqli или PDO

mysqli или PDO – каковы плюсы и минусы?

Related of "PHP PDO и MySQLi"

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

mysql * – очень простое расширение, которое в основном позволяет вам подключаться к базе данных, отправлять SQL-запросы и не намного больше.
mysqli улучшает это (как следует из названия), добавляя параметризованные запросы и несколько других вещей в микс.
PDO – это расширение, которое абстрагирует несколько драйверов баз данных в одном пакете, то есть позволяет использовать один и тот же код для подключения к MySQL, Oracle, MS SQL Server и нескольким другим базам данных без необходимости использования расширений, специфичных для базы данных, или переписать код, когда вы переключаете базы данных (теоретически, по крайней мере). Он также поддерживает параметризованные запросы.

Если вы знаете, что собираетесь использовать MySQL исключительно, mysqli – хороший выбор. Тем более, что вы можете использовать его процедурным способом, к чему вы уже привыкли, из расширения mysql. Если вы не знакомы с ООП, это полезно. В противном случае PDO – это хороший объектно-ориентированный гибкий соединитель базы данных.


* Обратите внимание, что расширение mysql теперь устарело и будет удалено когда-нибудь в будущем . Это потому, что он древний, полный плохих практик и не хватает некоторых современных функций. Не используйте его для написания нового кода.

PDO – это «объект данных PHP». В основном я использую PDO, поэтому могу говорить только по существу:

  • Работает для гораздо большего количества баз данных, чем просто MySQL (может и не иметь значения для вас)
  • Скомпилированный C, поэтому он быстрее (предположительно)
  • Подготовленные заявления (у других есть, хотя)
  • Кажется, похоже, что это нравится, поэтому вы, вероятно, можете получить здесь большую помощь
  • Различные режимы обработки выборки / ошибок, которые вы можете установить и изменить на лету

Ты спрашиваешь

Итак, в чем разница между PDO, подготовленными операциями и MySQLi …

PDO и MySQLi являются обертками DB. «Подготовленные заявления» – совсем другое понятие. Вы можете подготовить запрос, который может выполняться несколько раз, и корректно параметризованные операторы являются безопасными SQL-инъекциями (хотя, возможно, и не доказательством). Последняя причина – большая причина, почему вы должны использовать PDO (или MySQLi), но подготовленные заявления также привносят четкость в запросы.

 /* mysql_* version */ mysql_connect("host"); $query = "SELECT column FROM db1.t1 WHERE id = "; foreach ($_GET['id'] as $id) { $id = mysql_real_escape_string($id); $result = mysql_query($query . "'$id'"; while ($row = mysql_fetch_assoc($result)) { echo "$row[column]\n"; } } //NOTE: it would probably be better to store the resource returned by //mysql_connect and use that consistently (in query/escape) /* PDO version */ $pdo = new PDO('mysql:host=HOST', 'user', 'pass'); $query = $pdo->prepare("SELECT column FROM db1.t1 WHERE id = ?"; foreach ($_GET['id'] as $id) { $query->execute($id); echo $query->fetch(PDO::FETCH_COLUMN); } //Notice that you skip the escape step. 

Вы можете сделать то же самое с MySQLi , но я предпочитаю синтаксис PDO . Это может быть и быстрее, но я мог бы это сделать. Существует также PEAR MDB2 о котором редко говорят, и я уверен, что еще много. Поскольку PDO встроен, я бы пошел с ним.

Если вы привыкли к функциям mysql_xxx , я бы начал, перейдя к расширению MySQLi .

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

Функции, доступные с MySQLi, в значительной степени аналогичны функциям mysql_xx к mysql_xx вы привыкли; обычно можно взять существующий код, сделать прямую замену между ними, и код должен продолжать работать нормально.

Так что это хорошее место для начала – получите свой код с помощью mysqli_xxx вместо mysql_xxx`.

Если возможно, я бы рекомендовал использовать объектно-ориентированный синтаксис, а не процедурный синтаксис. MySQLi поддерживает оба параметра, а процедурный синтаксис будет ближе к тому, к чему вы привыкли, но синтаксис OO более гибкий в долгосрочной перспективе, и на самом деле это не так уж и много, как только вы привыкли к нему.

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

Исходя из той же точки зрения, что и вы. С моей точки зрения, я не думаю, что разница действительно заметна (в зависимости от того, для чего вы ее используете). Похоже, что PDO – это просто api базы данных, которая объединяет ВСЕ другую базу данных api в одну. Поэтому, если вам нужно подключиться к серверу MS Sql и серверу MySQL, вы можете просто вызвать PDO api и указать драйвер для конкретного db. Я также предполагаю, что любые будущие возможности и возможности в MySQL будут доступны только в PDO. Поэтому в основном просто используйте PDO, чтобы обеспечить доступ ко всем последним функциям.

Одним большим преимуществом PDO является независимость платформы. Это означает, что вы можете в какой-то момент перейти на другую СУБД без необходимости перекодировать все вызовы функций. Так обычно делаются на Java (через JDBC), .Net (ADO) и в большинстве других сред. Преимущество заключается не только в том, что вы можете переключать СУБД как таковой, но и у вас есть только один API для изучения.

Что касается вашего вопроса, уровень PDO предоставляет возможность делать подготовленные заявления. Идея подготовленных операторов состоит в том, что вы создаете заполнители для частей вашего оператора SQL, которые не будут известны до времени выполнения. Многие ученики начинают с создания SQL как строки, которая выполняется, вызывая mysqli :: query ($ someQuery). Это проблема по многим причинам, наиболее заметным из которых является уязвимость к SQL-инъекции (см. Stackoverflow.com/questions/5315351 для аналогичного вопроса и ответа). С помощью PDO вы можете избежать SQL-инъекций и всех проблем обработки символов, таких как кавычки, обратные косые черты и т. Д. Конечным результатом является то, что ваш код более безопасен, читабельен и предсказуем.

Если вы уже поняли, как использовать mysqli, то использование PDO не сильно отличается. Связанный вопрос и ответ выше показывают пример запроса, который отправляется с использованием подготовленных PDO-заявлений, которые должны служить полезным руководством.

Итак, какова разница между PDO, подготовленными операциями и MySQLi, являются ли они разными функциями, которые выполняют одну и ту же задачу?

Разница довольно проста.
PDO можно использовать с подготовленными операторами, а mysqli – нет .

Просто запустите некоторые обычные запросы с обоими API, используя собственные подготовленные инструкции, и вы четко увидите разницу.