Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Problema con el método InsertID() de Adodb

Estas en el tema de Problema con el método InsertID() de Adodb en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, me he encontrado con un error un poco extraño a ver si os ha pasado a alguien. Hago un insert a una ...
  #1 (permalink)  
Antiguo 15/06/2006, 12:05
 
Fecha de Ingreso: mayo-2006
Ubicación: Zaragoza
Mensajes: 54
Antigüedad: 18 años
Puntos: 0
Problema con el método InsertID() de Adodb

Hola a todos, me he encontrado con un error un poco extraño a ver si os ha pasado a alguien.

Hago un insert a una tabla, con un campo(identificador) INT sin signo y con "auto_increment", por lo que utilizo Insert_ID() para recuperar el último id insertado y aquí tengo el problema, este método me devuelve un número negativo, miro en la tabla y veo que se inserta con números del tipo 2231221342.
Supongo que el problema vendrá del tamaño del número, ya que nunca me había pasado.
Por cierto, utilizo MySQL.

Saludos.
  #2 (permalink)  
Antiguo 15/06/2006, 13:02
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si expusieras el código que usas sería lo ideal ...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 16/06/2006, 00:32
 
Fecha de Ingreso: mayo-2006
Ubicación: Zaragoza
Mensajes: 54
Antigüedad: 18 años
Puntos: 0
//db es un objeto ADONewConnection

$this->db->Execute(INSERT INTO articulos(nombre, compania, cod, orden, fecha_pub, fecha_cad, fecha_alta, fecha_mod) VALUES ('adsasd', '', '', '', '2006/06/16', '2006/06/16', '2006-06-16', '2006-06-16'));
//Inserta correctamente, no devulve ningun error
if (!$this->db->errorNo()) {
$id = $this->db->Insert_ID();//devuelve -2063745950
.....................
}
//En Mysql el idarticulo insertado es 2231221346
  #4 (permalink)  
Antiguo 16/06/2006, 06:02
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Y .. usando algún administrador de Mysql (phpMyadmin o cualquier otro) .. en que indice va el ID de esa tabla (o cual dice que será el próximo a generar)? ...

(desconozco como funciona el método "Insert_ID()" pero supongo que para mysql ejecutará la función mysql_insert_id() o su equivalente en SQL ...)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 19/06/2006, 09:42
 
Fecha de Ingreso: mayo-2006
Ubicación: Zaragoza
Mensajes: 54
Antigüedad: 18 años
Puntos: 0
Hola Cluster,

Con el phpMyadmin, no hay ningún problema, me deja seguir insertando en la tabla y me genera el siguiente (2231221347).
Supongo que será algún problema de ésta librería, pero en su documentación no encuentro nada que se refiera a limitaciones de este método.

Mirando la documentación de Mysql, los límites de un INT:

INT[(M)] [UNSIGNED] [ZEROFILL]

A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295.


Por lo que supongo que podría ser un problema de la librería que sólo llegue al límite con signo, ya que hice la carga inicial de datos con sql "a pelo" y no con Adodb.

Saludos y muchas gracias por tu interés.
  #6 (permalink)  
Antiguo 19/06/2006, 11:34
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
Cita:
$this->db->Execute(INSERT INTO articulos(nombre, compania, cod, orden, fecha_pub, fecha_cad, fecha_alta, fecha_mod) VALUES ('adsasd', '', '', '', '2006/06/16', '2006/06/16', '2006-06-16', '2006-06-16'));
Pon el autonumerico en el insert:
Código PHP:
$this->db->Execute(INSERT INTO articulos(codigo,nombrecompaniacodordenfecha_pubfecha_cadfecha_altafecha_modVALUES ('adsasd''''''''2006/06/16''2006/06/16''2006-06-16''2006-06-16')); 
Ahora el problema que tienes es que el autonumérico se te ha disparado tendras que resetearlo lo puedes hacer desde phpmyadmin si vacias la tabla ojo!!
vaciar != borrar.

Otra forma de insertar en adodb que te puede ayudar es la funcion GetInsertSQL, desde la versión 4.62 se ha hecho más fácil te pongo un ejemplo utilizando tu codigo:
Código PHP:
$valores = array();// representara un registro de la base de datos

$valores['compania']  = "adsasd";
$valores['cod']       = '';
$valores['orden']     = '';
//... aqui los campos que faltan soy muy vago
//...
$valores['fecha_mod'] = '2006-06-16';
//parametros de la funcion GetInsertSQL (nombre_tabla,registro_de_valores)
$insertSQL $this->db->GetInsertSQL('articulos'$valores);
$this->db->Execute($insertSQL);
$id $this->db->Insert_ID();// funciona correctamente !!! 
  #7 (permalink)  
Antiguo 20/06/2006, 05:36
 
Fecha de Ingreso: mayo-2006
Ubicación: Zaragoza
Mensajes: 54
Antigüedad: 18 años
Puntos: 0
Muchas gracias casuis, pero prefiero solucionar este problema.

Creo haber encontrado el problema, como uso php4 utilizo el driver "mysql" que llama por debajo de Insert_ID a mysql_insert_id() que devuelve un integer, y el problema está en que en php los integer representan "solo" hasta 32 bits sin signo(de -2147483648 a 2147483647).

Por lo que he pensado una posible solución:
if($id<0){
//simula un integer sin signo de 0 a 4294967295(realmente es un float)
$sinsigno=4294967296;
$id=$sinsigno+$id;
}
¿Qué os parece esta solución?

Saludos y muchas gracias.
  #8 (permalink)  
Antiguo 20/06/2006, 08:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Porque no haces lo que te dice en la documentacion?

$elId = sprintf( "%u", mysql_insert_id() );

asi ya obtines tu ID de cadena larga
  #9 (permalink)  
Antiguo 20/06/2006, 09:07
 
Fecha de Ingreso: mayo-2006
Ubicación: Zaragoza
Mensajes: 54
Antigüedad: 18 años
Puntos: 0
Hola gatorV, muchas gracias, suponía que algo tenía que haber para hacerlo.
Había estado buscando en la documentación pero no lo ví.

Funciona perfectamente, muchas gracias de nuevo por vuestra ayuda.
saludos!
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:07.