Ist $ wpdb-> zu viel Entkommen vorbereiten? Wie man es richtig benutzt?

Ich bin ziemlich verwirrt von $ wpdb-> vorbereiten. 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 funktioniert, aber ich kann nicht herausfinden, was ich falsch mache. Bitte sei so geduldig und weise mich auf die Lösung hin. Der folgende Code ist nur ein einfaches Beispiel für Demonstrationszwecke, um klarzustellen, was falsch läuft und wie. Später wird es eine Benutzereingabe geben , die diese Abfrage einspeist.

Wenn ich mich auslasse und stattdessen sprintf benutze, funktioniert dieses Beispiel:

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 "
".$sqlquery."
"; var_dump($res);

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

Die Ausgabe von $ sqlquery lautet:

 SELECT * FROM books ORDER BY datum DESC LIMIT 5 

Was ist richtiges SQL?

Jetzt werde ich vorbereiten (das 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 "
".$sqlquery."
"; var_dump($res);

Die Ausgabe von var_dump () ist NULL

Die Ausgabe von $ sqlquery lautet:

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

Wo offensichtlich Tabellenname und DESC nicht in Anführungszeichen eingeschlossen sein sollten. IMO das ist der Grund, warum es scheitert. Ich habe überprüft, dass dies nichts mit der Instantiierung von $ wpdb zu tun hat. Wenn ich mit $ wpdb arbeite, ist das Ergebnis gleich.

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

Solutions Collecting From Web of "Ist $ wpdb-> zu viel Entkommen vorbereiten? Wie man es richtig benutzt?"

Was du hier falsch gemacht hast, war, diese Dinge überhaupt vorzubereiten.

Sie führen nur “Daten” -Variablen durch prepare (). Sie führen keine Tabellennamen oder Sortierreihenfolgen oder Begrenzungen durch. Diese sind Teil des SQL-Befehls selbst, sie sind keine Daten, die sich auf Informationen beziehen, die in einer Spalte in der database gespeichert sind.

Ihre SELECT-Abfrage hat keine Dateneingaben … daher hat sie keine Eingaben, die vorbereitet werden können.

Für den speziellen Fall eines SELECT sind Daten das Zeug in der WHERE-Klausel. Spalte =% s und so weiter. Das ist eine variable Datenmenge, die potenziell unsicher sein kann, weil sie möglicherweise von Benutzereingaben stammt. Damit die Daten durchlaufen werden müssen, bereiten Sie sie vor, um sie sicher zu machen. Aber wenn Sie ein hartcodiertes “DESC” für die Bestellung haben, dann hat es keinen Sinn, es durch vorzubereiten. Es ist “DESC”. Es ist so sicher wie es ist. Nur Daten, die Sie nicht wissen, was es ist, können unsicher sein.

Bearbeiten: Wenn die Daten jedoch von Benutzereingaben stammen, wie wenn der Benutzer die Anzahl der anzuzeigenden Elemente auswählen kann, müssen diese Daten bereinigt werden. So können Grenzen als Ganzzahlen durchlaufen werden und von einem Benutzer kommen, der “5” oder “10” auswählt.

Sie würden einem Benutzer jedoch nicht erlauben, den Tabellennamen oder die Sortierreihenfolge direkt einzugeben. Sie würden eine Richtung wählen, um Dinge anzuzeigen, aber Sie würden das in ASC oder DESC umwandeln. 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.