Junior
Mi azok a prepared kérdések?
sobes.tech MI
Válasz az MI-től
Ez egy módszer a biztonság és a teljesítmény növelésére az adatbázisokkal való munkában, amikor az SQL-lekérdezés sablonját külön küldik az adatbázis szervernek az adatoktól.
Előnyök:
- Védelem az SQL-injekciók ellen: Az adatok a adatbázis szerver által literálként kerülnek feldolgozásra, nem pedig az SQL-kód részeként.
- Teljesítmény: Az adatbázis szerver cache-eli a lekérdezés végrehajtási tervét, így időt takarít meg ugyanazon lekérdezés többszöri végrehajtásakor különböző paraméterekkel.
- Kényelem: Lehetővé teszik a kód strukturálását és megkönnyítik a hibakeresést.
A készített lekérdezés végrehajtási lépései:
- Előkészítés (Prepare): A lekérdezés sablonját elküldik az adatbázis szervernek elemzésre, szintaxis ellenőrzésre és végrehajtási terv készítésére. A sablon helykitöltőket használ, hogy jelezze, hova kerülnek az adatok.
- Kötés (Bind): A változók értékeit a helykitöltőkhöz kötjük. A szerver nem értelmezi őket SQL-kódként.
- Végrehajtás (Execute): A lekérdezést a kötött értékekkel hajtják végre.
Példa a PDO-val PHP-ben készített előkészített lekérdezésre:
// Kapcsolódás az adatbázishoz (példa)
$dsn = 'mysql:host=localhost;dbname=adatbazisom';
$user = 'felhasznalo';
$password = 'jelszo';
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Kapcsolódási hiba: ' . $e->getMessage());
}
// Előkészítés helykitöltőkkel
$stmt = $pdo->prepare("SELECT nev, email FROM felhasznalok WHERE id = :id");
// Érték kötése a helykitöltőhöz
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);
// Lekérdezés végrehajtása
$stmt->execute();
// Eredmények lekérése
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Felhasználó neve: " . htmlspecialchars($user['nev']) . "<br>";
echo "Felhasználó email címe: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Nem található felhasználó ID-vel " . htmlspecialchars($userId) . ".";
}
Ebben a példában a :id egy névvel ellátott helykitöltő. A kérdőjelet (?) tartalmazó helykitöltőket is lehet használni.
// Pozíció alapú helykitöltővel készített lekérdezés
$stmt = $pdo->prepare("SELECT nev, email FROM felhasznalok WHERE id = ?");
// A lekérdezés végrehajtása értékek tömbjével
$userId = 2;
$stmt->execute([$userId]);
// Eredmények lekérése
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Felhasználó neve: " . htmlspecialchars($user['nev']) . "<br>";
echo "Felhasználó email címe: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Nem található felhasználó ID-vel " . htmlspecialchars($userId) . ".";
}
?>