Sobes.tech
Junior

Какви са подготвените заявки?

sobes.tech AI

Отговор от AI

Това е начин за повишаване на сигурността и производителността при работа с бази данни, когато шаблонът на SQL заявката се изпраща на сървъра на базата данни отделно от самите данни.

Предимства:

  • Защита срещу SQL инжекции: Данните се обработват от сървъра на базата данни като литерали, а не като част от SQL кода.
  • Производителност: Сървърът на базата данни кешира плана за изпълнение на заявката, което спестява време при многократно изпълнение на една и съща заявка с различни параметри.
  • Удобство: Позволяват структуриране на кода и улесняват отстраняването на грешки.

Етапи на изпълнение на подготвена заявка:

  1. Подготовка (Prepare): Шаблонът на заявката се изпраща на сървъра за анализ, проверка на синтаксиса и създаване на план за изпълнение. В шаблона се използват заместители за обозначаване на местата, където ще се поставят данните.
  2. Обвързване (Bind): Стойностите на променливите се свързват със заместителите. Сървърът не ги интерпретира като SQL код.
  3. Изпълнение (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) . " не е намерен.";
}
?>