Параметризованные запросы в PHP для безопасной работы с базами данных



Что такое параметризованные запросы? Параметризованные запросы позволяют разделить код SQL-запроса и данные, которые передаются в базу. Это обеспечивает защиту от SQL-инъекций, так как данные, введенные пользователем, обрабатываются как текст, а не как часть SQL-кода.



1️⃣ Как это работает? Параметризованные запросы используют подготовленные выражения (prepared statements). Они выполняются в два этапа:



1. Запрос отправляется в базу данных для компиляции.

2. Переменные передаются и вставляются в компилированный запрос.



2️⃣ Пример использования с MySQLi



<?php

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

$mysqli = new mysqli("localhost", "username", "password", "database");



// Проверка подключения

if ($mysqli->connect_error) {

die("Ошибка подключения: " . $mysqli->connect_error);

}



// Подготовка запроса

$stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ?");

if (!$stmt) {

die("Ошибка подготовки запроса: " . $mysqli->error);

}



// Привязка параметров (здесь 's' обозначает строковый тип данных)

$email = "[email protected]";

$stmt->bind_param("s", $email);



// Выполнение запроса

$stmt->execute();



// Получение результата

$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {

echo "User: " . $row["name"] . " - Email: " . $row["email"] . "<br>";

}



// Закрытие запроса и соединения

$stmt->close();

$mysqli->close();

?>




3️⃣ Пример использования с PDO



<?php

try {

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

$pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);



// Подготовка запроса

$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");



// Привязка параметров

$stmt->bindParam(':email', $email);



// Передача значения переменной

$email = "[email protected]";



// Выполнение запроса

$stmt->execute();



// Получение результата

$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($users as $user) {

echo "User: " . $user["name"] . " - Email: " . $user["email"] . "<br>";

}

} catch (PDOException $e) {

echo "Ошибка: " . $e->getMessage();

}

?>




4️⃣ Преимущества параметризованных запросов



🔹Безопасность: защита от SQL-инъекций.

🔹Эффективность: запрос компилируется только один раз, независимо от количества выполняемых операций.

🔹Читаемость и структура: разделение SQL-кода и переменных делает код более понятным.



👉 @PHPgx | #заметки