WordPress wpdb->SQL-String aus Formular vorbereiten

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer2391468

Ich verwende derzeit eine benutzerdefinierte WordPress-Tabelle, um einen externen XML-Feed zu speichern, und diese Informationen müssen durch ein einfaches HTML-Formular mit mehreren Optionen filterbar sein.

Was ist der beste Weg, dies zu tun und die Zeichenfolge mit zu erstellen wpdb->prepare? Ich verwende das Folgende für meine Paginierung und die $user_query ist derzeit auf eingestellt $user_query .= "ANDAbfrage1LIKE $query1 "; usw.

Ich habe jedoch das Gefühl, dass dies zu Problemen führen könnte, da ich es nicht über den zweiten Parameter wie z %d, $variable usw.

//Get Results
$results = $wpdb->get_results(
    $wpdb->prepare("SELECT * FROM `feed` WHERE `price` != 0 $user_query  LIMIT %d,
       %d", $offset, $items_per_page, OBJECT)
  );

Ich hoffe das obige macht Sinn. Ich versuche nur, die SQL-Abfrage aus dem Formular zu erstellen $_GET Werte ohne SQL-Injection-Probleme.

Danke vielmals

Benutzer-Avatar
Mathew Tinsley

Du kannst anrufen $wpdb->prepare bei Teilabfragen:

$user_query = $wpdb->prepare('AND query1 LIKE %s', $query1);

Sie können auch anrufen esc_sql direkt auf Benutzereingabe, um es zu bereinigen.

Außerdem müssen LIKE-Ausdrücke separat maskiert werden:

https://codex.wordpress.org/Class_Reference/wpdb/esc_like

$wpdb->esc_like maskiert Zeichen, die für ähnliche Ausdrücke (%, \, _) spezifisch sind, führt aber keine zusätzlichen Maskierungen durch. Sie müssen noch anrufen prepare oder esc_sql nach dem Entkommen eines ähnlichen Ausdrucks.

Update: Anhand dieses Beispiels aus den Kommentaren:

$user_query = $_GET['query1']; 
$user_query2 = $_GET['query2']; 

$user = $wpdb->prepare('AND query1 = %s ', $user_query); 
$user2 = $wpdb->prepare('AND query2 = %s ', $user_query2); 

$results = $wpdb->get_results( $wpdb->prepare('SELECT * FROM test WHERE price != 0' . $user . $user2 . 'LIMIT 20') );   

Hier macht es keinen Sinn, die Abfrage in Teilen zu erstellen, Sie könnten Ihre Abfrage einfach so erstellen:

$query = 'SELECT * FROM test 
            WHERE price != 0 
                AND query1 = %s 
                AND query1 = %s 
            LIMIT 20';
$results = $wpdb->get_results( $wpdb->prepare($query, $user_query, $user_query2) ); 

Als Beispiel gehe ich davon aus, dass die Benutzerabfragen optional sind. Wenn dies der Fall ist, müssen Sie Ihre WHERE-Bedingungen nur dann separat vorbereiten, wenn der Parameter bereitgestellt wird:

$query = 'SELECT * FROM test 
            WHERE price != 0';

if($user_query) {
    $cond = $wpdb->prepare(' AND query1 = %s', $user_query);
    $query .= $cond;
}

if($user_query2) {
    $cond = $wpdb->prepare(' AND query2 = %s', $user_query2); 
    $query .= $cond;
}

$query .= ' LIMIT 20';
$results = $wpdb->get_results( $query );

Beachten Sie, dass es nicht erforderlich ist, für die Abfrage die Vorbereitung aufzurufen, wenn Sie sie an übergeben get_results da alle Benutzereingaben bereits bereinigt wurden.

  • Hallo mtinsley, danke für die Antwort. Sie würden also einfach eine Abfrage wie diese erstellen (mit den Benutzerformularwerten usw.): $user = $wpdb->prepare(‘ field1 = %s’, ‘123’); $results = $wpdb->get_results( $wpdb->prepare(‘SELECT * FROM test WHERE’ .$user) ); Sieht das ungefähr richtig aus?

    – Benutzer2391468

    7. April 2015 um 19:13 Uhr


  • In diesem speziellen Fall scheint es keinen Sinn zu machen, Ihre Abfrage in Teilen zu erstellen, aber das sollte funktionieren. Wenn Sie mehr von Ihrem Code posten, kann ich Ihnen eine vollständigere Antwort auf den richtigen Ansatz zur Bereinigung Ihrer Parameter geben.

    – Mathew Tinsley

    7. April 2015 um 19:31 Uhr

  • Danke mtinsley, tut mir leid, das war ein bisschen beschissenes Beispiel. Der Code, an dem ich gearbeitet habe, befindet sich auf meinem Arbeitscomputer. Die Idee ist, dass ich nur Teilabfragen zur Hauptabfrage hinzufügen muss, wenn die $_GET-Werte vorhanden sind. Zum Beispiel: $user_query = isset($_GET[‘query1’]); $user_query2 = isset($_GET[‘query2’]); $user = $wpdb->prepare(‘AND query1 = %s ‘, $user_query); $user2 = $wpdb->prepare(‘AND query2 = %s ‘, $user_query2); $results = $wpdb->get_results( $wpdb->prepare(‘SELECT * FROM test WHERE price != 0’ . $user . $user2 . ‘LIMIT 20’) ); Würdest du das so konstruieren?

    – Benutzer2391468

    7. April 2015 um 19:43 Uhr


  • Hallo Minsley. Danke für das oben Gesagte. Das macht Sinn. Entschuldigung, ich hätte erwähnen sollen, dass es sich im Wesentlichen um eine filterbare Suche handelt, sodass die Benutzerabfragen optional sind. Nochmals vielen Dank für die Mühe, die Sie sich gemacht haben, um mir das zu erklären, es wird sehr geschätzt. Ich habe das Obige auf die akzeptierte Antwort aktualisiert. Ich wünsche Ihnen einen schönen Abend!

    – Benutzer2391468

    7. April 2015 um 20:28 Uhr

1299760cookie-checkWordPress wpdb->SQL-String aus Formular vorbereiten

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

Privacy policy