Neueste Web-Entwicklung Tutorials
 

PHP Prepared Statements


Vorbereitete Anweisungen sind sehr nützlich gegen SQL-Injektionen.


Prepared Statements und gebundene Parameter

Eine vorbereitete Anweisung ist eine Funktion verwendet , um die gleichen auszuführen (or similar) SQL - Anweisungen wiederholt mit hohen Effizienz.

Vorbereitete Anweisungen funktionieren im Grunde wie folgt aus:

  1. Vorbereiten: Eine SQL-Anweisung Vorlage wird erstellt und an die Datenbank gesendet. Bestimmte Werte werden nicht spezifiziert, die so genannten Parameter (labeled "?") . Beispiel: INSERT INTO MyGuests VALUES(?, ?, ?)
  2. Die Datenbank analysiert, kompiliert und führt die Abfrageoptimierung auf der SQL-Anweisung Vorlage und speichert das Ergebnis, ohne diese auszuführen
  3. Execute: Zu einem späteren Zeitpunkt, bindet die Anwendung die Werte für die Parameter und die Datenbank führt die Anweisung. Die Anwendung kann die Aussage so oft ausführen, wie es mit unterschiedlichen Werten will

direkt, Prepared Statements haben zwei wesentliche Vorteile im Vergleich zu SQL-Anweisungen ausführen:

  • Vorbereitete Anweisungen reduziert Parsing Zeit als die Vorbereitung auf die Abfrage nur einmal durchgeführt wird (although the statement is executed multiple times) wird (although the statement is executed multiple times)
  • Bound Parameter Bandbreite an den Server minimieren, da Sie nur die Parameter jedes Mal senden müssen, und nicht die ganze Abfrage
  • Vorbereitete Anweisungen sind sehr nützlich gegen SQL-Injektionen, weil die Parameterwerte, die später übertragen werden, ein anderes Protokoll verwenden, müssen nicht korrekt entwertet werden. Wenn die ursprüngliche Anweisung Vorlage nicht von einem externen Eingang abgeleitet wird, kann SQL-Injection nicht auftreten.

Prepared Statements in MySQLi

Das folgende Beispiel verwendet Prepared Statements und gebundene Parameter in MySQLi:

Beispiel (MySQLi with Prepared Statements)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();

echo "New records created successfully";

$stmt->close();
$conn->close();
?>

Codezeilen oben aus dem Beispiel zu erklären:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"

In unserem SQL, legen wir ein Fragezeichen (?) , Wo wir in einer ganzen Zahl, String, Doppel- oder Blob - Wert ersetzen wollen.

Dann haben Sie einen Blick auf die bind_param() Funktion:

$stmt->bind_param("sss", $firstname, $lastname, $email);

Diese Funktion bindet die Parameter an die SQL-Abfrage und erzählt die Datenbank, was die Parameter sind. Das "sss" Argument führt die Arten von Daten , die die Parameter. Der Charakter sagt mysql, dass der Parameter eine Zeichenfolge ist.

Das Argument kann eine von vier Typen:

  • i - integer
  • d - Doppel
  • s - String
  • b - BLOB

Wir müssen für jeden Parameter eine davon haben.

Indem ich mysql, welche Art von Daten zu erwarten sind, minimieren wir das Risiko von SQL-Injektionen.

Hinweis: Wenn wir alle Daten aus externen Quellen eingefügt werden sollen (like user input) , ist es sehr wichtig , dass die Daten bereinigt und validiert.


Prepared Statements in PDO

Das folgende Beispiel verwendet Prepared Statements und gebundene Parameter in PDO:

Beispiel (PDO with Prepared Statements)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // prepare sql and bind parameters
    $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
    VALUES (:firstname, :lastname, :email)");
    $stmt->bindParam(':firstname', $firstname);
    $stmt->bindParam(':lastname', $lastname);
    $stmt->bindParam(':email', $email);

    // insert a row
    $firstname = "John";
    $lastname = "Doe";
    $email = "[email protected]";
    $stmt->execute();

    // insert another row
    $firstname = "Mary";
    $lastname = "Moe";
    $email = "[email protected]";
    $stmt->execute();

    // insert another row
    $firstname = "Julie";
    $lastname = "Dooley";
    $email = "[email protected]";
    $stmt->execute();

    echo "New records created successfully";
    }
catch(PDOException $e)
    {
    echo "Error: " . $e->getMessage();
    }
$conn = null;
?>