Foros del Web » Programando para Internet » PHP »

real_escape_string Problema

Estas en el tema de real_escape_string Problema en el foro de PHP en Foros del Web. Hola, tengo un script que usa real_escape_string y cuando hago una consulta a la bbdd me aparece con las comillas escapadas (logicamente), mi pregunta es ...
  #1 (permalink)  
Antiguo 12/01/2016, 10:15
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 9 meses
Puntos: 1
real_escape_string Problema

Hola, tengo un script que usa real_escape_string y cuando hago una consulta a la bbdd me aparece con las comillas escapadas (logicamente), mi pregunta es como puedo hacer la operacion inversa al consultar para que solo me muestre las comillas y no las comillas escapadas.
Saludos y gracias
  #2 (permalink)  
Antiguo 12/01/2016, 10:22
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: real_escape_string Problema

En teoría, si usaste bien dicha función al momento de extraer los datos de la base de datos deben salir las comillas sin escapes.

Si estás obteniendo los escapes entonces es probable que algo hagas mal al momento de insertar los datos.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 12/01/2016, 10:29
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: real_escape_string Problema

Cita:
Iniciado por pateketrueke Ver Mensaje
En teoría, si usaste bien dicha función al momento de extraer los datos de la base de datos deben salir las comillas sin escapes.

Si estás obteniendo los escapes entonces es probable que algo hagas mal al momento de insertar los datos.
Y en la bbdd se tienen que ver los escapes? , pues no se que pude haber hecho mal tal vez que uso real_escape_string en una funcion?
  #4 (permalink)  
Antiguo 12/01/2016, 10:30
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: real_escape_string Problema

En la base de datos no se deberían ver los escapes, si los ves entonces algo hiciste mal.

Cita:
pues no se que pude haber hecho mal tal vez que uso real_escape_string en una funcion?
Probablemente escapaste dos veces, no sé, adivinar no se puede.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 12/01/2016, 10:36
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: real_escape_string Problema

Cita:
Iniciado por pateketrueke Ver Mensaje
En la base de datos no se deberían ver los escapes, si los ves entonces algo hiciste mal.



Probablemente escapaste dos veces, no sé, adivinar no se puede.
Vale jeje aver son dos funciones, una la que elimina, crea o modifica consultas:
Código PHP:
function eliminar_nuevos_datos($conexion$consulta$escapar_datos$id_insert){

        
// Create connection
        
require($_SERVER['DOCUMENT_ROOT'].$conexion);
        
        
$SQL_datos_conexion = new mysqli($db_host$db_user$db_pass$db_name);

        
//Si se quiere escapar los datos
        
if($escapar_datos!=false){


            
$stmt $SQL_datos_conexion->prepare($consulta);            
                
                
$numero_datos count($escapar_datos);

                if(
$numero_datos>=2){

                    
//Saber si es string o numerico(int)
                    
$type '';
                    foreach (
$escapar_datos as $value) {
                        
$type .= is_numeric($value) ? 'i' 's';
                    }

                    if(
$numero_datos==2){
                        
$stmt->bind_param($typeescapar_caracteres($SQL_datos_conexion$escapar_datos[0]), escapar_caracteres($SQL_datos_conexion$escapar_datos[1]));
                    }elseif(
$numero_datos==3){
                        
$stmt->bind_param($typeescapar_caracteres($SQL_datos_conexion$escapar_datos[0]), escapar_caracteres($SQL_datos_conexion$escapar_datos[1]), escapar_caracteres($SQL_datos_conexion$escapar_datos[2]));
                    }elseif(
$numero_datos==8){
                        
$stmt->bind_param($typeescapar_caracteres($SQL_datos_conexion$escapar_datos[0]), escapar_caracteres($SQL_datos_conexion$escapar_datos[1]), escapar_caracteres($SQL_datos_conexion$escapar_datos[2]), escapar_caracteres($SQL_datos_conexion$escapar_datos[3]), escapar_caracteres($SQL_datos_conexion$escapar_datos[4]), escapar_caracteres($SQL_datos_conexion$escapar_datos[5]), escapar_caracteres($SQL_datos_conexion$escapar_datos[6]), escapar_caracteres($SQL_datos_conexion$escapar_datos[7]));
                    }elseif(
$numero_datos==10){
                        
$stmt->bind_param($typeescapar_caracteres($SQL_datos_conexion$escapar_datos[0]), escapar_caracteres($SQL_datos_conexion$escapar_datos[1]), escapar_caracteres($SQL_datos_conexion$escapar_datos[2]), escapar_caracteres($SQL_datos_conexion$escapar_datos[3]), escapar_caracteres($SQL_datos_conexion$escapar_datos[4]), escapar_caracteres($SQL_datos_conexion$escapar_datos[5]), escapar_caracteres($SQL_datos_conexion$escapar_datos[6]), escapar_caracteres($SQL_datos_conexion$escapar_datos[7]), escapar_caracteres($SQL_datos_conexion$escapar_datos[8]), escapar_caracteres($SQL_datos_conexion$escapar_datos[9]));
                    }elseif(
$numero_datos==14){
                        
$stmt->bind_param($typeescapar_caracteres($SQL_datos_conexion$escapar_datos[0]), escapar_caracteres($SQL_datos_conexion$escapar_datos[1]), escapar_caracteres($SQL_datos_conexion$escapar_datos[2]), escapar_caracteres($SQL_datos_conexion$escapar_datos[3]), escapar_caracteres($SQL_datos_conexion$escapar_datos[4]), escapar_caracteres($SQL_datos_conexion$escapar_datos[5]), escapar_caracteres($SQL_datos_conexion$escapar_datos[6]), escapar_caracteres($SQL_datos_conexion$escapar_datos[7]), escapar_caracteres($SQL_datos_conexion$escapar_datos[8]), escapar_caracteres($SQL_datos_conexion$escapar_datos[9]), escapar_caracteres($SQL_datos_conexion$escapar_datos[10]), escapar_caracteres($SQL_datos_conexion$escapar_datos[11]), escapar_caracteres($SQL_datos_conexion$escapar_datos[12]), escapar_caracteres($SQL_datos_conexion$escapar_datos[13]));
                    }

                }elseif(
$numero_datos==1){
                    
$stmt->bind_param('s'escapar_caracteres($SQL_datos_conexion$escapar_datos));
                }

                
$stmt->execute();

                if(
$id_insert==true){
                    
//Retornar numero de celdas afectadas e ID del registro
                    
$n_celdas=$stmt->affected_rows;
                    
$id_registro=$stmt->insert_id;
                    return array(
$n_celdas$id_registro);
                }else{
                    
//Retornar numero de celdas afectadas
                    
return $stmt->affected_rows;                    
                }


                
$stmt->close();

        }else{            
            
mysqli_query($SQL_datos_conexion$consulta);
        }

        
mysqli_close($SQL_datos_conexion);

    } 
y la otra la que escapa:
Código PHP:
function escapar_caracteres($SQL_datos_conexion$datos_a_escapar){
        if(
$datos_a_escapar==null){
            return 
$datos_a_escapar;
        }else{
            return 
$SQL_datos_conexion->real_escape_string($datos_a_escapar);
        }
    } 
Si no se puede ver escapado como se si lo hice bien?
  #6 (permalink)  
Antiguo 12/01/2016, 10:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: real_escape_string Problema

Pues sí, ahí está tu error: el método bind_param() ya escapa los datos por default, no es necesario escapar antes los valores a usar.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 12/01/2016, 11:03
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: real_escape_string Problema

Vaya asique no mecesito usar real escape, y en otras consultas que no uso bind como puedo comprobar que han escapado los caracteres para saber si lo tengo bien
  #8 (permalink)  
Antiguo 12/01/2016, 11:05
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: real_escape_string Problema

Cita:
Iniciado por jonyjdv Ver Mensaje
Vaya asique no mecesito usar real escape, y en otras consultas que no uso bind como puedo comprobar que han escapado los caracteres para saber si lo tengo bien
La pregunta sería ¿por qué no usas bind en esos casos?

Es alarmante que por un lado quieras hacer bien las cosas, pero en otras partes lo ignores por completo.

Yo te sugiero usar siempre bind para crear las consultas apropiadamente.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 12/01/2016, 12:25
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: real_escape_string Problema

Cita:
Iniciado por pateketrueke Ver Mensaje
La pregunta sería ¿por qué no usas bind en esos casos?

Es alarmante que por un lado quieras hacer bien las cosas, pero en otras partes lo ignores por completo.

Yo te sugiero usar siempre bind para crear las consultas apropiadamente.
Si esa es mi idea, pero llebo con el proyecto varios meses y desearia que funcionase e ir mejorando el codigo poco a poco, el problema es que cuando empece con este proyecto apenas conocia php y desde entonces voy aprendiendo "sobre la marcha" haciendo algun que otro curso rapido y al ser un proyecto un tanto grande pues no quiero ir retrocediendo para mejorar el codigo, creo que es mejor una vez funcione bien ir optimizando poco a poco el codigo.
[EDITO]
Cambiare todo por bind los pocos dias que lo llebo usando se me hace mucho mas comodo.
  #10 (permalink)  
Antiguo 12/01/2016, 20:25
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 4 meses
Puntos: 14
Respuesta: real_escape_string Problema

Cosa fuera de tema pero igual te viene bien. Viendo el codigo, solo vas a tener 1, 2, 3, 4, 8, 10 o 14 parametros ... no puedes tener 7 ni 22 :) ok ok ...

Igual te vendría bien saber que en php 5.6.x puedes usar "..." para indicar que el parametro se puede repetir las veces que haga falta y de la misma forma puedes pasar esto datos al siguiente metodo.

Ejemplos:
Código PHP:
function suma(...$numeros) {
    
$resultado 0;
    foreach (
$numeros as $numero) {
        
$resultado += $numero;
    }

    return 
$resultado;
}

// Llamadas a la funcion suma
suma(23); // Devuelve 5
suma(23456// Devuelve 20 
Pero puedes usar este array (en el ejemplo $numeros) para pasarlo a bind_param.

Ejemplo:
Código PHP:
// Bueno, quitando el escape ... no tiene sentido aqui
 
$stmt->bind_param(...$escapar_datos); // Le pasa todos, ya sean 7, 22, 1, 4, 8, 10 o 14 como lo tienes definido 
El tipo "$type" sabes como sacarlo usando el mismo bucle que estabas utilizando.

Con esto eliminas todo el codigo de ifs / else ifs con lineas de 14 parametros.
Y quedaria muchisimo mas limpio asi:
Código PHP:
function eliminar_nuevos_datos($conexion$consulta$id_insert, ...$escapar_datos) {

    
// Create connection
    
require($_SERVER['DOCUMENT_ROOT'] . $conexion);

    
$SQL_datos_conexion = new mysqli($db_host$db_user$db_pass$db_name);

    
//Si se quiere escapar los datos
    
if ($escapar_datos != false) {
        
        
$stmt $SQL_datos_conexion->prepare($consulta);

        
// Saber si es string o numerico(int)
        
$type '';
        foreach (
$escapar_datos as $value) {
            
$type .= is_numeric($value) ? 'i' 's';
        }

        
$stmt->bind_param($type, ...$escapar_datos);
        
$stmt->execute();

        if (
$id_insert == true) {
            
//Retornar numero de celdas afectadas e ID del registro
            
$n_celdas $stmt->affected_rows;
            
$id_registro $stmt->insert_id;

            return array(
$n_celdas$id_registro);
        } else {
            
//Retornar numero de celdas afectadas
            
return $stmt->affected_rows;
        }

        
$stmt->close();

    } else {
        
mysqli_query($SQL_datos_conexion$consulta);
    }

    
mysqli_close($SQL_datos_conexion);

  #11 (permalink)  
Antiguo 23/01/2016, 08:13
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: real_escape_string Problema

Cita:
Iniciado por x_atrix Ver Mensaje
Cosa fuera de tema pero igual te viene bien. Viendo el codigo, solo vas a tener 1, 2, 3, 4, 8, 10 o 14 parametros ... no puedes tener 7 ni 22 :) ok ok ...

Igual te vendría bien saber que en php 5.6.x puedes usar "..." para indicar que el parametro se puede repetir las veces que haga falta y de la misma forma puedes pasar esto datos al siguiente metodo.

Ejemplos:
Código PHP:
function suma(...$numeros) {
    
$resultado 0;
    foreach (
$numeros as $numero) {
        
$resultado += $numero;
    }

    return 
$resultado;
}

// Llamadas a la funcion suma
suma(23); // Devuelve 5
suma(23456// Devuelve 20 
Pero puedes usar este array (en el ejemplo $numeros) para pasarlo a bind_param.

Ejemplo:
Código PHP:
// Bueno, quitando el escape ... no tiene sentido aqui
 
$stmt->bind_param(...$escapar_datos); // Le pasa todos, ya sean 7, 22, 1, 4, 8, 10 o 14 como lo tienes definido 
El tipo "$type" sabes como sacarlo usando el mismo bucle que estabas utilizando.

Con esto eliminas todo el codigo de ifs / else ifs con lineas de 14 parametros.
Y quedaria muchisimo mas limpio asi:
Código PHP:
function eliminar_nuevos_datos($conexion$consulta$id_insert, ...$escapar_datos) {

    
// Create connection
    
require($_SERVER['DOCUMENT_ROOT'] . $conexion);

    
$SQL_datos_conexion = new mysqli($db_host$db_user$db_pass$db_name);

    
//Si se quiere escapar los datos
    
if ($escapar_datos != false) {
        
        
$stmt $SQL_datos_conexion->prepare($consulta);

        
// Saber si es string o numerico(int)
        
$type '';
        foreach (
$escapar_datos as $value) {
            
$type .= is_numeric($value) ? 'i' 's';
        }

        
$stmt->bind_param($type, ...$escapar_datos);
        
$stmt->execute();

        if (
$id_insert == true) {
            
//Retornar numero de celdas afectadas e ID del registro
            
$n_celdas $stmt->affected_rows;
            
$id_registro $stmt->insert_id;

            return array(
$n_celdas$id_registro);
        } else {
            
//Retornar numero de celdas afectadas
            
return $stmt->affected_rows;
        }

        
$stmt->close();

    } else {
        
mysqli_query($SQL_datos_conexion$consulta);
    }

    
mysqli_close($SQL_datos_conexion);

Gracias por tu aportacion ya iba a dar este tema por solucionado voy a probarlo :)

[EDITO]
Si funciono a las mil maravillas, muchisimas gracias me traia de cabeza esa cuestion por el tema del rendimiento y volumen de codigo. Ya me dijo pateketrueke que bind_param ya escapa los caracteres especiales por eso edite el codigo y esas variables.

Saludos amigo

PD: puedo usarlo con bind_result ??

Última edición por jonyjdv; 23/01/2016 a las 09:15

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:47.