it-swarm.com.de

Ist $ wpdb-> sich darauf vorzubereiten, zu viel zu fliehen? Wie man es richtig benutzt?

Ich bin ziemlich verwirrt von $ wpdb-> prepare. Ich möchte es verwenden, um Benutzereingaben zu bereinigen, aber es stellte sich heraus, dass es die Abfrage zerstört. Ich kann mir nicht vorstellen, dass es so funktionieren soll, aber ich kann nicht herausfinden, was ich falsch mache. Bitte sei so geduldig und zeige mir die Lösung. Der folgende Code ist nur ein einfaches Beispiel für Demonstrationszwecke, um zu verdeutlichen, was falsch läuft und wie. Später wird es Benutzereingaben geben Fütterung dieser Abfrage.

Wenn ich ausgelassen habe, bereite und benutze ich stattdessen sprintf:

global $wpdb;
$mydb = new \wpdb( "My_Login" ,"My_PW" , "My_Custom_DB" ,"localhost"); //wpdb instance for my custom db

$tablename = "books";
$sort_direction = "DESC";
$limit = 5;   
$sqlquery = sprintf( "SELECT * FROM %s ORDER BY datum %s LIMIT %d", $tablename, $sort_direction, $limit );

$res = $mydb->get_results( $sqlquery );
echo "<br>".$sqlquery."<br>";
var_dump($res);

Die Ausgabe von var_dump () ist ein richtiges Array, das das erwartete Ergebnis enthält.

Die Ausgabe von $ sqlquery ist:

SELECT * FROM books ORDER BY datum DESC LIMIT 5

Welches ist die richtige SQL.

Jetzt werde ich prepare verwenden (dies ist die einzige geänderte Zeile):

global $wpdb;
$mydb = new \wpdb( "My_Login" ,"My_PW" , "My_Custom_DB" ,"localhost"); //wpdb instance for my custom db

$tablename = "books";
$sort_direction = "DESC";
$limit = 5;   
$sqlquery = $mydb->prepare( "SELECT * FROM %s ORDER BY datum %s LIMIT %d", $tablename, $sort_direction, $limit );

$res = $mydb->get_results( $sqlquery );
echo "<br>".$sqlquery."<br>";
var_dump($res);

Die Ausgabe von var_dump () istNULL

Die Ausgabe von $ sqlquery ist:

SELECT * FROM 'books' ORDER BY datum 'DESC' LIMIT 5

Wo offensichtlich Tabellenname und DESC nicht in Anführungszeichen gesetzt werden sollten. IMO ist dies der Grund, warum es fehlschlägt. Ich habe doppelt überprüft, dass dies nicht mit der Instanzierung von $ wpdb zusammenhängt. Wenn ich mit $ wpdb arbeite, ist das Escaping-Ergebnis dasselbe.

Was ist los oder was habe ich falsch gemacht? Bitte hilf mir.

2
Hexodus

Was Sie hier falsch gemacht haben, war, diese Gegenstände an erster Stelle vorzubereiten.

Sie führen "Daten" -Variablen nur über prepare () aus. Sie führen keine Tabellennamen, Sortieranweisungen oder Beschränkungen durch. Diese sind Teil des SQL-Befehls selbst. Es handelt sich nicht um Daten, die sich auf Informationen beziehen, die in einer Spalte in der Datenbank gespeichert sind.

Ihre SELECT-Abfrage enthält keine Dateneingaben. Sie enthält daher keine Eingaben, die vorbereitet werden können.

Für den speziellen Fall eines SELECT sind Daten das Material in der WHERE-Klausel. Spalte =% s und so weiter. Dies sind variable Daten, die möglicherweise unsicher sind, da sie möglicherweise von Benutzereingaben stammen. Damit die Daten sicher sind, müssen sie vorbereitet werden. Wenn Sie jedoch einen fest codierten "DESC" für die Bestellung haben, ist es sinnlos, die Vorbereitung durchzuarbeiten. Es ist "DESC". Es ist sicher wie es ist. Nur Daten, die Sie nicht kennen, können unsicher sein.

Bearbeiten: Wenn jedoch Daten von Benutzereingaben stammen, z. B. wenn der Benutzer die Anzahl der anzuzeigenden Elemente auswählen kann, müssen diese Daten bereinigt werden. Limits können also als Ganzzahlen durch Prepare laufen und können von einem Benutzer stammen, der "5" oder "10" wählt.

Sie würden einem Benutzer jedoch nicht erlauben, den Tabellennamen oder die Sortierreihenfolge direkt einzugeben. Sie würden eine Richtung wählen, in der die Dinge angezeigt werden, aber Sie würden das in ASC oder DESC konvertieren. Sie würden "Bücher" nicht direkt auswählen, sondern könnten aus einer Liste auswählen, die Sie als "Bücher" interpretieren. Diese Art von Ding.

3
Otto