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 .= "AND
Abfrage1LIKE $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
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.