web-dev-qa-db-fra.com

Alternative à mysql_real_escape_string

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

3
Allen

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 );
2
gmazzap

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.

5
Otto