Alternativa a mysql_real_escape_string
Tengo un plugin de WordPress donde en un punto necesito verificar si cierto título existe en la base de datos. Durante 2 años, este código funcionó bien:
$myposttitle= $wpdb->get_results(
"select post_title from $wpdb->posts
where post_title like '%". mysql_real_escape_string($myTitle) . "%'"
);
Sin embargo, con PHP 5.5 y WordPress 3.9.1, esto causa un error porque la función mysql_real_escape_string
está obsoleta.
¿Alguna idea sobre qué otra función escapará correctamente el contenido de $myTitle
ahora que no puedo usar mysql_real_escape_string
?
Gracias
Aunque la respuesta sobre prepare()
dada es parcialmente correcta, si necesitas una forma de escapar manualmente una cadena para una sentencia SQL, usa esc_sql()
.
Para el caso específico de escapar una cadena que se colocará dentro de una sentencia LIKE, debería escribirse más correctamente así:
$query = $wpdb->prepare(
"SELECT post_title from $wpdb->posts
WHERE post_title LIKE %s",
"%" . $wpdb->esc_like( $myTitle ) . "%"
);
El $wpdb->esc_like() es necesario para escapar correctamente cualquier signo de porcentaje, guión bajo o barras invertidas que pueda haber en la frase que se está buscando. Ten en cuenta que $wpdb->esc_like() no devuelve entrada preparada, solo escapa los caracteres especiales utilizados en un LIKE. Por lo tanto, el prepare() sigue siendo necesario.

Cuando trabajas con bases de datos en WordPress nunca debes usar las funciones de bajo nivel mysql_*
o mysqli_*
.
Siempre utiliza los métodos de $wpdb
, en tu caso deberías usar prepare()
:
$query = $wpdb->prepare(
"SELECT post_title from $wpdb->posts
WHERE post_title LIKE %s",
"%" . $myTitle . "%"
);
Además, como estás obteniendo una sola columna, es más fácil usar get_col
en lugar de get_results
:
$myposttitle = get_col( $query );

Gracias... lo agradezco mucho. Sin embargo, esto no manejará el problema de escape que mencioné, ¿verdad?
