PHP -Tutorial

PHP-HOME PHP-Einführung PHP-Installation PHP-Syntax PHP-Kommentare PHP-Variablen PHP-Echo / Drucken PHP-Datentypen PHP-Strings PHP-Nummern PHP-Mathematik PHP-Konstanten PHP-Operatoren PHP If...Else...Elseif PHP-Schalter PHP-Schleifen PHP-Funktionen PHP-Arrays PHP-Superglobals PHP-RegEx

PHP -Formulare

Handhabung von PHP-Formularen PHP-Formularvalidierung PHP-Formular erforderlich PHP-Formular-URL/E-Mail PHP-Formular vollständig

PHP- Erweitert

PHP-Datum und -Zeit PHP einschließen Umgang mit PHP-Dateien PHP-Datei öffnen/lesen PHP-Datei erstellen/schreiben Hochladen von PHP-Dateien PHP-Cookies PHP-Sitzungen PHP-Filter PHP-Filter für Fortgeschrittene PHP-Callback-Funktionen PHP-JSON PHP-Ausnahmen

PHP -OOP

PHP Was ist OOP PHP-Klassen/Objekte PHP-Konstruktor PHP-Destruktor PHP-Zugriffsmodifikatoren PHP-Vererbung PHP-Konstanten Abstrakte PHP-Klassen PHP-Schnittstellen PHP-Eigenschaften Statische PHP-Methoden Statische PHP-Eigenschaften PHP-Namespaces PHP-Iterables

MySQL- Datenbank

MySQL-Datenbank MySQL Connect MySQL-DB erstellen MySQL-Tabelle erstellen MySQL-Daten einfügen MySQL Letzte ID abrufen MySQL Mehrfach einfügen MySQL vorbereitet MySQL Select-Daten MySQL-Wo MySQL-Reihenfolge nach MySQL-Daten löschen MySQL-Update-Daten MySQL-Limit-Daten

PHP- XML

PHP-XML-Parser PHP-SimpleXML-Parser PHP SimpleXML - Get PHP-XML-Expat PHP-XML-DOM

PHP -AJAX

AJAX-Einführung AJAX-PHP AJAX-Datenbank AJAX-XML AJAX Live-Suche AJAX-Umfrage

PHP- Beispiele

PHP-Beispiele PHP-Compiler PHP-Quiz PHP-Übungen PHP-Zertifikat

PHP- Referenz

PHP-Übersicht PHP-Array PHP-Kalender PHP-Datum PHP-Verzeichnis PHP-Fehler PHP-Ausnahme PHP-Dateisystem PHP-Filter PHP-FTP PHP-JSON PHP-Schlüsselwörter PHP-Libxml PHP-Mail PHP-Mathematik PHP-Sonstiges PHP MySQLi PHP-Netzwerk PHP-Ausgabesteuerung PHP-RegEx PHP-SimpleXML PHP-Stream PHP-String Umgang mit PHP-Variablen PHP-XML-Parser PHP-Zip PHP-Zeitzonen

PHP MySQL vorbereitete Anweisungen


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


Vorbereitete Anweisungen und gebundene Parameter

Eine vorbereitete Anweisung ist eine Funktion, die verwendet wird, um dieselben (oder ähnliche) SQL-Anweisungen wiederholt mit hoher Effizienz auszuführen.

Vorbereitete Anweisungen funktionieren im Wesentlichen wie folgt:

  1. Vorbereiten: Eine SQL-Anweisungsvorlage wird erstellt und an die Datenbank gesendet. Bestimmte Werte bleiben unspezifiziert und werden Parameter genannt (mit „?“ gekennzeichnet). Beispiel: INSERT INTO MyGuests VALUES(?, ?, ?)
  2. Die Datenbank analysiert, kompiliert und führt eine Abfrageoptimierung für die SQL-Anweisungsvorlage durch und speichert das Ergebnis, ohne es auszuführen
  3. Ausführen: Zu einem späteren Zeitpunkt bindet die Anwendung die Werte an die Parameter und die Datenbank führt die Anweisung aus. Die Anwendung kann die Anweisung beliebig oft mit unterschiedlichen Werten ausführen

Im Vergleich zur direkten Ausführung von SQL-Anweisungen haben vorbereitete Anweisungen drei Hauptvorteile:

  • Vorbereitete Anweisungen reduzieren die Analysezeit, da die Vorbereitung der Abfrage nur einmal erfolgt (obwohl die Anweisung mehrmals ausgeführt wird).
  • Gebundene Parameter minimieren die Bandbreite zum Server, da Sie jedes Mal nur die Parameter und nicht die gesamte Abfrage senden müssen
  • Vorbereitete Anweisungen sind sehr nützlich gegen SQL-Injections, da Parameterwerte, die später mit einem anderen Protokoll übertragen werden, nicht korrekt maskiert werden müssen. Wenn die ursprüngliche Anweisungsvorlage nicht von einer externen Eingabe abgeleitet wird, kann keine SQL-Injection stattfinden.

Vorbereitete Anweisungen in MySQLi

Das folgende Beispiel verwendet vorbereitete Anweisungen und gebundene Parameter in MySQLi:

Beispiel (MySQLi mit vorbereiteten Anweisungen)

<?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 zur Erläuterung aus dem obigen Beispiel:

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

In unserem SQL fügen wir ein Fragezeichen (?) ein, wo wir einen Integer-, String-, Double- oder Blob-Wert ersetzen möchten.

Sehen Sie sich dann die Funktion bind_param() an:

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

Diese Funktion bindet die Parameter an die SQL-Abfrage und teilt der Datenbank mit, was die Parameter sind. Das Argument "sss" listet die Datentypen auf, die die Parameter sind. Das Zeichen s teilt mysql mit, dass der Parameter ein String ist.

Das Argument kann einer von vier Typen sein:

  • ich - ganze Zahl
  • d - doppelt
  • s - Zeichenfolge
  • b - BLOB

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

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

Hinweis: Wenn wir Daten aus externen Quellen (z. B. Benutzereingaben) einfügen möchten, ist es sehr wichtig, dass die Daten bereinigt und validiert werden.



Vorbereitete Anweisungen in PDO

Das folgende Beispiel verwendet vorbereitete Anweisungen und gebundene Parameter in PDO:

Beispiel (PDO mit vorbereiteten Anweisungen)

<?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;
?>