Главная | Все статьи | Код

Как работать с базами данных в PHP с помощью модуля PDO

PHP Время чтения статьи ~8 минут
Как работать с базами данных в PHP с помощью модуля PDO главное изображение

Рассказываем, как работать с PostgreSQL в PHP и что такое модуль PDO.

Во время разработки приложений часто нужно подключать и использовать базы данных для хранения информации. Одна из самых распространенных — PostgreSQL. Расскажем, как работать в PHP именно с ней. Для этого мы будем использовать встроенный модуль PHP Data Objects (PDO) — унифицированный интерфейс для работы с базами данных.

Чтобы начать работу с PDO, необходимо поработать с PDO — драйвером конкретной базы данных. Мы будем использовать драйвер для работы с PostgreSQL.

Активация драйвера PDO_PGSQL

Обычно дистрибутив PHP уже содержит драйвер для работы с PostgreSQL PDO_PGSQL, поэтому настраивать PHP вручную не нужно. Если это не так, драйвер придется активировать вручную. Для этого откроем файл php.ini и отредактируем следующую строку:

;extension=php_pdo_pgsql.dll

Нужно раскомментировать строку. Для этого удалим точку с запятой (;) в начале строки и перезапустим веб-сервер.

extension=php_pdo_pgsql.dll

Создание структуры проекта PHP с помощью Composer

Пакетный менеджер Composer предназначен для управления зависимостями в PHP. Он позволяет подключать к проекту PHP библиотеки и автоматически управлять их обновлением.

С помощью Composer можно формировать структуру проектов. Создадим в каталоге webroot директорию postgresqlphpconnect для хранения файлов проекта. Затем создадим в директории postgresqlphpconnect подкаталог app и файл composer.json. Текст файла будет таким:

{
    "autoload": {
        "psr-4": {
            "PostgreSQLTutorial\\": "app/"
        }
    }
}

Каждый новый класс в каталоге app автоматически связывается с пространством имен PostgreSQLTutorial.

Перейдем в каталог postgresqlphpconnect в терминале и введем команду:

composer update

Composer должен создать файл автозагрузки, загрузить библиотеки, объявленные в файле composer.json, и разместить библиотеки сторонних разработчиков в директории vendor. В нашем примере библиотеки не объявлены, поэтому команда только создает файл автозагрузки.

Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

Создадим в каталоге postgresqlphpconnect файл index.php, а в каталоге app — файлы Connection.php и database.ini. Структура проекта выглядит следующим образом:

➜  postgresqlphpconnect tree
.
└── Source Files
    ├── app
    │   ├── Connection.php
    │   └── database.ini
    ├── composer.json
    ├── index.php
    └── vendor
        ├── autoload.php
        └── composer

4 directories, 5 files

Читайте также: Вышел PHP 8.2: разбираем главные изменения

Подключение к базе данных PostgreSQL

Создадим новую базу данных и назовем ее hexlet.

CREATE DATABASE hexlet;

В файле database.ini будут храниться параметры базы данных PostgreSQL:

host=localhost  
port=5432
database=labels
user=postgres
password=postgres

Создадим в файле Connection.php новый класс Connection.

<?php

namespace PostgreSQLTutorial;

/**
 * Создание класса Connection
 */
final class Connection
{
    /**
     * Connection
     * тип @var
     */
    private static ?Connection $conn = null;

    /**
     * Подключение к базе данных и возврат экземпляра объекта \PDO
     * @return \PDO
     * @throws \Exception
     */
    public function connect()
    {
        // чтение параметров в файле конфигурации ini
        $params = parse_ini_file('database.ini');
        if ($params === false) {
            throw new \Exception("Error reading database configuration file");
        }

        // подключение к базе данных postgresql
        $conStr = sprintf(
            "pgsql:host=%s;port=%d;dbname=%s;user=%s;password=%s",
            $params['host'],
            $params['port'],
            $params['database'],
            $params['user'],
            $params['password']
        );

        $pdo = new \PDO($conStr);
        $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

        return $pdo;
    }

    /**
     * возврат экземпляра объекта Connection
     * тип @return
     */
    public static function get()
    {
        if (null === static::$conn) {
            static::$conn = new self();
        }

        return static::$conn;
    }

    protected function __construct()
    {

    }
}

Connection — Singleton-класс. Для него можно создать только один экземпляр. Если экземпляр уже существует, класс возвращает его при попытке создания нового экземпляра.

Для подключения к базе данных PostgreSQL нужно создать экземпляр класса PDO. Используем метод connect(), чтобы получить из файла database.ini параметры конфигурации базы данных, сформировать строку подключения и передать ее конструктору PDO.

Добавим в файл index.php приведенный ниже код:

<?php

require 'vendor/autoload.php';

use PostgreSQLTutorial\Connection;

try {
    Connection::get()->connect();
    echo 'A connection to the PostgreSQL database sever has been established successfully.';
} catch (\PDOException $e) {
    echo $e->getMessage();
}

Если при подключении к серверу базы данных PostgreSQL возникает исключение, PHP возвращает \PDOException. Для решения этой проблемы нужно создать внутри блока try...catch новый объект PDO.

Выполним команду для обновления файлов автозагрузки:

composer dump-autoload -o
Generating optimized autoload files

Для проверки запустим в веб-браузере файл index.php. Чтобы это сделать, можно просто перетащить файл в окно браузера, либо открыть файл с помощью меню «Файл → Открыть».

A connection to the PostgreSQL database server has been established successfully.

Чтобы ознакомиться с возможным исключением, настроим для файла database.ini неправильные параметры. Мы увидим сообщение об ошибке.

Если неправильно введен пароль, то увидим это сообщение:

SQLSTATE[08006] [7] FATAL: password authentication failed for user "postgres"

Если база данных содержит недостоверные данные, то увидим это сообщение:

SQLSTATE[08006] [7] FATAL: database "hexlet" does not exist

Мы научились подключаться к базе данных PostgreSQL в приложении PHP с помощью PDO API. Далее продолжим использовать класс Connection.

Читайте также: Как настроить VS Code для удобной разработки на PHP

Создание таблиц с помощью PHP PDO

Чтобы создать таблицу в базе данных PostgreSQL с помощью PHP PDO, нужно:

  • Создать новый объект PDO для подключения к базе данных
  • Вызвать метод exec() объекта PDO и выполнить оператор CREATE TABLE

Пример создания таблицы

Мы уже создали базу данных hexlet на сервере баз данных PostgreSQL. В целях демонстрации добавим метки таблиц. Создадим в каталоге app класс PostgreSQLCreateTable.

<?php

namespace PostgreSQLTutorial;

/**
 * Создание в PostgreSQL таблицы из демонстрации PHP
 */
class PostgreSQLCreateTable
{
    /**
     * объект PDO
     * @var \PDO
     */
    private $pdo;

    /**
     * инициализация объекта с объектом \PDO
     * @тип параметра $pdo
     */
    public function __construct($pdo)
    {
        $this->pdo = $pdo;
    }

    /**
     * создание таблиц
     */
    public function createTables()
    {
        $sql = 'CREATE TABLE IF NOT EXISTS hexlet (
                   id serial PRIMARY KEY,
                   name character varying(255) NOT NULL UNIQUE
        );'

        $this->pdo->exec($sql);

        return $this;
    }
}

Конструктор класса принимает объект PDO в качестве аргумента. Метод createTables() создает в базе данных новые таблицы. Переменная $sql содержит запрос CREATE TABLE. Для выполнения запроса вызовем метод exec() объекта PDO. В файле index.php подключимся к базе данных PostgreSQL и выполним запрос для создания таблиц.

<?php

require 'vendor/autoload.php';

use PostgreSQLTutorial\Connection;
use PostgreSQLTutorial\PostgreSQLCreateTable;

try {
    // подключение к базе данных PostgreSQL
    $pdo = Connection::get()->connect();
    $tableCreator = new PostgreSQLCreateTable($pdo);

    // создание и запрос таблицы из
    // базы данных
    $tables = $tableCreator->createTables(); 
} catch (\PDOException $e) {
    echo $e->getMessage();
}

Добавление данных в таблицу PostgreSQL с помощью PDO

Добавим данные в таблицу базы данных:

  • Создадим новый экземпляр класса PDO для подключения к базе данных PostgreSQL
  • Объявим переменную $sql в которую поместим запрос INSERT. Для передачи параметров этому запросу можно присвоить заполнителям имена, например, :param.
  • Вызовем метод prepare() объекта PDO и подготовим запрос INSERT. Метод prepare() возвращает объект PDOStatement.
  • Вызовем метод bindValue() объекта PDOStatement и передадим значения запросу.
  • Вызовем метод execute() объекта PDOStatement и выполним запрос INSERT.
public function insertLabel($name)
{
    // подготовка запроса для добавления данных
    $sql = 'INSERT INTO labels(name) VALUES(:name)';
    $stmt = $this->pdo->prepare($sql);

    $stmt->bindValue(':name', $name);

    $stmt->execute();

    // возврат полученного значения id
    return $this->pdo->lastInsertId('labels_id_seq');
}

Обновление данных выполняется таким же образом, за исключением того, что принято в конце возвращать количество измененных строк. Это делается с помощью метода rowCount().

return $stmt->rowCount();

Вот и все — мы узнали, что такое PHP Data Objects, научились подключаться к базе данных, создавать таблицы, добавлять и модифицировать данные. Если вы хотите более подробно изучить PDO, почитайте документацию PHP.

Освойте модуль PDO: На Хекслете есть курс «PHP PDO: Работа с базой данных». Пройдите его, чтобы научиться работать с PDO и освоить основные способы взаимодействия с базой данных.

Освоить PDO

Аватар пользователя Алексей Покровский
Алексей Покровский 22 декабря 2022
10
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 25 апреля
профессия
от 6 183 ₽ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 25 апреля
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 25 апреля
профессия
от 5 840 ₽ в месяц
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 25 апреля
профессия
от 9 900 ₽ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 25 апреля
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
в разработке
Старт 25 апреля
профессия
Верстка с использованием последних стандартов CSS
5 месяцев
с нуля
Старт в любое время