PDO против MySQLi. Что выбрать?
Когда возникает вопрос о доступе к базе данных из кода PHP, есть два варианта: MySQLi и PDO. Что нужно знать, прежде чем сделать выбор? Различия, поддержка баз данных, стабильность, и производительность в общих чертах описываются в данном уроке.
Резюме
СоединениеConnection
Оба варианта предоставляют очень простые инструменты для соединения с базой данных:
// PDO $pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password'); // MySQLi, процедурная часть $mysqli = mysqli_connect('localhost','username','password','database'); // MySQLi, ООП $mysqli = new mysqli('localhost','username','password','database');
API
И PDO и MySQLi предлагают объектно-ориентированное API. Но MySQLi также имеет процедурную часть API, которая для новичков может показаться проще для освоения. Если вы знакомы с собственным драйвером PHP MySQL, то мигрирование на процедурную часть MySQLi будет для вас проще. Но достигнув вершин мастерства в использовании PDO, его можно будет использовать с любой базой данных без каких-либо изменений основного кода
Поддержка баз данных
Ключевым преимуществом PDO перед MySQLi является его могучая поддержка различных баз данных. На момент написания урока PDO может использовать 12 драйверов. А MySQLi - поддерживает только MySQL.
Чтобы распечатать список поддерживаемых драйверов PDO можно использовать следующий код:
var_dump(PDO::getAvailableDrivers());
Что означает разница в количестве поддерживаемых баз данных? Для ситуаций, когда в проекте надо перейти на использование другой базы данных, PDO позволит сделать процесс прозрачным. Все, что нужно будет сделать - изменить строку соединения и несколько запросов, если какие-либо методы не поддерживаются новой базой данных. В случае с MySQLi придется переписывать весь код, включая запросы.
Именованные параметры
Другой важной отличительной особенностью PDO являются именованные параметры, которые делают процедуру привязывания существенно проще:
$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600); $pdo->prepare(' SELECT * FROM users WHERE username = :username AND email = :email AND last_login > :last_login'); $pdo->execute($params);
Сравните с MySQLi:
$query = $mysqli->prepare(' SELECT * FROM users WHERE username = ? AND email = ? AND last_login > ?'); $query->bind_param('sss', 'test', $mail, time() - 3600); $query->execute();
Знак вопроса может показаться короче, чем символьные имена. Однако, теряется гибкость и устойчивость к ошибкам, так как разработчику нужно помнить о порядке следования параметров, что в большинстве случаев представляет собой зону с очень высокой вероятностью трудно распознаваемых ошибок.
К сожалению, MySQLi не поддерживает именованные параметры.
Объектное отображение
И PDO и MySQLi могут отображать результаты как объекты. Данная особенность может быть полезна в том случае, если вы не хотите использовать уровень абстракций базы данных и желаете реализовать модель объектно-реляционного отображения. Допустим, у нас есть класс User
с некоторыми свойствами, которые соответствуют именам полей в базе данных:
class User { public $id; public $first_name; public $last_name; public function info() { return '#'.$this->id.': '.$this->first_name.' '.$this->last_name; } }
Без объектного отображения нужно будет заполнять значениями каждое поле (либо вручную, либо с помощью конструктора) прежде, чем можно будет использовать метод info()
корректно.
Но объектное отображение позволяет предопределять свойства даже до того, как объект будет построен. Например:
$query = "SELECT id, first_name, last_name FROM users"; // PDO $result = $pdo->query($query); $result->setFetchMode(PDO::FETCH_CLASS, 'User'); while ($user = $result->fetch()) { echo $user->info()."\n"; } // MySQLI, процедурная часть if ($result = mysqli_query($mysqli, $query)) { while ($user = mysqli_fetch_object($result, 'User')) { echo $user->info()."\n"; } } // MySQLi, ООП if ($result = $mysqli->query($query)) { while ($user = $result->fetch_object('User')) { echo $user->info()."\n"; } }
Безопасность
Обе библиотеки предоставляют средства для защиты от SQL инъекций, которые разработчики могут использовать по своему усмотрению.
Допустим, злодей пытается встроить вредный запрос SQL через параметр ‘username’ HTTP запроса (GET):
$_GET['username'] = "'; DELETE FROM users; /*"
Если пропустить такое выражение, то оно будет включено в запрос в том виде, как есть – запрос удаляет все строки из таблицы users
(и PDO и MySQLi поддерживают множественные запросы).
// PDO, "ручная" зачистка параметра $username = PDO::quote($_GET['username']); $pdo->query("SELECT * FROM users WHERE username = $username"); // MySQLi, "ручная" зачистка параметра $username = mysqli_real_escape_string($_GET['username']); $mysqli->query("SELECT * FROM users WHERE username = '$username'");
Метод PDO::quote()
не только отбрасывает лишние символы в строке, но и заключает ее в кавычки. А функция mysqli_real_escape_string()
только отбрасывает лишние символы в строке, а в кавычки ее надо будет помещать вручную.
Другой метод защиты:
// PDO, подготовленные выражения $pdo->prepare('SELECT * FROM users WHERE username = :username'); $pdo->execute(array(':username' => $_GET['username'])); // mysqli, подготовленные выражения $query = $mysqli->prepare('SELECT * FROM users WHERE username = ?'); $query->bind_param('s', $_GET['username']); $query->execute();
Лучше использовать подготовленные выражения, чем метод PDO::quote()
и функцию mysqli_real_escape_string()
.
Производительность
И PDO и MySQLi достаточно быстро выполняются. MySQLi имеет небольшое преимущество по результатам тестов – ~2.5% для обычных запросов и ~6.5% для подготовленных выражений. Так что стоит принять информацию во внимание, если для вас будет важно даже минимальное различие в характеристиках.
Заключение
PDO одержал сравнительно легкую победу в данном поединке. С 12 различными драйверами для баз данных (доступны 18 разных баз данных!) и именованными параметрами можно игнорировать небольшое отставание в производительности. С точки зрения безопасности обе библиотеки предоставляют разработчику равные возможности и стойкость кода зависит только от программиста.
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/XHUJ1R_knMU/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-04-22 » Комментирование кода и генерация документации в PHP
- 2024-04-22 » SEO в России и на Западе: в чем основные отличия
- 2024-04-22 » SEO для международного масштабирования
- 2024-04-22 » Как использовать XML-карты для продвижения сайта
- 2024-04-22 » Цифровой маркетинг: инструменты для продвижения и рекламы в 2024 году
- 2024-04-22 » Что такое CSS-модули и зачем они нам?
- 2024-04-17 » 23 сервиса для эффективного экспресс-аудита любого сайта
- 2024-04-08 » Яндекс переходит на новую версию Wordstat
- 2024-04-08 » Яндекс интегрировал в свой облачный сервис эмпатичную нейросеть
- 2024-04-08 » Новая версия нейросети Claude превзошла по мощности аналоги Google и OpenAI
- 2024-04-08 » Как пользоваться GPT 4 и Claude бесплатно и без VPN
- 2024-03-13 » Стратегии SEO на 2024 год
- 2024-03-13 » Как использовать анимацию с помощью JavaScript-библиотеки GSAP
- 2024-03-13 » Использование GSAP 3 для веб-анимации
- 2024-03-13 » Cогласование топографической съёмки с эксплуатирующими организациями
- 2024-02-19 » Теряются лиды? Как настроить сквозную аналитику
- 2024-02-17 » Мерч и IT: на что обратить внимание в 2024 году
- 2024-02-16 » Копируем с RSync: основные примеры синхронизации файлов
- 2024-02-15 » Лучшие noCode AI платформы для создания диалоговых ботов
- 2024-02-14 » Факторы ранжирования Google 2024 — исследование Semrush
- 2024-02-12 » Перенос сайта на другой хостинг
- 2024-02-05 » В России сформирован реестр хостинг-провайдеров
- 2024-02-04 » Использование SSH для подключения к удаленному серверу Ubuntu
- 2024-02-03 » Подключаемся к серверу за NAT при помощи туннеля SSH. Простая и понятная инструкция
- 2024-02-02 » Настройка CI/CD для Gitlab-репозитория: схемы и гайд по шагам
- 2024-02-01 » GitLab CI Pipeline. Запуск сценария через SSH на удаленном сервере
- 2024-01-29 » Introduction to GitLab’s CI/CD for Continuous Deployments
- 2024-01-26 » Настройка GitLab CI/CD
- 2024-01-25 » Установка shell gitlab runner
- 2024-01-25 » Установка и регистрация gitlab-runner в docker контейнере
Лично я люблю землянику со сливками, но рыба почему-то предпочитает червяков. Вот почему, когда я иду на рыбалку, я думаю не о том, что люблю я, а о том, что любит рыба. (Дейл Карнеги / БИЗНЕС) |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.