J'ai un plugin WordPress qui me permet de voir si un titre existe dans la base de données. Pendant 2 ans, ce code a bien fonctionné:
$myposttitle= $wpdb->get_results(
"select post_title from $wpdb->posts
where post_title like '%". mysql_real_escape_string($myTitle) . "%'"
);
Cependant, avec PHP 5.5. et WP 3.9.1, cela provoque une erreur car la fonction mysql_real_escape_string
est obsolète.
Des idées sur quelle autre fonction échappera correctement au contenu de $myTitle
maintenant que je ne peux plus utiliser mysql_real_escape_string
?
Merci
Lorsque vous travaillez avec une base de données dans WordPress, vous ne devez jamais utiliser les fonctions mysql_*
ou mysqli_*
de niveau bas.
Toujours utiliser les méthodes $wpdb
, dans votre cas, vous devez utiliser prepare()
:
$query = $wpdb->prepare(
"SELECT post_title from $wpdb->posts
WHERE post_title LIKE %s",
"%" . $myTitle . "%"
);
De plus, une fois que vous obtenez une seule colonne, vous avez une vie plus facile en utilisant get_col
au lieu de get_results
:
$myposttitle = get_col( $query );
Alors que la réponse prepare()
donnée est partiellement correcte, si vous avez besoin d'un moyen d'échapper manuellement à une chaîne pour une instruction SQL, utilisez esc_sql()
.
Pour le cas spécifique de l'échappement d'une chaîne à placer dans une instruction similaire, il convient alors de l'écrire correctement:
$query = $wpdb->prepare(
"SELECT post_title from $wpdb->posts
WHERE post_title LIKE %s",
"%" . $wpdb->esc_like( $myTitle ) . "%"
);
$ Wpdb-> esc_like () est nécessaire pour échapper correctement aux signes de pourcentage, traits de soulignement ou barres obliques inversées pouvant figurer dans la phrase recherchée. Notez que $ wpdb-> esc_like () ne retourne pas les entrées préparées, il échappe uniquement aux caractères spéciaux utilisés dans un LIKE. Ainsi, le prepare () est toujours nécessaire.