Ниже приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и удаление данных. Подробнее о методах PDO можно узнать на php.net.
Для примеров используется таблица `category`
с полями `id`
, `name`
и `parent`
.
Четвертым параметром конструктора PDO можно указать параметры подключения, например SQL запрос который будет выполнен сразу после подключения:
$dbh = new PDO('
mysql:dbname=db_name;host=localhost',
'логин',
'пароль',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")
);
Чтобы отследить ошибку подключения к БД используется исключение:
try {
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
} catch (PDOException $e) {
die($e->getMessage());
}
SQLSTATE[HY000] [1045] Access denied for user 'логин'@'localhost' (using password: YES)
Выборка одной записи
PDO позволяет использовать в запросах псевдопеременные чтобы исключить SQL инъекции. В самом запросе в место данных указывается ?
или :id
, а в методе execute()
указываются реальные значения этих переменных.
$sth = $dbh->prepare("SELECT * FROM `category` WHERE `id` = ?");
$sth->execute(array('21'));
$array = $sth->fetch(PDO::FETCH_ASSOC);
print_r($array);
или
$sth = $dbh->prepare("SELECT * FROM `category` WHERE `id` = :id");
$sth->execute(array('id' => '21'));
$array = $sth->fetch(PDO::FETCH_ASSOC);
print_r($array);
Array
(
[id] => 21
[parent] => 3
[name] => Хурма
)
Выборка всех записей таблицы
Данный пример получает всю таблицу в виде ассоциативного массива:
$sth = $dbh->prepare("SELECT * FROM `category` ORDER BY `name`");
$sth->execute();
$array = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($array);
Array
(
[0] => Array (
[id] => 16
[parent] => 3
[name] => Абрикос
)
[1] => Array (
[id] => 28
[parent] => 3
[name] => Авокадо
)
...
)
Получить значение поля одной записи
$sth = $dbh->prepare("SELECT `name` FROM `category` WHERE `id` = ?");
$sth->execute(array('21'));
$value = $sth->fetch(PDO::FETCH_COLUMN);
echo $value; // Выведет "Хурма"
Получение всех значений одного столбца таблицы
Пример получает все значения поля `name`
из таблицы `category`
.
$sth = $dbh->prepare("SELECT `name` FROM `category`");
$sth->execute();
$array = $sth->fetchAll(PDO::FETCH_COLUMN);
print_r($array);
Array
(
[0] => Мороженое
[1] => Овощи
[2] => Фрукты
[3] => Ягоды
[4] => Грибы
[5] => Морепродукты
[6] => Смеси
...
)
Получение структуры таблицы
$sth = $dbh->prepare("SHOW COLUMNS FROM `category`");
$sth->execute();
$array = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($array);
Array
(
[0] => Array
(
[Field] => id
[Type] => int(10) unsigned
[Null] => NO
[Key] => PRI
[Default] =>
[Extra] => auto_increment
)
[1] => Array
(
[Field] => parent
[Type] => int(11) unsigned
[Null] => NO
[Key] =>
[Default] => 0
[Extra] =>
)
[2] => Array
(
[Field] => name
[Type] => varchar(255)
[Null] => NO
[Key] =>
[Default] =>
[Extra] =>
)
)
$sth = $dbh->prepare("INSERT INTO `category` SET `parent` = :parent, `name` = :name");
$sth->execute(array('parent' => 1, 'name' => 'Виноград'));
// Получаем id вставленной записи
$insert_id = $dbh->lastInsertId();
$count = $dbh->exec("DELETE FROM `category` WHERE `parent` = 1");
echo 'Удалено ' . $count . ' строк.';
Или метод c псевдопеременными:
В PDO есть метод errorInfo()
который возвращает сведенья об ошибке последнего запроса.
// Таблицы `category_new` нет в БД.
$sth = $dbh->prepare("INSERT INTO `category_new` SET `parent` = :parent, `name` = :name");
$sth->execute(array('parent' => 1, 'name' => 'Виноград'));
$info = $sth->errorInfo();
print_r($info);
Array
(
[0] => 42S02
[1] => 1146
[2] => Table 'database.category_new' doesn't exist
)
Например, рассмотрим следующий код:
Этот код выведет следующее:
Вывод показывает SQL-запрос с заполнителями и значениями заполнителей (в данном случае :name — «John», а :age — 35). Это может быть полезно для проверки того, что в запросе используются правильные значения, или для выявления проблем с запросом или заполнителями.
Надеюсь, это поможет! Дайте знать, если у вас появятся вопросы.