Alternativa a mysql_real_escape_string

20 may 2014, 19:56:09
Vistas: 22.3K
Votos: 3

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

3
Comentarios

Sé que hay una función personalizada en PHP en StackOverflow (ver: http://stackoverflow.com/questions/1162491/alternative-to-mysql-real-escape-string-without-connecting-to-db), pero también sugiero mysqli o PDO.

pascalvgemert pascalvgemert
20 may 2014 21:47:04

De hecho, parece que $wpdb->prepare hace el escape correcto según esta página http://codex.wordpress.org/Data_Validation

Allen Allen
20 may 2014 22:04:14

¡Me alegra saberlo!

pascalvgemert pascalvgemert
20 may 2014 22:05:08
Todas las respuestas a la pregunta 2
0

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.

21 may 2014 04:41:05
2

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 );
20 may 2014 20:33:19
Comentarios

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

Allen Allen
20 may 2014 20:53:41

@Allen sí, prepare escapa los valores usando mysqli_real_escape_string (compatible con PHP 5.5) o mysqli_real_escape_string según tu versión actual de PHP.

gmazzap gmazzap
21 may 2014 01:41:47