Работа с PDO в PHP
Для структурированного хранения информации можно применять разные способы. Простыми вариантами, предусмотренными в PHP, являются объекты и массивы, но когда речь идёт о более серьёзных проектах применяются базы данных. Простой пример их использования — регистрация, авторизация на веб-сайтах.
Записываются не только пары «логин:пароль», но и, в случае с крупными площадками, обрабатывающими больше информации: имена, фамилии, электронные адреса, ссылки на аватары и прочие данные, связанные с профилями.
Несмотря на то, что вместо баз данных всё же можно задействовать массивы с записями вида «ключ значение», это решение не даёт нужного простора действий, которые можно было бы совершить, посмотрев в сторону более корректного варианта.
Описание расширения
В ранних спецификациях языка присутствовал набор функций mysql();, который поддерживал актуальные на тот момент решения для, как ясно из названия, MySQL. Будучи отмеченным в качестве устаревшего в одной из версий пятой спецификации, компонент был полностью удалён в седьмом релизе, оставив программистам только два интегрированных варианта — mysqli(); и PDO. Первый служит значительно улучшенным обновлением раннего, но не обеспечивает достаточной безопасности по умолчанию.
Ключевое преимущество PDO заключается в поддержке множества сред, в которых хранится информация. Помимо MySQL обеспечивается совместимость с:
- CUBRID;
- MSSQL;
- Sybase;
- DB2;
- IBM;
- Firebird;
- SQLite;
- PostgreSQL;
- Oracle;
- ODBC v3;
- SQL Azure;
- Informix.
Все вышеперечисленные пункты входят в драйверы PDO. Они устанавливаются отдельно, но полностью поддерживаются расширением.
Ещё одно достоинство PDO – более, чем базовая защита от SQL-инъекций, идёт по определению класса. На уровне его кода не обрабатываются методы, которые могли бы оказать фатальное воздействие на соединения с базами, установленные с помощью mysqli();без какого-либо указания функций, защищающих скрипт.
Важно серьёзно отнестись к этому вопросу – злоумышленники лишь в лучшем случае просто удалят всё, что связано с пользовательскими данными – нередки случаи, когда хакеры требуют внести оплату в обмен на сохранение полученных данных. В особо запущенных ситуациях возможен «слив» информации и повышение недоверия пользователей к ресурсу – например, в случае попадания информации о ресурсе сервисам по типу FirefoxMonitor.
К главным плюсам PDO также относится его простая установка. Класс для своей сборки не требует установки дополнительных библиотек как и для Linux, так и для Windows. Это значит, что он может работать на любых серверах, где имеются: PHP нужной версии, одна из совместимых баз данных. Во многих веб-хостингах этот модуль присутствует по умолчанию. При пользовании VPS следует обратить внимание на инструкции далее.
Установка
Начиная с PHP 5.1.0 этот модуль присутствует по умолчанию, а вместе с ним – и компонент для работы с SQLite. Если же по каким-то причинам расширения не существует (скорее всего, оно было удалено вручную), требуется от имени rootввести следующую команду:
peclinstallpdo
Веб-сервер понадобится перезагрузить. В Apache 2 присутствуют четыре команды, служащие для этих целей. Первая – stop, при которой процесс прекращает работать до ручного запуска. Вторая – graceful, когда новые соединения уже не принимаются, но ранее открытые потоки по-прежнему работают. Третья – reload, обеспечивающая продолжение работы с простой перечиткой файлов конфигурации и списка установленных модулей. Соединение при его пользовании не разрывается. Последняя – restart, при которой программа закрывается и включается заново. Он и подойдёт для применения изменений:
apachectl -k restart
Если для поддержания работы сайта используется другое приложение или даже ОС, то набор команд будет, логично, отличаться. Например, перезагрузить Nginx можно так:
systemctl restart nginx
В обоих случаях использовать sudoне понадобится – при отсутствии прав rootкоманда сама запросит пароль от учётной записи с правами суперпользователя. Далее потребуется загрузить драйвер. В случае с MySQL:
apt-getinstallphp-mysql
Работает при выполнении от root. Если этих прав нет, следует подставить команду sudo в самое начало. Полный список названий драйверов представлен в официальной документации. Заключительный этап – активация установленных наборов в настройках. При использовании UNIX-подобной ОС понадобится в документе php.ini указать:
extension=pdo.so
Если работа ведётся под Windows, в том же файле понадобится ввести extension=php_pdo.dll и прописать используемые драйверы. К примеру: extension=php_pdo_firebird.dll. Эти DLL-компоненты должны находиться в директории, указанной в значении параметра extension_dir. При использовании названий с пробелами следует заключать содержимое в кавычки. После обновления содержимого потребуется перезапустить сервер, опять же проделав представленные выше шаги.
Обзор элементов
В состав класса входят элементы, служащие для работы с информацией.
PDO::beginTransaction
Присутствует с пятой версии, подвергся серьёзным изменениям в рамках версии 5.1.0 и доступен для PECL от 0.1.0. Служит «отправной точкой» любых скриптов, предполагающих взаимодействие с базами данных, инициализируя транзакции. Проще говоря, PDO::beginTransaction даёт интерпретатору понять, где следует начать обрабатывать функции PDO.
Не требует никаких значений для работы. Информация такого вида возвращается и после выполнения функции: «истина» при успешном выполнении и «ложь» при возникновении каких-то неполадок, не давших инициализировать транзакцию, и, следовательно, помешавших работе скрипта.
PDO::commit
Устанавливает соединение с базой данных, следует сразу же за PDO::beginTransaction. Тоже способен возвращать или true, или false. Переводит подключённый модуль в режим автоматической фиксации, который спадает при начале новой транзакции с помощью описанной выше функции.
Вместе с false возвращает детальную информацию о проблеме, попадающую в рамки методов класса PDOException. Чтобы сайт выдавал текст ошибки и пользователям (со скрытыми конфиденциальными данными), следует добавить обработчика, отлавливающего подобные события и выполняющего различные действия в связи с этой ситуацией. Это поможет повысить «userexperience» – иначе посетители сайта могут думать, что это они сделали что-то не так, ведь нужное им действие не выполнилось без какого-либо окна с предупреждением.
PDO::__construct
Этот элемент PDO «строит» объект с информацией, обрабатывая данные для подключения:
- $dsn– тип базы, её название и IP-адрес (домен). В зависимости от первого параметра, – вида, определяется синтаксис, использующий для установки двух остальных значений, входящих в эту переменную;
- $username – имя пользователя БД;
- $passwd – пароль для юзера БД, указанного до этого;
- $options– дополнительные настройки, вводимые в массиве формата «ключ значение».
Все значения необязательны, кроме первого. Пример сценария, при котором не потребуется задавать ни $username, ни $passwd, ни $options–соединение по URI, подходящее, к примеру, при работе с ODBCv3 (и наличии нужного драйвера).
Важное замечание: к информации, передаваемой с помощью $dsn, понадобится добавить &charset=utf-8, чтобы корректно обрабатывать значения с буквами, отличающимися от английских. Эта кодировка должна поддерживаться и в других частях кода, например – конвертацией значений.
PDO::errorCode
Для отладки ошибок следует поставить условия if-elseif-else, выполняющие разные действия в зависимости от успешности срабатывания скрипта.PDO::errorCode возвращает код ошибки в формате SQLSTATE и связанный с последней операцией.
Не стоит путать значения, извлекаемые из этого компонента, с HTTP-кодами. Рассматриваемые комбинации представляют собой состоящие из пяти символов наборы букв и цифр, определённые классификацией ANSISQL-92. Также может возвращать null, если работа с БД ещё не проводилась.
PDO::prepare
Нужен на случай использования псевдопеременных, то есть практически всегда. Занимается подготовкой запроса к отправке с помощью следующей функции, подставляя нужные значения на место именованных и анонимных данных. Одновременно использовать динамически изменяемую информацию разных типов не удастся.
Обязательно обратиться к PDO::prepareи в случае, если планируется задействовать оператор LIKE.
PDO::exec
Сложно описать «важность» входящих в состав этого класса компонентов, но данная часть расширения – одна из самых главных, без которых скрипты были бы лишены смысла. С помощью функции проводитсяSQL-запрос, указываемый в единственном совместимом параметре –$statement. Переменная может являться только строкой.
Возвращает число, показывающее количество строк, затронутых в ходе изменений. Если их нет, выведется 0. Пустые значения выдаются при обработке с использованием оператора SELECT. Также может возникнуть false, появляющийся в случае проблем с исполнением запроса.
Примеры использования
Проверка драйверов
Важный момент перед началом работы – вывод установленных драйверов, которые были обнаружены PHP и способны действовать без ошибок. Нужно обратиться к PDO::getavailabledrivers();, как к массиву:
print_r(PDO::getAvailableDrivers());
Если всё в порядке – можно продолжать писать программы. Иначе – заново прочитать инструкции, представленные в материале.
Соединение с БД
Для дальнейшего обращения к базе данных понадобится записать её в переменную, сперва подключившись с использованием PDO::__construct. Можно записать все входящие в функцию значения как и в отдельные переменные, так и явно указать:
<?
$data = «mysql:dbname=mydb;host=::1»;
$user = «sqladmin»;
$password = «you.cannot.hack.me»;$db = newPDO($data, $user, $password);
Или, что более компактно, но менее просто разбираемо при подстановке больших значений:
<?
$db = newPDO(«mysql:dbname=mydb;host=::1», «sqladmin», «you.cannot.hack.me»);
Отправка SQL-запросов
Ниже – реальный скрипт, который обратится к MYSQL-базе categories и удалит входящие в неё значения. Далее запишется количество задействованных строк, это значение будет выведено в составе переменной.
<?
$db = newPDO(«mysql:dbname=mydb;host=::1», «sqladmin», «you.cannot.hack.me»); // Подключение к базе данных (БД)
$remove = $db->exec(«DELETE FROM categories»); // Удаление элементов категории categories
echo»Удалено {$remove} строк.»; // Вывод количества удалённых элементов
?>
Заключение
PDO – это просто! Разобраться в его азах можно за пару минут, если есть опыт в SQL или за несколько строк кода, если знания в работе с базами данных изначально невелики.
