Работа с PDO в PHP

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 или за несколько строк кода, если знания в работе с базами данных изначально невелики.

Оцените статью
Образовательный портал WELCOME4U.RU
Добавить комментарий

Adblock
detector