Junior
Šta su pripremljeni upiti?
sobes.tech АИ
Одговор од АИ
Ово је начин за повећање безбедности и перформанси при раду са базама података, када се шаблон 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) . " није пронађен.";
}
?>