Рассказываем, как работать с PostgreSQL в PHP и что такое модуль PDO.
Во время разработки приложений часто нужно подключать и использовать базы данных для хранения информации. Одна из самых распространенных — PostgreSQL. Расскажем, как работать в PHP именно с ней. Для этого мы будем использовать встроенный модуль PHP Data Objects (PDO) — унифицированный интерфейс для работы с базами данных.
Чтобы начать работу с PDO, необходимо поработать с PDO — драйвером конкретной базы данных. Мы будем использовать драйвер для работы с PostgreSQL.
Обычно дистрибутив PHP уже содержит драйвер для работы с PostgreSQL PDO_PGSQL
, поэтому настраивать PHP вручную не нужно. Если это не так, драйвер придется активировать вручную. Для этого откроем файл php.ini и отредактируем следующую строку:
;extension=php_pdo_pgsql.dll
Нужно раскомментировать строку. Для этого удалим точку с запятой (;) в начале строки и перезапустим веб-сервер.
extension=php_pdo_pgsql.dll
Пакетный менеджер 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: разбираем главные изменения
Создадим новую базу данных и назовем ее 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
Чтобы создать таблицу в базе данных PostgreSQL с помощью PHP 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();
}
Добавим данные в таблицу базы данных:
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 и освоить основные способы взаимодействия с базой данных.