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

Ниже приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и удаление данных.
Для примеров используется таблица `category` с полями `id`, `name` и `parent`.

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

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

Четвертым параметром конструктора PDO можно указать параметры подключения, например SQL запрос который будет выполнен сразу после подключения:
  1. $dbh = new PDO('
  2. mysql:dbname=db_name;host=localhost',
  3. 'логин',
  4. 'пароль',
  5. array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")
  6. );

Чтобы отследить ошибку подключения к БД используется исключение:
  1. try {
  2. $dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
  3. } catch (PDOException $e) {
  4. die($e->getMessage());
  5. }

  1. SQLSTATE[HY000] [1045] Access denied for user 'логин'@'localhost' (using password: YES)

Выборка из БД
PDO позволяет использовать в запросах псевдопеременные чтобы исключить SQL инъекции. В самом запросе в место данных указывается ? или :id, а в методе execute() указываются реальные значения этих переменных.
  1. $sth = $dbh->prepare("SELECT * FROM `category` WHERE `id` = ?");
  2. $sth->execute(array('21'));
  3. $array = $sth->fetch(PDO::FETCH_ASSOC);
  4. print_r($array);

или
  1. $sth = $dbh->prepare("SELECT * FROM `category` WHERE `id` = :id");
  2. $sth->execute(array('id' => '21'));
  3. $array = $sth->fetch(PDO::FETCH_ASSOC);
  4. print_r($array);

  1. (
  2. [id] => 21
  3. [parent] => 3
  4. [name] => Хурма
  5. )

Данный пример получает всю таблицу в виде ассоциативного массива:

  1. $sth = $dbh->prepare("SELECT * FROM `category` ORDER BY `name`");
  2. $sth->execute();
  3. $array = $sth->fetchAll(PDO::FETCH_ASSOC);
  4. print_r($array);

  1. (
  2. [0] => Array (
  3. [id] => 16
  4. [parent] => 3
  5. [name] => Абрикос
  6. )
  7. [1] => Array (
  8. [id] => 28
  9. [parent] => 3
  10. [name] => Авокадо
  11. )
  12. ...
  13. )

Получить значение поля одной записи
  1. $sth = $dbh->prepare("SELECT `name` FROM `category` WHERE `id` = ?");
  2. $sth->execute(array('21'));
  3. $value = $sth->fetch(PDO::FETCH_COLUMN);
  4. echo $value; // Выведет "Хурма"

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

  1. $sth = $dbh->prepare("SELECT `name` FROM `category`");
  2. $sth->execute();
  3. $array = $sth->fetchAll(PDO::FETCH_COLUMN);
  4. print_r($array);

  1. (
  2. [0] => Мороженое
  3. [1] => Овощи
  4. [2] => Фрукты
  5. [3] => Ягоды
  6. [4] => Грибы
  7. [5] => Морепродукты
  8. [6] => Смеси
  9. ...
  10. )

Получение структуры таблицы
  1. $sth = $dbh->prepare("SHOW COLUMNS FROM `category`");
  2. $sth->execute();
  3. $array = $sth->fetchAll(PDO::FETCH_ASSOC);
  4. print_r($array);

  1. (
  2. [0] => Array
  3. (
  4. [Field] => id
  5. [Type] => int(10) unsigned
  6. [Null] => NO
  7. [Key] => PRI
  8. [Default] =>
  9. [Extra] => auto_increment
  10. )
  11. [1] => Array
  12. (
  13. [Field] => parent
  14. [Type] => int(11) unsigned
  15. [Null] => NO
  16. [Key] =>
  17. [Default] => 0
  18. [Extra] =>
  19. )
  20. [2] => Array
  21. (
  22. [Field] => name
  23. [Type] => varchar(255)
  24. [Null] => NO
  25. [Key] =>
  26. [Default] =>
  27. [Extra] =>
  28. )
  29. )

Добавление записей в БД
  1. $sth = $dbh->prepare("INSERT INTO `category` SET `parent` = :parent, `name` = :name");
  2. $sth->execute(array('parent' => 1, 'name' => 'Виноград'));
  3.  
  4. // Получаем id вставленной записи
  5. $insert_id = $dbh->lastInsertId();

Изменение записей
  1. $sth = $dbh->prepare("UPDATE `category` SET `name` = :name WHERE `id` = :id");
  2. $sth->execute(array('name' => 'Виноград', 'id' => 22));

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

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

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

Обработка ошибок
  1. // Таблицы `category_new` нет в БД.
  2. $sth = $dbh->prepare("INSERT INTO `category_new` SET `parent` = :parent, `name` = :name");
  3. $sth->execute(array('parent' => 1, 'name' => 'Виноград'));
  4.  
  5. $info = $sth->errorInfo();
  6. print_r($info);

  1. (
  2. [0] => 42S02
  3. [1] => 1146
  4. [2] => Table 'database.category_new' doesn't exist
  5. )


  27.01.24 / 15:29 | MySQL |   88 | 3   0