Подтвердить что ты не робот

PHP PDO и MySQLi

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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


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

Ответ 2

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

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

Вы спрашиваете

В чем разница между 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 встроен, я бы пошел с ним.

Ответ 3

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

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

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

Итак, чтобы начать хорошее - получите код с помощью mysqli_xxx вместо mysql_xxx`.

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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