So fügen Sie eine PHP-Variable in eine MySQL-Anweisung ein

Lesezeit: 5 Minuten

So fugen Sie eine PHP Variable in eine MySQL Anweisung ein
Pinkie

Ich versuche, Werte in die Inhaltstabelle einzufügen. Es funktioniert gut, wenn ich keine PHP-Variable in VALUES habe. Wenn ich die Variable setze $type Innerhalb VALUES dann geht das nicht. Was mache ich falsch?

$type="testing";
mysql_query("INSERT INTO contents (type, reporter, description) 
     VALUES($type, 'john', 'whatever')");

  • WICHTIG: Das direkte Einfügen von Variablen in Ihr SQL ist eine Hauptquelle für SQL-Injection-Angriffe

    – Machatität

    11. November 2019 um 0:38 Uhr

So fugen Sie eine PHP Variable in eine MySQL Anweisung ein
Ihr gesunder Menschenverstand

Die Regeln für das Hinzufügen einer PHP-Variable innerhalb einer MySQL-Anweisung sind schlicht und einfach:

  1. Jede Variable, die ein darstellt SQL-Datenliteral, (oder einfach ausgedrückt – ein SQL-String oder eine Zahl) MUSS durch eine vorbereitete Anweisung hinzugefügt werden. Keine Ausnahmen.
  2. Jeder andere Abfrageteil, z. B. ein SQL-Schlüsselwort, ein Tabellen- oder Feldname oder ein Operator, muss durch a gefiltert werden Weiße Liste.

Da es sich bei Ihrem Beispiel also nur um Datenliterale handelt, müssen alle Variablen durch Platzhalter (auch Parameter genannt) hinzugefügt werden. Dazu:

  • Ersetzen Sie in Ihrer SQL-Anweisung alle Variablen durch Platzhalter
  • bereiten die resultierende Abfrage
  • binden Variablen zu Platzhaltern
  • ausführen die Abfrage

Und so machen Sie es mit allen gängigen PHP-Datenbanktreibern:

Hinzufügen von Datenliteralen mit mysql ext

So ein Fahrer existiert nicht.

Hinzufügen von Datenliteralen mit mysqli

$type="testing";
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $type, $reporter);
$stmt->execute();

Der Code ist etwas kompliziert, aber die detaillierte Erklärung all dieser Operatoren finden Sie in meinem Artikel. So führen Sie eine INSERT-Abfrage mit Mysqli aussowie eine Lösung, die den Prozess erheblich vereinfacht.

Für eine SELECT-Abfrage müssen Sie nur einen Aufruf hinzufügen get_result() Methode, um sich vertraut zu machen mysqli_result von dem Sie die Daten wie gewohnt abrufen können:

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)

Hinzufügen von Datenliteralen mit PDO

$type="testing";
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);

In PDO können wir die Bind- und Execute-Teile kombinieren, was sehr praktisch ist. PDO unterstützt auch benannte Platzhalter, die einige als äußerst praktisch empfinden.

Hinzufügen von Schlüsselwörtern oder Identifikatoren

Manchmal müssen wir eine Variable hinzufügen, die einen anderen Teil einer Abfrage darstellt, z. B. ein Schlüsselwort oder eine Kennung (eine Datenbank, eine Tabelle oder ein Feldname). Es ist ein seltener Fall, aber es ist besser, vorbereitet zu sein.

In diesem Fall muss Ihre Variable gegen eine Werteliste geprüft werden ausdrücklich in Ihrem Skript geschrieben. Dies wird in meinem anderen Artikel erklärt, Hinzufügen eines Feldnamens in der ORDER BY-Klausel basierend auf der Auswahl des Benutzers:

Leider hat PDO keinen Platzhalter für Bezeichner (Tabellen- und Feldnamen), daher muss ein Entwickler sie manuell herausfiltern. Ein solcher Filter wird oft als „weiße Liste“ bezeichnet (wo wir nur zulässige Werte auflisten) im Gegensatz zu einer „schwarzen Liste“, auf der wir unzulässige Werte auflisten.

Wir müssen also explizit alle möglichen Varianten im PHP-Code auflisten und dann daraus auswählen.

Hier ist ein Beispiel:

$orderby = $_GET['orderby'] ?: "name"; // set the default value
$allowed = ["name","price","qty"]; // the white list of allowed field names
$key = array_search($orderby, $allowed, true); // see if we have such a name
if ($key === false) { 
    throw new InvalidArgumentException("Invalid field name"); 
}

Genau die gleiche Vorgehensweise sollte für die Richtung verwendet werden,

$direction = $_GET['direction'] ?: "ASC";
$allowed = ["ASC","DESC"];
$key = array_search($direction, $allowed, true);
if ($key === false) { 
    throw new InvalidArgumentException("Invalid ORDER BY direction"); 
}

Nach einem solchen Code beides $direction und $orderby Variablen können sicher in die SQL-Abfrage eingefügt werden, da sie entweder gleich einer der zulässigen Varianten sind oder ein Fehler ausgegeben wird.

Zu guter Letzt müssen Identifikatoren noch entsprechend der jeweiligen Datenbanksyntax formatiert werden. Für MySQL sollte es sein backtick Zeichen um die Kennung. Die letzte Abfragezeichenfolge für unsere Bestellung nach Beispiel wäre also

$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";

1647095048 930 So fugen Sie eine PHP Variable in eine MySQL Anweisung ein
Stefan

Um eine SQL-Injection zu vermeiden, muss die Insert-Anweisung mit be

$type="testing";
$name="john";
$description = 'whatever';

$con = new mysqli($user, $pass, $db);
$stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $type , $name, $description);
$stmt->execute();

  • Was ist, wenn ich versuche, ein Profil anzuzeigen, und in meinem $stmt habe ich ‘SELECT * FROM Profile WHERE profile_id LIKE (?)’ .. Ich muss nur einen Parameter in mein SQL einfügen, wie gehe ich vor? ?

    – Dr. Faraday

    19. April 2021 um 9:09 Uhr

Die beste Option sind vorbereitete Aussagen. Mit Anführungszeichen und Escapezeichen herumzuspielen ist anfangs schwieriger und schwer zu pflegen. Früher oder später werden Sie versehentlich vergessen, etwas zu zitieren, oder dieselbe Zeichenfolge zweimal maskieren oder so etwas vermasseln. Es kann Jahre dauern, bis Sie diese Art von Fehlern finden.

http://php.net/manual/en/pdo.prepared-statements.php

1647095048 61 So fugen Sie eine PHP Variable in eine MySQL Anweisung ein
Spencer Rose

Der Text in $type wird direkt in den Insert-String eingesetzt, daher erhält MySQL Folgendes:

... VALUES(testing, 'john', 'whatever')

Beachten Sie, dass es beim Testen keine Anführungszeichen gibt, Sie müssen diese wie folgt einfügen:

$type="testing";
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

Ich empfehle Ihnen auch, sich zu informieren SQL-Injektionda diese Art der Parameterübergabe anfällig für Hacking-Versuche ist, wenn Sie die verwendeten Daten nicht bereinigen:

1647095049 577 So fugen Sie eine PHP Variable in eine MySQL Anweisung ein
Balomba

Das ist die einfache Antwort:

$query="SELECT * FROM CountryInfo WHERE Name="".$name.""";

und du definierst $name irgendwas du willst.
Und ein anderer Weg, der komplexe Weg, ist so:

$query = " SELECT '" . $GLOBALS['Name'] . "' .* " .
         " FROM CountryInfo " .
         " INNER JOIN District " .
         " ON District.CountryInfoId = CountryInfo.CountryInfoId " .
         " INNER JOIN City " .
         " ON City.DistrictId = District.DistrictId " .
         " INNER JOIN '" . $GLOBALS['Name'] . "' " .
         " ON '" . $GLOBALS['Name'] . "'.CityId = City.CityId " .
         " WHERE CountryInfo.Name="" . $GLOBALS["CountryName'] .
         "'";

  • ….aber das ist auch die gefährlichste aller Antworten. Sie haben nicht einmal versucht, SQL-Injektionen in irgendeiner Weise zu vermeiden, und solcher Code sollte es tun noch nie verwendet werden

    – Nico Haase

    24. Juni 2021 um 10:11 Uhr

  • ….aber das ist auch die gefährlichste aller Antworten. Sie haben nicht einmal versucht, SQL-Injektionen in irgendeiner Weise zu vermeiden, und solcher Code sollte es tun noch nie verwendet werden

    – Nico Haase

    24. Juni 2021 um 10:11 Uhr

993940cookie-checkSo fügen Sie eine PHP-Variable in eine MySQL-Anweisung ein

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy