Foros del Web » Programando para Internet » PHP »

Problema con bind_param()

Estas en el tema de Problema con bind_param() en el foro de PHP en Foros del Web. Hola, ya he echo varias consultas en este foro para llegar hasta aquí pero sigue dándome problemas este trozo de codigo que tiene mi web ...
  #1 (permalink)  
Antiguo 22/12/2015, 13:04
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 8 meses
Puntos: 1
Problema con bind_param()

Hola, ya he echo varias consultas en este foro para llegar hasta aquí pero sigue dándome problemas este trozo de codigo que tiene mi web paralizada.

Tengo un pequeño problema con bind_param() y es que necesito que sea capaz de leer un array
Código PHP:
if ($stmt $SQL_insert->prepare($consulta)) {

//Contar numero de elementos que contiene el array
$numero_variables=count($escapar_datos);

$type='s';

$type=str_repeat($type$numero_variables);

/* bind parameters for markers */
//Asi funciona
$stmt->bind_param($type$escapar_datos[0], $escapar_datos[1]);

//PERO NECESITO ALGO ASI Y NO FUNCIONA
$stmt->bind_param($type$escapar_datos);
                   
/* execute query */
$stmt->execute();

/* close statement */
$stmt->close();


Saludos
  #2 (permalink)  
Antiguo 22/12/2015, 14:34
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con bind_param()

¿Ya has probado con la función call_user_func_array() a propósito?

Código PHP:
Ver original
  1. call_user_func_array([$stmt, 'bind_param'], $escapar_datos);
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 23/12/2015, 08:46
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: Problema con bind_param()

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Ya has probado con la función call_user_func_array() a propósito?

Código PHP:
Ver original
  1. call_user_func_array([$stmt, 'bind_param'], $escapar_datos);

Hola amigo.

Si y he partido la cabeza intentando hacerlo funcionar, creia que esa era la solucion de hecho pero parece ser que no (el problema creo que esel array). Me pone:

Warning: call_user_func_array() expects parameter 2 to be array, string given in...

Código PHP:
if ($stmt $SQL_insert->prepare($consulta)) { 
  
//Contar numero de elementos que contiene el array
  
$numero_variables=count($escapar_datos);

  
$escapar_datos=implode('","',$escapar_datos);
                
  
$type='s';

  
$type=str_repeat($type$numero_variables);

  
call_user_func_array([$stmt'bind_param'], '"'.$escapar_datos.'"');

   
/* execute query */
  
$stmt->execute();

  
/* close statement */
  
$stmt->close();

[EDITO]
He probado poniendo y quitando las comillas:
Código PHP:
  $escapar_datos=implode('","',$escapar_datos);
  
call_user_func_array([$stmt'bind_param'], '"'.$escapar_datos.'"');

  
//Sin comillas
  
$escapar_datos=implode(',',$escapar_datos);
  
call_user_func_array([$stmt'bind_param'], $escapar_datos); 
  #4 (permalink)  
Antiguo 23/12/2015, 09:32
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con bind_param()

Caray, dicha función espera un array y tu lo arruinas todo.

Código PHP:
Ver original
  1. // MAL
  2. // esta linea no es necesaria, no necesitas convertir dicho array a un string: es es tu error
  3.   $escapar_datos=implode(',',$escapar_datos);
  4.   call_user_func_array([$stmt, 'bind_param'], $escapar_datos);
  5.  
  6. // BIEN
  7. //  $escapar_datos=implode(',',$escapar_datos);
  8. call_user_func_array([$stmt, 'bind_param'], $escapar_datos);

¿Por qué no lees el manual de dicho método para que entiendas cómo usarlo?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 23/12/2015, 12:07
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: Problema con bind_param()

Cita:
Iniciado por pateketrueke Ver Mensaje
Caray, dicha función espera un array y tu lo arruinas todo.

Código PHP:
Ver original
  1. // MAL
  2. // esta linea no es necesaria, no necesitas convertir dicho array a un string: es es tu error
  3.   $escapar_datos=implode(',',$escapar_datos);
  4.   call_user_func_array([$stmt, 'bind_param'], $escapar_datos);
  5.  
  6. // BIEN
  7. //  $escapar_datos=implode(',',$escapar_datos);
  8. call_user_func_array([$stmt, 'bind_param'], $escapar_datos);

¿Por qué no lees el manual de dicho método para que entiendas cómo usarlo?
Dios que paciencia tienes conmigo

Te juro que los leo pero debido a mi bajo conocimiento cuando no me sale algo empiezo a googlear, y hay cosas que las busco y consigo solucionarlo pero otras las complico mas.

He introducido el codigo que me has pasado, el implode lo tenia cuando usaba
Código PHP:
$stmt->bind_param('s'$escapar_datos); 
y despues me dio por usarlo con el call_user_func_array porque poniendo el codigo tal cual me lo has pasado me da el siguiente error:

Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in

Código PHP:
            if ($stmt $SQL_insert->prepare($consulta)) { 
                
                
$array_final = array('ss',$escapar_datos[0],$escapar_datos[1]);

                
call_user_func_array([$stmt'bind_param'], $array_final);

                                
//Tampoco funciona con $escapar_datos que a diferencia del anterior $array_final no contiene las 'ss'

                                
call_user_func_array([$stmt'bind_param'], $escapar_datos);

                
$stmt->execute();

                
$stmt->close();
            } 
Muchisimas gracias por todo
  #6 (permalink)  
Antiguo 23/12/2015, 12:13
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con bind_param()

Una forma más dinámica de generar las secuencias "ss" es usando array_unshift() y sería mucho mejor considerar otros tipos más allá de strings únicamente:
Código PHP:
Ver original
  1. $data = ['a', 1, 'b'];
  2. $params = '';
  3.  
  4. foreach ($data as $value) {
  5.   $params .= is_numeric($value) ? 'i' : 's';
  6. }
  7.  
  8. array_unshift($data, $params);
  9.  
  10. var_dump($data); // ["sis", "a", 1, "b"]
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 23/12/2015, 12:21
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: Problema con bind_param()

Cita:
Iniciado por pateketrueke Ver Mensaje
Una forma más dinámica de generar las secuencias "ss" es usando array_unshift() y sería mucho mejor considerar otros tipos más allá de strings únicamente:
Código PHP:
Ver original
  1. $data = ['a', 1, 'b'];
  2. $params = '';
  3.  
  4. foreach ($data as $value) {
  5.   $params .= is_numeric($value) ? 'i' : 's';
  6. }
  7.  
  8. array_unshift($data, $params);
  9.  
  10. var_dump($data); // ["sis", "a", 1, "b"]
no seria peor para el rendimiento del servidor? me sigue apareciendo el mismo fallo despues de pasar el valor $data:
Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in
  #8 (permalink)  
Antiguo 23/12/2015, 12:26
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con bind_param()

¿Empeorar el rendimiento en qué sentido?

Igual sería bueno que muestres como has dejado el código para ver si algo anda mal.
__________________
Y U NO RTFM? щ(ºдºщ)

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

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Empeorar el rendimiento en qué sentido?

Igual sería bueno que muestres como has dejado el código para ver si algo anda mal.
El codigo queda asi:
Código PHP:
            if ($stmt $SQL_insert->prepare($consulta)) {
                
                
$params '';
                 
                foreach (
$escapar_datos as $value) {
                  
$params .= is_numeric($value) ? 'i' 's';
                }
                 
                
array_unshift($escapar_datos$params);
                 
                
print_r($escapar_datos);

//Hasta aqui todo bien

                
call_user_func_array([$stmt'bind_param'], $escapar_datos);

                
$stmt->execute();

                
$stmt->close();
                
            } 
Pues al tener que hacer foreach no tendria que emplear mas recursos de servidor, no se si me explico correctamente
  #10 (permalink)  
Antiguo 23/12/2015, 12:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con bind_param()

¿Podrías mostrar el resultado de "Hasta aqui todo bien" para entender lo que resulta?

Código PHP:
Ver original
  1. Pues al tener que hacer foreach no tendria que emplear mas recursos de servidor, no se si me explico correctamente

¿Y? Un foreach() no es nada costoso, no debería impactar en nada al rendimiento del servidor.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 23/12/2015, 13:27
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: Problema con bind_param()

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Podrías mostrar el resultado de "Hasta aqui todo bien" para entender lo que resulta?

Código PHP:
Ver original
  1. Pues al tener que hacer foreach no tendria que emplear mas recursos de servidor, no se si me explico correctamente

¿Y? Un foreach() no es nada costoso, no debería impactar en nada al rendimiento del servidor.
Ah vale pense que al ser un bucle pense que consumia recursos extra en el servidor.
pues al hacer print_r muestra: Array ( [0] => is [1] => 4 [2] => Titular de la nueva noticia )
  #12 (permalink)  
Antiguo 23/12/2015, 13:32
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con bind_param()

Cita:
pues al hacer print_r muestra: Array ( [0] => is [1] => 4 [2] => Titular de la nueva noticia )
Pues yo veo perfecto dicho resultado, ¿podrías entonces mostrar el mensaje de error completo?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #13 (permalink)  
Antiguo 23/12/2015, 14:02
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: Problema con bind_param()

Cita:
Iniciado por pateketrueke Ver Mensaje
Pues yo veo perfecto dicho resultado, ¿podrías entonces mostrar el mensaje de error completo?
Array ( [0] => is [1] => 4 [2] => Titular de la nueva noticia )
Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in /opt/lampp/... on line 102
La linea 102 contiene:
Código PHP:
call_user_func_array([$stmt'bind_param'], $escapar_datos); 
Te pongo a continuacion el cdigo completo
Código PHP:
             if ($stmt $SQL_insert->prepare($consulta)) { 
                
                
$params '';
                 
                foreach (
$escapar_datos as $value) {
                  
$params .= is_numeric($value) ? 'i' 's';
                }
                 
                
array_unshift($escapar_datos$params);
                 
                
print_r($escapar_datos);

                
call_user_func_array([$stmt'bind_param'], $escapar_datos);

                
$stmt->execute();

                
$stmt->close();
                
            } 
  #14 (permalink)  
Antiguo 23/12/2015, 14:07
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con bind_param()

¿Estás combinando estilos de OOP y funciones al mismo tiempo?

¿Qué es y qué hace el método $SQL_insert->prepare() eh?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #15 (permalink)  
Antiguo 23/12/2015, 14:10
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: Problema con bind_param()

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Estás combinando estilos de OOP y funciones al mismo tiempo?

¿Qué es y qué hace el método $SQL_insert->prepare() eh?
Pues si :/ de hecho el codigo completo es:
Código PHP:
function eliminar_nuevos_datos($conexion$consulta$escapar_datos){

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

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


            if (
$stmt $SQL_insert->prepare($consulta)) {
                
                
$params '';
                 
                foreach (
$escapar_datos as $value) {
                  
$params .= is_numeric($value) ? 'i' 's';
                }
                 
                
array_unshift($escapar_datos$params);
                 
                
print_r($escapar_datos);

                
call_user_func_array([$stmt'bind_param'], $escapar_datos);

                
$stmt->execute();

                
$stmt->close();
                
            }

[EDITO]
Cita:
Iniciado por pateketrueke Ver Mensaje
¿Qué es y qué hace el método $SQL_insert->prepare() eh?
Pues insertar datos en la bbdd, con $stmt->bind_param('ss', $escapar_datos[0], $escapar_datos[1]); funcionaba :/
  #16 (permalink)  
Antiguo 23/12/2015, 14:26
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con bind_param()

Estuve leyendo el manual y creo que falta pasar los datos por referencia, ¿podrías probar lo siguiente?
Código PHP:
Ver original
  1. call_user_func_array([$stmt, 'bind_param'], &$escapar_datos);
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #17 (permalink)  
Antiguo 24/12/2015, 08:11
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: Problema con bind_param()

Cita:
Iniciado por pateketrueke Ver Mensaje
Estuve leyendo el manual y creo que falta pasar los datos por referencia, ¿podrías probar lo siguiente?
Código PHP:
Ver original
  1. call_user_func_array([$stmt, 'bind_param'], &$escapar_datos);
Nada amigo no hay manera Fatal error: Call-time pass-by-reference has been removed in...

Creo que voy hacer varios if contando el numero de elementos que tiene el array y colocarle algo como:
si tiene 2
$stmt->bind_param('ss', $escapar_datos[0], $escapar_datos[1]);
si tiene 3
$stmt->bind_param('ss', $escapar_datos[0], $escapar_datos[1], $escapar_datos[2]);
  #18 (permalink)  
Antiguo 24/12/2015, 08:18
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con bind_param()

Ya veo, ¿podrías intentar una última cosa?

Código PHP:
Ver original
  1. function eliminar_nuevos_datos($conexion, $consulta, &$escapar_datos)

Agregar el & sólo en la declaración de la función, nada más.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #19 (permalink)  
Antiguo 24/12/2015, 08:34
 
Fecha de Ingreso: julio-2014
Mensajes: 115
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: Problema con bind_param()

Cita:
Iniciado por pateketrueke Ver Mensaje
Ya veo, ¿podrías intentar una última cosa?

Código PHP:
Ver original
  1. function eliminar_nuevos_datos($conexion, $consulta, &$escapar_datos)

Agregar el & sólo en la declaración de la función, nada más.
Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in

Pues nada amigo, no hay manera es un tanto frustrante

Etiquetas: sql, variable
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 04:42.