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

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

Для примеров используется таблица `category` с полями `id`, `name` и `parent`.

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

Четвертым параметром конструктора PDO можно указать параметры подключения, например SQL запрос который будет выполнен сразу после подключения:

$dbh = new PDO('
	mysql:dbname=db_name;host=localhost', 
	'логин', 
	'пароль', 
	array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")
);
PHP

Чтобы отследить ошибку подключения к БД используется исключение:

try {
	$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
} catch (PDOException $e) {
	die($e->getMessage());
}
PHP
SQLSTATE[HY000] [1045] Access denied for user 'логин'@'localhost' (using password: YES)
2

Выборка одной записи

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);
PHP

или

$sth = $dbh->prepare("SELECT * FROM `category` WHERE `id` = :id");
$sth->execute(array('id' => '21'));
$array = $sth->fetch(PDO::FETCH_ASSOC);
print_r($array);
PHP
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);
PHP
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; // Выведет "Хурма"
PHP

Получение всех значений одного столбца таблицы

Пример получает все значения поля `name` из таблицы `category`.

$sth = $dbh->prepare("SELECT `name` FROM `category`");
$sth->execute();
$array = $sth->fetchAll(PDO::FETCH_COLUMN);
print_r($array);
PHP
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);
PHP
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] => 
        )
)
3
$sth = $dbh->prepare("INSERT INTO `category` SET `parent` = :parent, `name` = :name");
$sth->execute(array('parent' => 1, 'name' => 'Виноград'));

// Получаем id вставленной записи
$insert_id = $dbh->lastInsertId();
PHP
4
$sth = $dbh->prepare("UPDATE `category` SET `name` = :name WHERE `id` = :id");
$sth->execute(array('name' => 'Виноград', 'id' => 22));
PHP
5
$count = $dbh->exec("DELETE FROM `category` WHERE `parent` = 1");
echo 'Удалено ' . $count . ' строк.';
PHP

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

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

В 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);
PHP
Array
(
    [0] => 42S02
    [1] => 1146
    [2] => Table 'database.category_new' doesn't exist
)
11.11.2017, обновлено 27.08.2019
103022

Комментарии 1

О О
8 января 2023 в 00:10
Функция debugDumpParams объекта PDOStatement используется для вывода параметров подготовленного оператора. Это может быть полезно для отладки и устранения неполадок, поскольку позволяет увидеть точный SQL-запрос, который будет выполнен, а также значения любых установленных заполнителей.
Например, рассмотрим следующий код:
$sth = $dbh->prepare('SELECT * FROM users WHERE name = :name AND age = :age');
$sth->bindParam(':name', $name);
$sth->bindParam(':age', $age);
$name = 'John';
$age = 35;
$sth->debugDumpParams();

Этот код выведет следующее:
SQL: [114] SELECT * FROM users WHERE name = :name AND age = :age
Params: 2
Key: Name: [5] :name
paramno=-1
name=[5] ":name"
is_param=1
param_type=2
Key: Name: [4] :age
paramno=-1
name=[4] ":age"
is_param=1
param_type=2

Вывод показывает SQL-запрос с заполнителями и значениями заполнителей (в данном случае :name — «John», а :age — 35). Это может быть полезно для проверки того, что в запросе используются правильные значения, или для выявления проблем с запросом или заполнителями.
Надеюсь, это поможет! Дайте знать, если у вас появятся вопросы.

, чтобы добавить комментарий.

Другие публикации

Счетчик просмотров страниц с графиком
Для примера возьмем статейный сайт, на нём нужно сделать счетчик просмотров статей, с выводом результатов за день,...
19044
+23
Как вывести метки на Яндекс.Картах из MySQL+PHP
В статье рассмотрены примеры как вывести метку на карту из БД и вывод других объектов, которые находятся рядом.
21510
+11
Поиск похожих текстов в базе данных MySQL + PHP
Один из вариантов поиска похожих статей в базе данных основан на схождении слов в двух текстах.
7123
+7
Генерация случайных буквенно-цифровых кодов в PHP
Несколько примеров, как сгенерировать случайные последовательности численных и буквенных строк заданной длины и...
11407
+4
Постраничный вывод и базы данных
В SQL запросах, для ограничения количества строк в результате используется инструкция LIMIT, например следующий вернёт...
16906
0
Поиск телефона в базе данных MySQL
Такой вопрос часто возникает т.к. в базе данных телефон может хранится в ненормализованном виде да и сама строка поиска...
8552
+1