Foros del Web » Programando para Internet » PHP »

duda en transaccion

Estas en el tema de duda en transaccion en el foro de PHP en Foros del Web. Hola a todos. Os comento un problema que tengo. El foco del problema está en la instrucción $id=mysql_insert_id(); Hago esto porque el campo id de ...
  #1 (permalink)  
Antiguo 17/09/2008, 05:53
 
Fecha de Ingreso: septiembre-2008
Mensajes: 36
Antigüedad: 15 años, 7 meses
Puntos: 0
duda en transaccion

Hola a todos.
Os comento un problema que tengo.
El foco del problema está en la instrucción $id=mysql_insert_id(); Hago esto porque el campo id de la tabla usuarios es autoincremental.
En la primera consulta me realiza la consulta satisfactoriamente.

En la segunda consulta quiero añadir el valor de $id a la tabla log (añadirlo al campo usuario, el cual no es incremental). Pero al poner la variable $id me da error, porque llama al rollback.
Tras hacer unas pruebas el error esta justo ahi (no es ni problema de conexión ni otra causa).

Haber si alguien me puede echar una mano, porque no entiendo que en la primera consulta tome el valor de $id bien y en la segunda no (porque llama al rollback).


Código PHP:
mysql_query('BEGIN');
    
$id=mysql_insert_id();

$sql1="INSERT INTO usuarios (id, alias, clave, privilegios, mail, dni, valido, aleatorio) VALUES (".$id.",'".$usuario."','".md5($clave)."', 1, '".$mail."', '".$dni."', 0, ".rand().")";
mysql_query($sql1,$conexion) or die(mysql_query('rollback'));
    
$sql2"INSERT INTO log (usuario, evento, ip) VALUES (".$id.",1, '".$_SERVER['REMOTE_ADDR']."')";
mysql_query($sql2,$conexion) or die(mysql_query('rollback'));
    
mysql_query('COMMIT');  
    
header('Location: form.php'); 
Saludos.
  #2 (permalink)  
Antiguo 17/09/2008, 08:15
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 9 meses
Puntos: 70
Respuesta: duda en transaccion

Hola WadE87, cómo vas??

Creo que tu problema es por la ubicación como tal del mysql_insert_id.... Esta instrucción te trae el último id_ingresado y en la ubucación que lo tienes pues no te trae nada...

Prueba así;
Código PHP:
mysql_query('BEGIN');
$sql1="INSERT INTO usuarios (id, alias, clave, privilegios, mail, dni, valido, aleatorio) VALUES (".$id.",'".$usuario."','".md5($clave)."', 1, '".$mail."', '".$dni."', 0, ".rand().")"
mysql_query($sql1,$conexion) or die(mysql_query('rollback'));
$id=mysql_insert_id();
.
.

Espero te sirva...

Saludos
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #3 (permalink)  
Antiguo 17/09/2008, 08:17
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
Respuesta: duda en transaccion

Hola WadE87,

Prueba así:
Código php:
Ver original
  1. mysql_query('BEGIN');
  2.    
  3. $sql1="INSERT INTO usuarios (id, alias, clave, privilegios, mail, dni, valido, aleatorio) VALUES (".$id.",'".$usuario."','".md5($clave)."', 1, '".$mail."', '".$dni."', 0, ".rand().")";
  4. mysql_query($sql1,$conexion) or die(mysql_query('rollback'));
  5.  
  6.    
  7. $sql2= "INSERT INTO log (usuario, evento, ip) VALUES (".$id.",1, '".$_SERVER['REMOTE_ADDR']."')";
  8. mysql_query($sql2,$conexion) or die(mysql_query('rollback'));
  9.    
  10. mysql_query('COMMIT');  
  11.    
  12. header('Location: form.php');

Saludos.
  #4 (permalink)  
Antiguo 17/09/2008, 08:24
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 9 meses
Puntos: 70
Respuesta: duda en transaccion

jejejeje hemos posteado lo mismo GatorV....
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #5 (permalink)  
Antiguo 17/09/2008, 08:26
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
Respuesta: duda en transaccion

jeje, si, espero ese sea su problema..

Saludos.
  #6 (permalink)  
Antiguo 17/09/2008, 11:49
 
Fecha de Ingreso: septiembre-2008
Mensajes: 36
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: duda en transaccion

Hola Carlx y GatorV.
Creo que no me he explicado bien.
En realidad si que ha habido un INSERT antes de realizar el del código (he introducido yo a través de phpmyadmin un usuario).

Al ejecutar sql1 el valor de $id es el correcto (pongamos por ejemplo 2).

El problema viene al ejecutar sql2 ya que el valor $id que me introduce en la base de datos es otro (por ejemplo 0) y ésto es lo que no entiendo (yo quiero que sea el mismo valor que se ha introducido en la tabla usuarios).
Es decir si en la sentencia $id=mysql_insert_id(); me almacena el valor 2 (por ejemplo), ¿por qué cuando ejecuto sql2 el valor de $id que me introduce en la base de datos es otro?.

La tabla usuarios tiene un campo id (identificador) entre otros y la tabla log (se almacenan las incidencias tales como el registro de un usuario) tiene un campo id, el cual se refiere al identificador de usuario. Así que el valor de $id tiene que ser el mismo para saber a que usuario se refiere una determinada incidencia.

Espero que me hayais entendido. Os agradezco que perdáis vuestro tiempo en intentar ayudarme.

Saludos.
  #7 (permalink)  
Antiguo 17/09/2008, 13:31
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 9 meses
Puntos: 70
Respuesta: duda en transaccion

Hola WadE87...

Al menos intentaste lo que te colocamos?? Sigue sin funcionar?
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #8 (permalink)  
Antiguo 18/09/2008, 03:03
 
Fecha de Ingreso: septiembre-2008
Mensajes: 36
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: duda en transaccion

Hola de nuevo.
Carxl, lo he conseguido solucionar ,y más o menos era como me dijisteis tú y GatorV. Salvo una cosa:

Código PHP:
mysql_query('BEGIN'); 
     
$id=mysql_insert_id();  //faltaba poner esta instrucción porque si no el valor $id de sql1 no existe.

$sql1="INSERT INTO usuarios (id, alias, clave, privilegios, mail, dni, valido, aleatorio) VALUES (".$id.",'".$usuario."','".md5($clave)."', 1, '".$mail."', '".$dni."', 0, ".rand().")"
mysql_query($sql1,$conexion) or die(mysql_query('rollback')); 
     
$id=mysql_insert_id(); 

$sql2"INSERT INTO log (usuario, evento, ip) VALUES (".$id.",1, '".$_SERVER['REMOTE_ADDR']."')"
mysql_query($sql2,$conexion) or die(mysql_query('rollback')); 
     
mysql_query('COMMIT'); 
     
header('Location: form.php'); 
Pero tras solucionarlo y tras leer la documentación de mysql_insert_id(), no me ha quedado claro.

El trozo de código anterior es para introducir un usuario nuevo y registrarlo en log.
cuando se ejecuta la primera instrucción $id=mysql_insert_id(); el valor de id que toma es el siguiente al identificador del último usuario añadido en la tabla usuarios.
Pero al ejecutar $id=mysql_insert_id(); por segunda vez, me devuelve el mismo identificador que en la primera sentencia $id=mysql_insert_id();
(por lógica tendría que devolver el siguiente).
Por ésto, creo que hay algo que se me escapa y hace que no lo entienda bien.
Haber si alguien me puede aclararlo.
Saludos a todos.
  #9 (permalink)  
Antiguo 18/09/2008, 07:24
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 9 meses
Puntos: 70
Respuesta: duda en transaccion

Hola WadE87... cómo vas??

Pues mira... es algo propio de las transacciones en mysql... sabes bien que una transacción no es finalizada salvo que tengo el "commit" (confirmación). Es lógico, haces lo siguiente:
Código PHP:
$sql1="INSERT INTO usuarios (id, alias, clave, privilegios, mail, dni, valido, aleatorio) VALUES (".$id.",'".$usuario."','".md5($clave)."', 1, '".$mail."', '".$dni."', 0, ".rand().")";  
mysql_query($sql1,$conexion) or die(mysql_query('rollback'));
$id=mysql_insert_id(); 
Aún no haz confimado la transacción!!! Entonces pues el id que te trae es último confirmado. Me entiendes?? Si haces un commit después de hacer el insert... tenlo por seguro que te arroja el id respectivo.
Código PHP:
$sql1="INSERT INTO usuarios (id, alias, clave, privilegios, mail, dni, valido, aleatorio) VALUES (".$id.",'".$usuario."','".md5($clave)."', 1, '".$mail."', '".$dni."', 0, ".rand().")";  
mysql_query($sql1,$conexion) or die(mysql_query('rollback'));
mysql_query("COMMIT",$conexion);
$id=mysql_insert_id(); 
Es que llamas el mysql_insert_id antes de confirmar Es algo a tener en cuenta ocn las transacciones...

Saludos
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com

Última edición por Carxl; 18/09/2008 a las 07:29
  #10 (permalink)  
Antiguo 19/09/2008, 02:19
 
Fecha de Ingreso: septiembre-2008
Mensajes: 36
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: duda en transaccion

Hola Carxl.
En cuanto he leído tu explicación me he dado cuenta. No se como no he caido antes (y eso que el tema de transacciones lo he estudiado hace muy poco tiempo)
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 09:44.