PHP MySQL vorbereitete Anweisungen
Vorbereitete Anweisungen zu verhindern MySQL Injektion sehr nützlich ist.
Vorbereitete Anweisungen und gebundene Parameter
Vorbereitete Anweisungen für eine Vielzahl von derselben SQL-Anweisung ausgeführt wird, und effizienter auszuführen.
Werke von Prepared Statements wie folgt:
Vorbehandlung: Erstellen Sie eine Vorlage SQL-Anweisung an die Datenbank gesendet. Der Wert des Parameters reserviert "?" Mark. Zum Beispiel:
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
Datenbankanalyse, Kompilieren von SQL-Anweisungen Vorlage Abfrageoptimierung ausführen, und speichert das Ergebnis nicht ausgegeben wird.
Ausführung: Schließlich werden die Werte der Parameter an die Anwendung übergeben Bindung (Markierung "?"), Datenbank führt die Anweisungen. Anwendungen können viele Male ausgeführt werden, wenn der Parameterwert nicht gleich ist.
Im Vergleich zur direkten Ausführung von SQL-Anweisungen, vorbereitete Anweisung hat zwei wesentliche Vorteile:
Vorbereitete Anweisungen drastisch reduziert Analysezeit, nur eine Abfrage (obwohl die Anweisungen ausgeführt werden).
Bound Parameter die Bandbreite des Servers zu reduzieren, müssen Sie nur eine Parameterabfrage statt der gesamten Aussage zu senden.
Prepared Statements gegen SQL-Injection ist sehr nützlich, da nach verschiedenen Protokollen verwenden Parameterwerte zu senden, um die Legitimität der Daten zu gewährleisten.
MySQLi vorbereitete Anweisungen
Das folgende Beispiel verwendet die MySQLi in einer vorbereiteten Erklärung, und binden die entsprechenden Parameter:
Beispiele (MySQLi mit Prepared Statements)
$ Servername = "localhost";
$ Username = "username";
$ Password = "Passwort";
$ DBNAME = "myDB";
// Verbindung erstellen
$ Conn = new mysqli ($ Servername, $ username, $ password, $ dbname);
// Test-Verbindung
if ($ conn-> connect_error) {
die ( "Verbindung fehlgeschlagen:" $ conn-> connect_error.);
}
// Vorbehandlung und Bindung
$ Stmt = $ conn-> prepare ( "IN MyGuests INSERT (Vorname, Nachname, E-Mail) VALUES (,,) ???");
$ Stmt-> bind_param ( "sss", $ Vorname, Nachname $, $ email);
// Parameter einstellen und ausführen
$ Vorname = "John";
$ Nachname = "Doe";
$ E-Mail = "[email protected]";
$ Stmt-> execute ();
$ Vorname = "Mary";
$ Nachname = "Moe";
$ E-Mail = "[email protected]";
$ Stmt-> execute ();
$ Vorname = "Julie";
$ Nachname = "Dooley";
$ E-Mail = "[email protected]";
$ Stmt-> execute ();
echo "Der neue Datensatz wird erfolgreich eingeführt";
$ Stmt-> close ();
$ Conn-> close ();
?>
Parsing jede Codezeile in den folgenden Beispielen:
In SQL-Anweisungen verwenden wir das Fragezeichen (?), Hier können wir die Fragezeichen integer, string, double-precision floating-point und Boolesche Werte ersetzen.
Als nächstes wollen wir uns bei bind_param aussehen () Funktion:
Die Funktion bind SQL-Parameter, und sagen Sie den Wert des Datenbankparameter. "SSS" -Spalte Verarbeitungsparameter-Datentypen für die übrigen Parameter. s Charakter erzählt die Datenbank, die die Parameter-String.
Es gibt vier Arten von Parametern:
- i - integer (ganze Zahl)
- d - double (double precision floating point)
- s - string (string)
- b - BLOB (Binary Large Object: binary large objects)
Jeder Parameter wird benötigt, um die Art zu spezifizieren.
Der Datentyp Parameter teilt die Datenbank, können Sie das Risiko von SQL-Injection zu reduzieren.
Hinweis: Wenn Sie zusätzliche Daten (Benutzereingabe) eingefügt werden soll, die Überprüfung der Daten ist sehr wichtig. |
PDO Prepared Statements in
Die folgenden Beispiele verwenden wir vorbereitete Anweisungen in PDO und verbindliche Parameter:
Beispiele (PDO Prepared Statements)
$ Servername = "localhost";
$ Username = "username";
$ Password = "Passwort";
$ DBNAME = "myDBPDO";
try {
$ Conn = new PDO ( "mysql: host = $ servername; dbname = $ dbname", $ username, $ password);
// Stellen Sie den PDO Fehlermodus Ausnahme
$ Conn-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);
// Vorbehandlung und SQL-Bind Parameter
$ Stmt = $ conn-> prepare ( "INSERT INTO MyGuests (Vorname, Nachname, E-Mail)
VALUES (: Vorname Nachname ,: ,: E-Mail) ");
$ Stmt-> bindParam ( ': Vorname', $ Vorname);
$ Stmt-> bindParam ( ': Nachname', $ name);
$ Stmt-> bindParam ( ': E-Mail', $ E-Mail);
// Zeile einfügen
$ Vorname = "John";
$ Nachname = "Doe";
$ E-Mail = "[email protected]";
$ Stmt-> execute ();
// Eine weitere Zeile einfügen
$ Vorname = "Mary";
$ Nachname = "Moe";
$ E-Mail = "[email protected]";
$ Stmt-> execute ();
// Eine weitere Zeile einfügen
$ Vorname = "Julie";
$ Nachname = "Dooley";
$ E-Mail = "[email protected]";
$ Stmt-> execute ();
echo "Der neue Datensatz wird erfolgreich eingeführt";
}
catch (PDOException $ e)
{
.. Echo $ sql "<br>" $ e-> getMessage ();
}
$ Conn = null;
?>