Use wpdb-prepare para 'ordenar por' nombre de columna

2

En mi complemento actual, estoy seleccionando la columna order by como entrada del usuario. Así que pensé en usar wpdb->prepare para escapar de él.

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

Esto no funciona porque se convierte en

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

(Tenga en cuenta las citas)

Entonces, ¿hay manera de eliminar las comillas? ¿También es esta una forma adecuada de usar $ wpdb- > prepare ()? ¿Debería escapar manualmente yo mismo?

    
pregunta Sudar 24.03.2014 - 04:12

1 respuesta

4

No puede usar prepare para los nombres de columna, y tampoco puede usarlo para el orden de clasificación. prepare siempre citará la cadena. Tendrá que intercambiar los valores usted mismo. En lugar de tratar de "sanear" los datos, usaría un enfoque de lista blanca.

$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;

Sin embargo, me pregunto por qué no estás usando WP_Query para esto.

    
respondido por el s_ha_dum 24.03.2014 - 05:32

Lea otras preguntas en las etiquetas