Sobes.tech
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:

  1. 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.
  2. Bindung (Bind): Die Variablenwerte werden an die Platzhalter gebunden. Der Server interpretiert sie nicht als SQL-Code.
  3. 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.";
}
?>