Junior
Какви са подготвените заявки?
sobes.tech AI
Отговор от AI
Това е начин за повишаване на сигурността и производителността при работа с бази данни, когато шаблонът на SQL заявката се изпраща на сървъра на базата данни отделно от самите данни.
Предимства:
- Защита срещу SQL инжекции: Данните се обработват от сървъра на базата данни като литерали, а не като част от SQL кода.
- Производителност: Сървърът на базата данни кешира плана за изпълнение на заявката, което спестява време при многократно изпълнение на една и съща заявка с различни параметри.
- Удобство: Позволяват структуриране на кода и улесняват отстраняването на грешки.
Етапи на изпълнение на подготвена заявка:
- Подготовка (Prepare): Шаблонът на заявката се изпраща на сървъра за анализ, проверка на синтаксиса и създаване на план за изпълнение. В шаблона се използват заместители за обозначаване на местата, където ще се поставят данните.
- Обвързване (Bind): Стойностите на променливите се свързват със заместителите. Сървърът не ги интерпретира като SQL код.
- Изпълнение (Execute): Заявката се изпълнява с обвързаните стойности.
Пример за използване на подготвена заявка в PHP с PDO:
// Свързване към базата данни (пример)
$dsn = 'mysql:host=localhost;dbname=mydatabase';
$потребител = 'myuser';
$парола = 'mypassword';
try {
$pdo = new PDO($dsn, $потребител, $парола);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Грешка при свързването: ' . $e->getMessage());
}
// Подготовка на заявка с заместители
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE id = :id");
// Обвързване на стойност към заместителя
$потребителId = 1;
$stmt->bindParam(':id', $потребителId, PDO::PARAM_INT);
// Изпълнение на заявката
$stmt->execute();
// Получаване на резултатите
$потребител = $stmt->fetch(PDO::FETCH_ASSOC);
if ($потребител) {
echo "Име на потребителя: " . htmlspecialchars($потребител['name']) . "<br>";
echo "Имейл на потребителя: " . htmlspecialchars($потребител['email']) . "<br>";
} else {
echo "Потребител с ID " . htmlspecialchars($потребителId) . " не е намерен.";
}
В този пример :id е именован заместител. Може да се използват и позиционни заместители (?).
// Подготовка на заявка с позиционен заместител
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE id = ?");
// Изпълнение на заявката с масив от стойности за заместителите
$потребителId = 2;
$stmt->execute([$потребителId]);
// Получаване на резултатите
$потребител = $stmt->fetch(PDO::FETCH_ASSOC);
if ($потребител) {
echo "Име на потребителя: " . htmlspecialchars($потребител['name']) . "<br>";
echo "Имейл на потребителя: " . htmlspecialchars($потребител['email']) . "<br>";
} else {
echo "Потребител с ID " . htmlspecialchars($потребителId) . " не е намерен.";
}
?>