Errore wpdb::prepare chiamato in modo errato - Correzione query WordPress

16 giu 2014, 07:07:56
Visualizzazioni: 19.5K
Voti: 5

Ho questo codice per rimuovere i post orfani dopo aver eliminato un custom post type.

Funziona, ma questo codice...

global $wpdb;
$wpdb->query( 
    $wpdb->prepare( 
    "DELETE a,b,c FROM wp_posts a
    LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
    LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
    WHERE a.post_type='attorneys'"
  )
);

...genera questo errore:

PHP Notice: wpdb::prepare è stato chiamato in modo errato. L'argomento query di wpdb::prepare() deve avere un segnaposto.

Dopo aver letto la spiegazione su make.wordpress.org di Andrew Nacin, ho capito (più o meno) che mi manca il secondo argomento.

Poi, dopo aver letto questo post su Stack, mi chiedo se ho davvero bisogno della funzione prepare(). Ci sono variabili con valori sconosciuti? Non sono sicuro.

...cosa mi sfugge?

AGGIORNAMENTO: Questo codice funziona anche, ma senza prepare() mi chiedo se sia sicuro.

global $wpdb;
$wpdb->query( 
  "DELETE a,b,c FROM wp_posts a
  LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
  LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
  WHERE a.post_type='attorneys'"
);

Consigli?

0
Tutte le risposte alla domanda 1
0
11

Si consiglia sempre di utilizzare $wpdb->prepare quando si ricevono input dall'utente. Questo aiuta a proteggere le query dagli attacchi SQL Injection. Per maggiori dettagli, consulta il Codex

Quando usi $wpdb->prepare, devi passare le variabili alla query. Nel tuo caso, puoi evitare di usare $wpdb->prepare poiché stai utilizzando un valore hard-coded. Ma se hai lo stesso valore in una variabile, devi modificarlo come segue

$post_type = 'attorneys';

$wpdb->query( 
     $wpdb->prepare(
          "DELETE a,b,c FROM wp_posts a
          LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
          LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
          WHERE a.post_type=%s",
          $post_type
     )
);
16 giu 2014 09:59:59