PHP

Безопасные запросы к БД через PDO

Algonexys · 07.08.2026 · 👁 0

Подготовленные выражения против SQL-инъекций, транзакции и корректная настройка соединения.

Код

<?php
declare(strict_types=1);

function db(): PDO
{
    static $pdo = null;
    if ($pdo === null) {
        $pdo = new PDO(
            'mysql:host=localhost;dbname=digitmind;charset=utf8mb4',
            getenv('DB_USER'),
            getenv('DB_PASSWORD'),
            [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => false,  // настоящие prepared statements
            ]
        );
    }
    return $pdo;
}

// Выборка с параметрами — значения никогда не склеиваются со строкой запроса
$stmt = db()->prepare(
    'SELECT id, username, email FROM users WHERE status = :status AND created_at > :since'
);
$stmt->execute(['status' => 'active', 'since' => '2026-01-01']);
$users = $stmt->fetchAll();

// Транзакция
try {
    db()->beginTransaction();
    db()->prepare('UPDATE accounts SET balance = balance - ? WHERE id = ?')
        ->execute([100, 1]);
    db()->prepare('UPDATE accounts SET balance = balance + ? WHERE id = ?')
        ->execute([100, 2]);
    db()->commit();
} catch (Throwable $e) {
    db()->rollBack();
    error_log('Перевод не выполнен: ' . $e->getMessage());
    throw $e;
}