PHP Data Objects (PDO) представляет собой универсальный интерфейс для работы с базами данных в PHP.
Если раньше для каждой СУБД было необходимо не только устанавливать соответствующее расширение, но и писать по несколько раз одно и тоже только потому, что в различных расширениях были, как минимум, различные имена классов, то благодаря PDO можно об этом наконец-то забыть. Кроме того, PDO обеспечивает более высокий уровень безопасности web приложений.
Работа с PDO осуществляется исключительно в, так называемом, объектно-ориентированном стиле. Когда необходимый инструментарий для работы с базой данных доступен в качестве свойств и методов экземпляра соответствующего класса.
PDO обладает довольно широким функционалом, но в данной статье мы рассмотрим лишь самое основное.
Создание и уничтожение подключения к базе данных
Создание подключения производится непосредственно при создании экземпляра класса PDO. При этом в качестве параметров конструктора передаётся специальная строка подключения и, если нужно, имя пользователя и пароль.
В качестве примера приведём создание подключения к СУБД MySQL.
1 2 3 4 5 |
$user="userName"; $pass="password"; $host="localhost"; $dbname="pdotest"; $conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); |
Чтобы уничтожить ранее созданное подключение достаточно присвоить ему значение null
1 |
$conn = null; |
Выборка записей
Для выборки записей используется метод query.
1 |
$query=$conn->query("SELECT test_text FROM test_table"); |
В нём прописывается запрос к СУБД, результаты которого можно извлечь тремя способами.
1.Поочерёдно при помощи метода fetch
1 2 3 4 |
while ($row=$query->fetch()) { echo $row['test_text']; } |
При таком способе данные считываются по одной записи на каждом этапе цикла. Каждая запись представлена в PHP в виде ассоциативного массива.
2.Сразу при помощи метода fetchAll
В этом случае выбираются сразу все записи соответствующие данному SQL запросу.
1 |
$result=$query->fetchAll(); |
Выбранные записи представлены, по сути, в виде массива массивов и при обходе, например, в цикле foreach можно использовать синтаксис аналогичный предыдущему способу.
1 2 3 4 |
foreach ($result as $row) { echo $row['test_text']; } |
Так как данная функция сразу возвращает весь набор данных, её не рекомендуется использовать при работе с их большим количеством.
3.Поочерёдно с помощью метода fetchColumn
Особенность этого способа в том, что выбираются значения только одного конкретного столбца. Что с одной стороны очень удобно так как позволяет сократить объем кода, но в то же время указание необходимого столбца возможно только по его номеру в наборе. Это создаёт неудобства и провоцирует ошибки.
Поэтому данный способ лучше всего применять только в случае запросов, которые сами по себе получают из базы данных только один столбец. Такой подход делает его использование максимально эффективным. В этом случае даже не требуется явно указывать номер столбца.
Например, при выводе данных для запроса:
1 |
SELECT test_text FROM test_table |
С применением метода fetchColumn задача упрощается до предела.
1 2 3 4 |
while ($r=$query->fetchColumn()) { echo $r; } |
Параметры запросов в PDO
Прежде чем перейти к описанию добавления и удаления записей необходимо сказать несколько слов об использовании параметров SQL запросов в PDO.
В PDO существует два типа параметров запроса:
- Позиционные.
Например:
1$queryText="SELECT test_text FROM test_table WHERE id=?"; - Именованные
Например:
1$queryText="SELECT test_text FROM test_table WHERE id=:id";
Для позиционных параметров необходимо соблюдать последовательность их указания. В случае именованных параметров последовательность соблюдать необязательно (их значение задаётся по имени).
Для выполнения параметрических запросов в PDO используется механизм, так называемых, подготовленных выражений. Когда запрос предварительно формируется и лишь потом запускается.
Это используется в том числе для многократного выполнения однотипных запросов и защиты web приложения от угроз безопасности, но сейчас речь не об этом.
Если требуется выполнить параметрический запрос, вначале необходимо его создать с помощью метода prepare.
1 2 |
$queryText="SELECT test_text FROM test_table WHERE id=?"; $query=$conn->prepare($queryText); |
Затем нужно связать параметры при помощи метода bindValue. Этот метод принимает два параметра. Номер параметра в последовательности и его значение.
1 |
$query->bindValue(1,2); |
Или bindParam:
1 2 |
$val=2; $query->bindParam(1,$val); |
Между ними есть строгое различие.
- bindValue – присваивает параметру конкретное значение жёстко фиксированное в коде;
- bindParam – присваивает параметру значение некоторой переменной.
После создания запроса и связывания параметров его можно выполнить при помощи метода execute.
1 |
$query->execute(); |
После этого результаты запроса можно извлечь любым из способов, приведённых ранее.
Существует также альтернативный подход. Когда связывание параметров запроса производится непосредственно при вызове метода execute. Для этого ему в качестве параметра передаётся массив с их значениями.
1 |
$query->execute(array(2)); |
При таком способе связывания позиционных параметров необходимо быть очень внимательными, так как возможны ошибки в очерёдности.
Для связывания именованных параметров применяются все способы, приведённые выше для позиционных. Есть только два отличия.
При использовании методов bindValue и bindParam вместо номера параметра в последовательности указывается его имя.
Например, так:
1 |
$query->bindValue("id",2); |
Или так:
1 2 |
$val=2; $query->bindParam("id",$val); |
При использовании связывания при помощи метода execute вместо обычного массива передаётся ассоциативный. При этом соблюдается тот же принцип: имя параметра – его значение.
1 |
$query->execute(array("id"=>2)); |
Добавление записей
Для того чтобы с помощью PDO добавить новую запись необходимо создать и выполнить соответствующий параметрический запрос.
Его создание и выполнение ничем не отличается от параметрических запросов на выборку данных, которые были подробно описаны выше.
1 2 3 |
$insertQueryText="INSERT INTO test_table (test_text) VALUES (:val)"; $insertQuery=$conn->prepare($insertQueryText); $insertQuery->execute(array("val"=>"text4")); |
Различие только в тексте непосредственно самого SQL запроса.
Удаление записей
Удаление записей производится аналогичным образом.
1 2 3 |
$deleteQueryText="DELETE FROM test_table WHERE id=:id"; $deleteQuery=$conn->prepare($deleteQueryText); $deleteQuery->execute(array("id"=>4)); |
Перспективы использования
PDO переводит работу с базами данных в PHP на новый гораздо более высокий уровень. Как в плане технологии, так и в отношении безопасности. Поэтому всё больше разработчиков выбирают именно PDO. На сегодняшний день одно из основных направлений, если уже не main stream.
Безусловно, никто не запрещает применять и более ранний инструментарий. Но, подобное чревато не только сохранением старых технологических издержек. Это может привести к тому, что проект рано или поздно станет больше невозможно развивать в соответствии с актуальными требованиями.
Хотя бы по той простой причине, что устаревшие расширения PHP со временем удаляются разработчиками. Как это было, скажем, с расширением mysql, которое было объявлено устаревшим (deprecated) ещё начиная с версии 5.5.0, а в PHP 7 удалено вовсе. Поэтому все, кто заблаговременно не перешёл на PDO или MySQLi, теперь вынуждены либо оперативно переписывать всю логику взаимодействия с базами данных, либо так и оставаться на PHP 5.
Независимо от предпочтений того или иного конкретного разработчика PDO на сегодняшний день уже входит в число основных технологий работы с базами данных в PHP и поэтому знакомство с ней обязательно.
Добавить комментарий