Foros del Web » Programando para Internet » PHP »

Problema con mysqli y BIGINT mysql

Estas en el tema de Problema con mysqli y BIGINT mysql en el foro de PHP en Foros del Web. Hola como están ? Bueno tengo el siguiente problema: Estoy creando una aplicación en facebook y como los id de los usuarios son tan largos, ...
  #1 (permalink)  
Antiguo 13/12/2012, 16:34
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Problema con mysqli y BIGINT mysql

Hola como están ?
Bueno tengo el siguiente problema:

Estoy creando una aplicación en facebook y como los id de los usuarios son tan largos, obté por que la columna id de mi tabla fuera de tipo BIGINT. en vez de int.

Me di cuenta que al guardar mi id "100002189287259" en la base de datos, cambiaba su valor a "-18...".

Cambiando por ahi y por alla.. me di cuenta que el problema surge al momento ejecutar la funcion mysqli->bind_param();

Facebook te da el id de el usuario en cadena, por lo tanto al momento de obtenerlo
lo convierto a entero para luego ser insertado como un int en la base de datos..
de esta forma:

Código PHP:
                $cod = (int) $data_user['uid'];
        
$nombre $data_user['first_name'];
        
$apellido $data_user['last_name'];
        
$email $data_user['email'];
        
//SQL 

        
$sql 'insert into users (cod,nombre,apellido,email) ';
        
$sql .='values (?,?,?,?)';
        
        
//PREPARE
        
$stmt=$OBJmysqli->prepare($sql);
        
$stmt->bind_param('isss',$cod,$nombre,$apellido,$email);
        if(
$stmt->execute())
        {
            return 
true;
        }else{
            return 
false;
        } 
Se supone que esa es la forma correcta indicar cuales son los tipos de datos..
pero como los dije anteriormente.. el id 100002189287259 queda guardado como "-18..(etc)"

Metiendo mano.. cambie la forma la cual le indicaba el tipo de dato a la funcion bind_param y la deje
Código PHP:
$stmt->bind_param('ssss',$cod,$nombre,$apellido,$email); 
Indicandole que la variable era una cadena.. siendo que es de tipo entero.. de esta forma el id se guarda correctamente

Alguien me podria explicar porque paso eso ? .. Muchas gracias.
  #2 (permalink)  
Antiguo 13/12/2012, 17:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con mysqli y BIGINT mysql

Cita:
Alguien me podria explicar porque paso eso ?
¿Una respuesta académica y de programador?
Porque no conoces los sistemas de representación binarios, y definiste mal el tipo de dato.
Lo que aparentemente no conoces es que no existe un sólo tipo de representación de números, sino al menos dos: Con signo y sin signo.
El tema pasa porque los números no se almacenan como cifras (de hecho, no existen ni las cifras ni las letras para las computadoras), sino como binarios de un ancho de 8 a 64 bits (hablando genericamente, esto es más complejo en realidad), y por esa misma razón, para representar valores positivos y negativos se los codifica para que la mitad del rango de representaciones sean negativos y la otra positivos (más el cero). Eso hace que un BIGINT con signo tenga un rango de representación de -9223372036854775808 al 9223372036854775807 si tiene signo, y de 0 a 18446744073709551615 si no tiene signo.
Pero eso también hace que un número no puede representar sin signo ningún numero superior a 18.446.744.073.709.551.615, por lo que cualquier intento de superar esa cantidad de dígitos desborda la representación.
Ahora bien, si lo definiste como BIGINT sin el UNSIGNED, cuando llega a 9223372036854775807 , al sumar uno más se produce un desborde y el numero positivo pasa a ser negativo.
Eso en programación es un error gravísimo, que puede traer resultados catastróficos (misiles estratosféricos se han destruido por errores así).

¿Cómo se resuelve eso?
De muchas formas, pero una de ellas es no usando números tan largos si no es estrictamente necesario.
Mi pregunta sería: ¿Por qué usas un ID de esa longitud y cómo es posible que necesites identificadores imposibles de alcanzar en la naturaleza?
Te lo voy a plantear de esta forma:
Si cada persona de este planeta se registrara en una base de datos usando BIGINT, y cada registro creara un ID, se necesitarían más de 41 años para agotar la numeración.
¿Me puedes explicar para qué necesitas algo mayor?
¿De dónde sale ese numero y qué es lo que lo produce?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 13/12/2012 a las 17:32
  #3 (permalink)  
Antiguo 13/12/2012, 18:34
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Problema con mysqli y BIGINT mysql

Hola gnzsoloyo!.. primero que nada gracias por tu respuesta...

Te contesto tu pregunta:

El numero es el uid ( identificador ) que entrega la API de facebook para cada usuario.

En mi caso.. mi uid de facebook es "100002189287259"..

Ahora .. por lo que entendí según tu respuesta .. lo que entrega facebook no es un identificar común .. (auto_incrementable) por cada registro..

Como tu me dijiste .. si el numero fuera mayor a un digito de 20 (BIGINT) se desbordaría y entregaría un resultado negativo.. como es lo que me esta pasando a mi, pero el identificador que estoy guardado solo tiene 15 digitos.

.. sigo sin entender el motivo por el cual cambia el identificador...
..muchas gracias de todas formas por tu ayuda !
  #4 (permalink)  
Antiguo 13/12/2012, 19:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con mysqli y BIGINT mysql

Cita:
Como tu me dijiste .. si el numero fuera mayor a un digito de 20 (BIGINT) se desbordaría y entregaría un resultado negativo.. como es lo que me esta pasando a mi, pero el identificador que estoy guardado solo tiene 15 digitos.
Es muy probable que el problema no se produzca en la base, sino en el manejo de la programación si en algún momento la variable de PHP se maneja como entero, ya que eso podría corresponderse con el INT y no con el BIGINT.
Sería bueno darle una revisión al tema de las conversiones de cadenas de texto a numero en PHP.
A mi entender el problema puede estar allí.
Especialmente porque según el manual eso está manejado por la constante PHP_INT_MAX, de la cual se dice:
Cita:
PHP_INT_MAX (integer) El valor integer más grande soportado en esta compilación de PHP. Normalmente int(2147483647). Disponible desde PHP 4.4.0 y PHP 5.0.5
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 13/12/2012, 21:28
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 8 meses
Puntos: 105
Respuesta: Problema con mysqli y BIGINT mysql

Holas,

No seria mejor usar un CHAR o VARCHAR ?.

Saludos,
__________________
.: Gildus :.
  #6 (permalink)  
Antiguo 15/12/2012, 06:55
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Problema con mysqli y BIGINT mysql

Gracias a los dos.

Intente pasando la variable directamente como int.. y no transformandolo de string a int.. y el problema seguia igual.. entonces el problema no es en el cambio de tipo de varfiable.

La unica forma en la cual me funciono normalmente es indicando a la funcion bind_param de mysqli que la variable que esta entrando no es int.. sino una cadena.

normalmente seria :
Código PHP:
$mysqli->bind_param('i',$id); 
pero me funciona correctamente
Código PHP:
$mysqli->bind_param('s',$id); 
Pero alfinal.. obte por cambiar el tipo de columna en la base de datos de BIGINT a VARCHAR.

Gracias por la ayuda caballeros.
  #7 (permalink)  
Antiguo 15/12/2012, 08:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con mysqli y BIGINT mysql

¿Te quedó claro que el problema se originaría porque los Integer en PHP no tienen el tamaño necesario para representar el BIGINT, y menos el INT UNSIGNED?
El tema es que ese uid que manda Facebook puede ser almacenado en MySQL, pero no puedes manejarlo con PHP, por lo que en realidad no es necesario cambiar la tabla, sino el modo en que lo tomas en PHP.
¿Te diste cuenta de eso?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: mysql, mysqli, sql, tabla, variables, usuarios
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 11:30.