Справочники, инструменты, документация

SQL: Примеры использования PDO 🎯

Ниже приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и удаление данных.

Подключение к серверу MySQL

$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');

Четвертым параметром конструктора 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();

Изменение записей

$sth = $dbh->prepare("UPDATE `category` SET `name` = :name WHERE `id` = :id");
$sth->execute(array('name' => 'Виноград', 'id' => 22));

Удаление из БД

$count = $dbh->exec("DELETE FROM `category` WHERE `parent` = 1");
echo 'Удалено ' . $count . ' строк.';

Или метод c псевдопеременными:

$sth = $dbh->prepare("DELETE FROM `category` WHERE `parent` = :parent");
$sth->execute(array('parent' => 1));

Обработка ошибок

В 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
)