Prepared Statements und Stored Procedures
Viele der ausgereifteren Datenbanken unterstützen das Konzept der Prepared Statements. Was ist das? Man kann sie sich als eine Art von kompiliertem Template für SQL das eine Anwendung ausführen will vorstellen, das durch variable Parameter angepasst werden kann. Prepared Statements haben zwei wichtige Vorteile:
- Die Abfrage muss nur einmal geparst (oder vorbereitet) werden, kann dann aber mehrere Male mit denselben oder anderen Parametern ausgeführt werden. Wenn die Abfrage vorbereitet wird, kann die Datenbank ihre Vorgehensweise zur Ausführung der Abfrage analysieren, kompilieren und optimieren. Für komplexe Abfragen kann dieser Vorgang genug Zeit benötigen, dass es eine Anwendung merklich verlangsamt, wenn dieselbe Abfrage oft mit verschiedenen Parametern wiederholt wird. Mit einem Prepared Statement vermeidet die Anwendung den Zyklus der Analyse/Kompilierung/Optimierung. Kurz gesagt benötigen Prepared Statements weniger Ressourcen und laufen deswegen schneller.
- Die Parameter für Prepared Statements müssen nicht maskiert werden. Der Treiber übernimmt das automatisch. Wenn eine Anwendung ausschließlich Prepared Statements benutzt, kann sich der Entwickler sicher sein, dass keine SQL-Injection auftreten wird. (Wenn aber trotzdem andere Teile der Abfrage aus nicht zuverlässigen Eingaben generiert werden, ist dies immer noch möglich.)
Prepared Statements sind so nützlich, dass sie das einzige Feature sind, das PDO auch für Treiber emulieren wird, die diese nicht unterstützen. Das garantiert, dass eine Anwendung unabhängig von den Möglichkeiten der Datenbank dieselbe Art des Datenzugriffs nutzen können.
Beispiel #1 Wiederholte Inserts mit Prepared Statements
Dieses Beispiel führt eine INSERT-Abfrage durch, in der ein name und ein value für die benannten Platzhalter eingesetzt werden.
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// eine Zeile einfügen
$name = 'one';
$value = 1;
$stmt->execute();
// eine weitere Zeile mit anderen Werten einfügen
$name = 'two';
$value = 2;
$stmt->execute();
?>
Beispiel #2 Wiederholte Inserts mit Prepared Statements
Dieses Beispiel führt eine INSERT-Abfrage durch, in der ein name und ein value für die positionsabhängigen ?-Platzhalter eingesetzt werden.
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// eine Zeile einfügen
$name = 'one';
$value = 1;
$stmt->execute();
// eine weitere Zeile mit anderen Werten einfügen
$name = 'two';
$value = 2;
$stmt->execute();
?>
Beispiel #3 Abfragen von Daten mit Prepared Statements
Dieses Beispiel ruft Daten basierend auf einem Schlüsselwert ab, der von einem Formular geliefert wird. Die Benutzereingabe wird automatisch maskiert, deswegen gibt es kein Risiko eines SQL-Injection-Angriffs.
<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($_GET['name']))) {
while ($row = $stmt->fetch()) {
print_r($row);
}
}
?>
Beispiel #4 Eine Stored Procedure mit einem Ausgabeparameter aufrufen
Wenn es der Datenbanktreiber unterstützt, kann eine Anwendung auch Parameter für die Ausgabe einführen, ähnlich der Eingabe. Ausgabeparameter werden typischerweise benutzt, um Werte von Stored Procedures abzurufen. Ausgabeparameter sind etwas komplexer in der Verwendung als Eingabeparameter, weil die Entwickler wissen muss, wie groß ein gegebener Parameter sein könnte, wenn sie ihn einführen. Wenn der Wert sich als größer herausstellt als die vorgeschlagene Größe, wird eine Fehlermeldung erzeugt.
<?php
$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);
// Aufruf der Stored Procedure
$stmt->execute();
print "Rückgabewert der Stored Procedure: $return_value\n";
?>
Beispiel #5 Eine Stored Procedure mit einem Eingabe-/Ausgabe-Parameter aufrufen
Entwickler können auch Parameter angeben, die Werte für Eingabe und Ausgabe enthalten. Die Syntax ist ähnlich den Ausgabeparametern. In diesem nächsten Beispiel wird die Zeichenkette 'hallo' der Stored Procedure übergeben. Wenn diese etwas zurückgibt, wird 'hallo' durch den Rückgabewert der Stored Procedure ersetzt.
<?php
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hallo';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
// Aufruf der Stored Procedure
$stmt->execute();
print "Rückgabewert der Stored Procedure: $value\n";
?>
Beispiel #6 Ungültige Verwendung von Platzhaltern
<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
$stmt->execute(array($_GET['name']));
// Platzhalter müssen anstelle des ganzen Wertes verwendet werden
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?");
$stmt->execute(array("%$_GET[name]%"));
?>
Deutsche Übersetzung
Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.
Vielen Dank im Voraus.
Dokument erstellt 30/01/2003, zuletzt geändert 26/10/2018
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/php-rf-pdo.prepared-statements.html
Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.
Referenzen
Diese Verweise und Links verweisen auf Dokumente, die während des Schreibens dieser Seite konsultiert wurden, oder die zusätzliche Informationen liefern können, aber die Autoren dieser Quellen können nicht für den Inhalt dieser Seite verantwortlich gemacht werden.
Der Autor Diese Website ist allein dafür verantwortlich, wie die verschiedenen Konzepte und Freiheiten, die mit den Nachschlagewerken gemacht werden, hier dargestellt werden. Denken Sie daran, dass Sie mehrere Quellinformationen austauschen müssen, um das Risiko von Fehlern zu reduzieren.