Junior
Was sind vorbereitete Abfragen?
sobes.tech KI
Antwort von AI
Dies ist eine Methode zur Erhöhung der Sicherheit und Leistung bei der Arbeit mit Datenbanken, bei der die SQL-Abfragevorlage separat vom Server der Datenbank an den Server gesendet wird.
Vorteile:
- Schutz vor SQL-Injektionen: Die Daten werden vom Datenbankserver als Literale verarbeitet, nicht als Teil des SQL-Codes.
- Leistung: Der Datenbankserver cached den Ausführungsplan der Abfrage, was Zeit spart, wenn die gleiche Abfrage mit unterschiedlichen Parametern mehrfach ausgeführt wird.
- Bequemlichkeit: Ermöglicht die Strukturierung des Codes und erleichtert das Debuggen.
Schritte der Ausführung einer vorbereiteten Abfrage:
- Vorbereitung (Prepare): Die Abfragevorlage wird an den Datenbankserver gesendet, um Syntaxprüfung und Planerstellung durchzuführen. Die Vorlage verwendet Platzhalter, um die Stellen zu kennzeichnen, an denen Daten eingefügt werden.
- Bindung (Bind): Die Variablenwerte werden an die Platzhalter gebunden. Der Server interpretiert sie nicht als SQL-Code.
- Ausführung (Execute): Die Abfrage wird mit den gebundenen Werten ausgeführt.
Beispiel für die Verwendung einer vorbereiteten Abfrage in PHP mit PDO:
// Verbindung zur Datenbank (Beispiel)
$dsn = 'mysql:host=localhost;dbname=meinedatenbank';
$user = 'meinbenutzer';
$password = 'meinpasse';
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Verbindungsfehler: ' . $e->getMessage());
}
// Vorbereitung der Abfrage mit Platzhaltern
$stmt = $pdo->prepare("SELECT name, email FROM benutzer WHERE id = :id");
// Bindung des Wertes an den Platzhalter
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);
// Ausführung der Abfrage
$stmt->execute();
// Ergebnisabruf
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Benutzername: " . htmlspecialchars($user['name']) . "<br>";
echo "Benutzer-E-Mail: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Benutzer mit ID " . htmlspecialchars($userId) . " nicht gefunden.";
}
In diesem Beispiel ist :id ein benannter Platzhalter. Es können auch positionsbezogene Platzhalter (?) verwendet werden.
// Vorbereitung der Abfrage mit positionsbezogenem Platzhalter
$stmt = $pdo->prepare("SELECT name, email FROM benutzer WHERE id = ?");
// Ausführung der Abfrage mit einem Array von Werten für die Platzhalter
$userId = 2;
$stmt->execute([$userId]);
// Ergebnisabruf
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Benutzername: " . htmlspecialchars($user['name']) . "<br>";
echo "Benutzer-E-Mail: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Benutzer mit ID " . htmlspecialchars($userId) . " nicht gefunden.";
}
?>