Alternativa a mysql_real_escape_string

20 mag 2014, 19:56:09
Visualizzazioni: 22.3K
Voti: 3

Ho un plugin WordPress in cui ad un certo punto ho bisogno di verificare se un determinato titolo esiste nel database. Per 2 anni, questo codice ha funzionato bene:

$myposttitle= $wpdb->get_results(
 "select post_title from $wpdb->posts
  where post_title like '%".  mysql_real_escape_string($myTitle) . "%'"
);

Tuttavia, con PHP 5.5 e WP 3.9.1, questo causa un errore perché la funzione mysql_real_escape_string è deprecata.

Avete idee su quale altra funzione possa eseguire correttamente l'escape del contenuto di $myTitle ora che non posso più usare mysql_real_escape_string?

Grazie

3
Commenti

So che esiste una funzione PHP personalizzata su stackoverflow (vedi: http://stackoverflow.com/questions/1162491/alternative-to-mysql-real-escape-string-without-connecting-to-db), ma suggerirei anche mysqli o pdo.

pascalvgemert pascalvgemert
20 mag 2014 21:47:04

in realtà, sembra che $wpdb->prepare faccia l'escape corretto secondo questa pagina http://codex.wordpress.org/Data_Validation

Allen Allen
20 mag 2014 22:04:14

Buono a sapersi!

pascalvgemert pascalvgemert
20 mag 2014 22:05:08
Tutte le risposte alla domanda 2
0

Sebbene la risposta data riguardo a prepare() sia parzialmente corretta, se hai bisogno di un modo per manualmente escapare una stringa per un'istruzione SQL, usa esc_sql().

Per il caso specifico di escapare una stringa da inserire all'interno di un'istruzione LIKE, allora dovrebbe essere scritto più correttamente così:

$query = $wpdb->prepare(
  "SELECT post_title from $wpdb->posts
  WHERE post_title LIKE %s",
  "%" . $wpdb->esc_like( $myTitle ) . "%"
);

L'uso di $wpdb->esc_like() è necessario per escapare correttamente eventuali segni di percentuale, underscore o backslash che potrebbero essere presenti nella frase da ricercare. Nota che $wpdb->esc_like() non restituisce input preparato, ma si limita a escapare i caratteri speciali utilizzati in un LIKE. Pertanto, prepare() è ancora necessario.

21 mag 2014 04:41:05
2

Quando lavori con il database in WordPress non dovresti mai usare le funzioni di basso livello mysql_* o mysqli_*.

Utilizza sempre i metodi di $wpdb, nel tuo caso dovresti usare prepare():

$query = $wpdb->prepare(
  "SELECT post_title from $wpdb->posts
  WHERE post_title LIKE %s",
  "%" . $myTitle . "%"
);

Inoltre, quando stai recuperando una singola colonna, hai la vita più semplice usando get_col invece di get_results:

$myposttitle = get_col( $query );
20 mag 2014 20:33:19
Commenti

Grazie... molto apprezzato. Tuttavia, questo non gestirà il problema di escape che ho menzionato, vero?

Allen Allen
20 mag 2014 20:53:41

@Allen sì, prepare effettua l'escape dei valori utilizzando mysqli_real_escape_string (compatibile con PHP 5.5) o mysqli_real_escape_string in base alla versione di PHP attualmente in uso.

gmazzap gmazzap
21 mag 2014 01:41:47