Soll ich wpdb vorbereiten?

28

Ich bin neu in SQL und frage mich, ob ich wpdb->preparefür die folgende Abfrage eine Tabelle verwenden muss, die ich erstellt habe

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = "SELECT * FROM " . $tablename . " ORDER BY date_created DESC";
$resulst = $wpdb->get_results( $sql , ARRAY_A );

Muss ich preparehier verwenden? Wie würde ich das machen?

Prost

Richard Sweeney
quelle

Antworten:

33

Es wird empfohlen, diese Methode immer zu verwenden. prepareDie Hauptverwendung besteht jedoch darin, SQL-Injection-Angriffe zu verhindern. Da die Benutzer / Besucher keine Eingaben machen oder die Abfrage nicht beeinflussen können, ist dies in Ihrem aktuellen Beispiel kein Problem.

Aber wie ich bereits sagte, ist es eine bewährte Methode, sie zu verwenden. Sobald Sie sie verwenden, hören Sie nie auf. In Ihrem Beispiel können Sie sie also folgendermaßen verwenden:

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM %s ORDER BY date_created DESC",$tablename );
$results = $wpdb->get_results( $sql , ARRAY_A );

Um mehr darüber zu erfahren, wie man es benutzt, gehen Sie zum Codex

Bainternet
quelle
Hallo @Bainternet, danke für diese klare Erklärung - aus irgendeinem Grund gibt es ein leeres Array zurück, wenn ich Ihren Code versuche. Ich habe nach Tippfehlern gesucht und diese verdoppelt. Wenn ich die unvorbereitete Abfrage durchführe, erhalte ich das Array. Ich verstehe nicht, warum es nicht funktioniert ..!
Richard Sweeney
Ungerade. Ich habe versucht, den gleichen Code mit einer anderen Abfrage zu verwenden: $tablename = $wpdb->prefix . "my_custom_table"; $concert_id = 1; $sql = "SELECT * FROM " . $tablename . " WHERE concert_id = %d LIMIT 1;"; $prep_sql = $wpdb->prepare( $sql, $concert_id ); $get_concerts = $wpdb->get_results( $prep_sql , ARRAY_A ); Und es funktioniert großartig! Ich weiß nicht, warum das so ist. Aber ich verstehe es jetzt auf jeden Fall!
Richard Sweeney
6
Das Einschließen des Tabellennamens in einfache Anführungszeichen funktioniert nicht. Der normale Entkommen ist mit Backticks, so dass Ihre Abfrage wie folgt am Ende aussehen sollte: SELECT * FROM `wp_my_custom_table`. Sie können doppelte Anführungszeichen Unterstützung, ermöglichen aber dann müsste es so aussehen: SELECT * FROM "wp_my_custom_table".
Jan Fabry
3
Ich stimme dieser Antwort nicht zu. Warum sollten Sie entkommen, wenn die Funktion schon alles entgeht? Sie denken, Wordpress wird entscheiden, das Entrinnen aus dem Kern zu entfernen? Außerdem gibt es keinen Grund, den Tabellennamen zu umgehen :), weil er fest codiert ist und Sie wissen, dass er in Ordnung ist. Ich weiß, dass dies nur ein Beispiel ist, aber auf keinen Fall Tabellennamen entgehen, ich habe Probleme bei der Verwendung der Vorbereitung mit Tabellennamen, die Backticks und SQL-Trows-Fehler hinzufügt.
Tommixoft
@Tommixoft Wenn Sie die Antwort erneut lesen, werden Sie feststellen, dass Sie tatsächlich dasselbe sagen wie ich und dass der Tabellenname ein Beispiel ist.
Bainternet
0

Wenn Sie prepare verwenden, wird der Code vor SQL-Injection-Schwachstellen geschützt.

Hier ist der Code, den Sie für die Verwendung ändern müssen prepare().

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM {$tablename} ORDER BY date_created DESC");
$resulst = $wpdb->get_results( $sql , ARRAY_A );
softnwords
quelle
0

In Ihrem Fall ist kein SQL-Injection-Angriff möglich . Ihr Code benötigt keinen zusätzlichen Schutz, da Sie keine Benutzereingaben wie "Posten", "Abrufen", "Anfordern" oder "Cookie" verwenden.

Verwenden Sie keine komplizierten Funktionen, wenn dies nicht erforderlich ist, um Serverressourcen zu sparen.

SaschArt
quelle