PHP
Безопасные запросы к БД через PDO
Подготовленные выражения против 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;
}