Работа с базами данных в php. Модуль PDO
В предыдущей заметке мы ознакомились с устаревшим модулем mysql. Здесь мы приведем пример работы с более современным. Модуль PDO позволяет работать с различными базами данных, например, MySQL, PostgreSQL, SQLite, ODBC, DB2, Oracle, Firebird и т.д. Он быстрее в сравнении с модулем mysql и более защищен. Нету надобности вызывать что-то вроде mysql_real_escape_string() - защита от инъекций осуществляется иначе (об этом немного позже).
Приведем необходимый минимум для работы с БД на примере MySQL базы, по аналогии с предыдущей заметкой.
Соединяемся с БД. Сделать это можно в самом конструкторе:
$DBH = new PDO("mssql:host=$host;dbname=$dbname", $user, $pass);
Дальше возможно напрямую исполнить запрос, например, так:
$STH = $DBH->query('CREATE TABLE `table`')
Но этот метод небезопасный в случае подстановки параметров. Вообще, лучше использовать метод query только в случае DDL-запросов (модификация структуры БД), и отдельно проверять параметры, если они есть.В случае использования DML-запросов (для манипуляций с данными) более предпочтительным есть использование так называемых плейсхолдеров(placeholders) - участков в запросе, куда можно подставить параметры. Плейсхолдеры бывают безымянные и именные:
Безымянные:
$STH = $DBH->prepare("INSERT INTO table (field1, field2, field3) values (?, ?, ?)");
Именные:
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values (:name, :addr, :city)");
В первом случае параметры подставляются на место "?", во втором на место ":*"После этого можно биндить параметры:
$STH->bindParam(1, $name);
$STH->bindParam(2, $addr);
$STH->bindParam(3, $city);
(В случае безымянных параметров, цифры определяют плейсхолдер).В случае именных плейсхолдеров:
$STH->bindParam(':name', $name);
После подставления плейсхолдеров, выполняем запрос:
$STH->execute()
Параметры, подставлены в плейсхолдерах автоматически заэкранированы.
Можно обойтись без bind(), передав в execute() массив параметров:
$STH->execute(array('field1', 'field2', 'field3'));
То есть, для исполнения запроса надо сделать 3 шага:
Дальше, для получения данных в виде массива можно использовать метод fetch(), либо fetchAll(), чтобы сразу получить результат запроса целиком.
while($res = $STH->fetch()) {
echo $row->name;
}
На этом пока все - мы ознакомились из базовыми принципами работы с модулем PDO.