Foros del Web » Programando para Internet » PHP »

Problema desde php con SELECT LAST_INSERT_ID()

Estas en el tema de Problema desde php con SELECT LAST_INSERT_ID() en el foro de PHP en Foros del Web. Si ingreso esto en phpmyadmin me devuelve el autonumérico sin problemas INSERT INTO albaran( cod_albaran, cod_aparato, fecha, cod_cliente ) VALUES ('', '2', '31,05,05', '3'); SELECT ...
  #1 (permalink)  
Antiguo 31/05/2005, 07:11
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 12 años, 6 meses
Puntos: 0
Problema desde php con SELECT LAST_INSERT_ID()

Si ingreso esto en phpmyadmin me devuelve el autonumérico sin problemas

INSERT INTO albaran( cod_albaran, cod_aparato, fecha, cod_cliente )
VALUES ('', '2', '31,05,05', '3');
SELECT LAST_INSERT_ID( ) ;

no obstante metiéndolo en php no me devuelve valor alguno

Código PHP:

        
//datos incluidos en tabla albarán.
        
$sql=  "INSERT INTO albaran (cod_albaran,cod_aparato,fecha,cod_cliente) VALUES (";
        
$sql.= " '', ";
        
$sql.= "'".$this->aparato->cod_aparato."',";
        
$sql.= "'"date("d,m,y") ."',";
        
$sql.= "'".$this->cliente->cod_cliente."'";
        
//el select last_insert_id devuelve el último autonumérico.
            
$sql .= "); SELECT LAST_INSERT_ID();";
        
                 
$resultado=mysql_query($sql);
        echo 
"resultado=" $resultado "<br>";
        echo 
"El álbarán ha sido guardado"
alguna idea de porqué u otra forma de hacerlo?

Última edición por elmasvital; 31/05/2005 a las 07:24
  #2 (permalink)  
Antiguo 31/05/2005, 07:20
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 13 años, 4 meses
Puntos: 101
Prueba con:
Código PHP:
        $sql=  "INSERT INTO albaran (cod_albaran,cod_aparato,fecha,cod_cliente) VALUES (";
        
$sql.= " '', ";
        
$sql.= "'".$this->aparato->cod_aparato."',";
        
$sql.= "'"date("d,m,y") ."',";
        
$sql.= "'".$this->cliente->cod_cliente."'";
        
$sql .= ")";
        
        
mysql_query($sql);
$resultadomysql_insert_id();
        echo 
"resultado="$resultado "<br>";
        echo 
"El álbarán ha sido guardado"
www.php.net/mysql_insert_id
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #3 (permalink)  
Antiguo 31/05/2005, 07:28
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 12 años, 6 meses
Puntos: 0
Así como comentas podría darse problemas de que dos personas inserten un mismo albarán casi en el mismo momento y diera un id que no fuera el nuestro no?

me parece que seria mas correcto que la propia sentencia into devolviera el valor del autoincremento...

Muchas gracias.
  #4 (permalink)  
Antiguo 31/05/2005, 10:42
Avatar de dwaks  
Fecha de Ingreso: agosto-2002
Ubicación: Panamá
Mensajes: 962
Antigüedad: 15 años, 4 meses
Puntos: 15
No abra problema alguno con lo que dices ya que la base de datos se encarga de colocar cada registroe nuevo en su cola.

Veras que te funcionara, prueba lo que dijo JAM es lo correcto.
  #5 (permalink)  
Antiguo 31/05/2005, 13:07
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
La forma que usas elmasvital (o estás intentado) .. tampoco sevirá para tu propósito si no usas transacciones (más código SQL: COMMIT .. etc y algunos ajustes más sobre el tipo de tablas que usas).

A todo esto ..las funciones de mysql: mysql_query() de PHP .. no ejecutan más que UNA sóla sentencia SQL a la vez .. es decir .. en SQL tu puedes separar varias sentencias SQL por un ; .. pero la función mysql_query() sólo va a ejecutar la primera descartando el resto ..

Si quieres usar SQL .. tendrías que hacer mínimo:
Código PHP:
//datos incluidos en tabla albarán. 
        
$sql=  "INSERT INTO albaran (cod_albaran,cod_aparato,fecha,cod_cliente) VALUES ("
        
$sql.= " '', "
        
$sql.= "'".$this->aparato->cod_aparato."',"
        
$sql.= "'". ("d,m,y") ."',"// NO GUARDES FECHAS con tu própio formato .. usa campos de FECHA!!!! tipo DATE .. luego si quieres los formateas con DATE_FORMAT a la hora de presentarlos!!!.
        
$sql.= "'".$this->cliente->cod_cliente."')"
        
$resultado=mysql_query($sql);        

        
//el select last_insert_id devuelve el último autonumérico. 
        
$sql_id .= "SELECT LAST_INSERT_ID() FROM la_tabla_que_corresponda";  // <---- OJO!
        
$resultado_id=mysql_query($sql_id);
        
$id_ultimo=mysql_result($resultado_id);
         
                  
        echo 
"resultado=" $resultado "<br>"// no puedes hacer esto .. te dirá algo como "resource ID n° tal" .. en tal caso pasalo por un "if()" pues se devuelve un true/false (boolean) ...
        
echo "El álbarán ha sido guardado con el identificador: ".$id_ultimo
Lee los comentarios del código .. sobre todo sobre el tratamiento de fechas que haces (no me parece correcto .. sobre todo para cuando quieras empezar a operar con esas fechas (sacar informes de rango de fechas .. etc ..) .. Y la sentencia SQL del ....LAST_INSERT .... le faltó el "FROM de que tabla"...

Y lo dicho .. revisa el tema de transacciones en Mysql:
www.mysql-hispano.com

Un saludo,
  #6 (permalink)  
Antiguo 31/05/2005, 13:31
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 12 años, 8 meses
Puntos: 2
Hola!

La pregunta que hiciste:

----
Así como comentas podría darse problemas de que dos personas inserten un mismo albarán casi en el mismo momento y diera un id que no fuera el nuestro no?
----

La verdad es que con ambos metodos, como tu lo intesntas y con mysql_insert_id(); se puede dar el caso, lo que necesitas es usar TRANS o en su defecto y por compatibilidad con MySql de versiones anteriores, usas:

Lock Tables
sentencias
Unlock Tables

Asi aseguras que cuando tu entras a este script nadie mas puede entrar y siempre obtienes el script correcto, para esto necesitas algo como

strSql1 = "LOCK TABLES Tabla WRITE;"
strSql2 = "insert........."
strSql3 = "select lasID"
strSql4 = "UNLOCK TABLES;"

mysql_query(strSql1)
mysql_query(strSql2)
mysql_query(strSql3)
mysql_query(strSql4)

Funciona correctamente, cuando estuve con este problema lo investigue mucho y desarrolle ese procedimiento, hasta ahorita ha sido muy seguro y sin errores, claro, TRANS viene a ser la mejor opcion y la unica 100% segura, pero esta disponible en las ultimas versiones de MySql y la mayoria de los hosting rentados por ejemplo no la soportan, entonces por eso sigo con el metodo de Lock Tables

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
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 10:02.