Sobes.tech
Junior

Šta su pripremljeni upiti?

sobes.tech АИ

Одговор од АИ

Ово је начин за повећање безбедности и перформанси при раду са базама података, када се шаблон 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) . " није пронађен.";
}
?>