web-dev-qa-db-fra.com

Utilisez wpdb-> prepare pour le nom de la colonne `order by`

Dans mon plugin actuel, je récupère la colonne order by comme entrée utilisateur. J'ai donc pensé à utiliser wpdb->prepare pour y échapper.

$wpdb->get_results($wpdb->prepare("Select id from $wpdb->posts order by %s %s", $order_by_col, $order_by);

Cela ne fonctionne pas car il est transformé en

select id from wp_posts order by 'post_date' 'asc'

(Notez les citations)

Alors, y a-t-il moyen de supprimer les guillemets? Aussi, est-ce une bonne façon d’utiliser $ wpdb-> prepare ()? Dois-je manuellement y échapper moi-même?

4
Sudar

Vous ne pouvez pas utiliser prepare pour les noms de colonne et vous ne pouvez pas non plus l'utiliser pour l'ordre de tri. prepare citera toujours la chaîne. Vous devrez échanger les valeurs vous-même. Plutôt que d'essayer de "désinfecter" les données, j'utiliserais une approche de liste blanche.

$orderby = array(
  'date' => 'post_date',
  // etc
);
$sortorder = array(
  'asc' => 'ASC',
  'desc' => 'DESC',
);
$orderbycol = 'ID'; // just a default
if (isset($_GET['orderby'])
  && isset($allowed[$_GET['orderby']])) {
  $orderbycol = $allowed[$_GET['orderby']];
}
$order = 'ASC';
if (isset($_GET['order'])
  && isset($sortorder[$_GET['order']])) {
  $order = $sortorder[$_GET['order']];
} 

$sql = "Select id from $wpdb->posts order by $orderbycol $order";
echo $sql;

Cependant, je me demande pourquoi vous n'utilisez pas WP_Query pour cela.

5
s_ha_dum

La liste blanche est une bonne option pour 'ASC' 'DESC', mais pour les noms de table sur votre clause ORDERBY, WordPress a une fonction intégrée juste pour vous!

https://codex.wordpress.org/Function_Reference/sanitize_sql_orderby

$order_by_col = sanitize_sql_orderby( $order_by_col );

1
Tom Auger