Foros del Web » Programando para Internet » PHP »

Problema al hacer un insert doble

Estas en el tema de Problema al hacer un insert doble en el foro de PHP en Foros del Web. Hola a todos tengo un php donde hago un insert doble con lo cual no tengo problemas ... Código PHP: $insertSQL1  =  sprintf ( "INSERT INTO ...(campos....) VALUES (%s,%s)" ...
  #1 (permalink)  
Antiguo 10/09/2013, 13:01
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 12 años, 9 meses
Puntos: 12
Problema al hacer un insert doble

Hola a todos tengo un php donde hago un insert doble con lo cual no tengo problemas ...

Código PHP:
$insertSQL1 sprintf("INSERT INTO ...(campos....) VALUES (%s,%s)",
                    
GetSQLValueString($_POST['campo1'], "text"),
                    
GetSQLValueString($_POST['campo2'], "text"));

$insertSQL2sprintf("INSERT INTO ....) VALUES (%s,%s)",
                    
GetSQLValueString($_POST['campo1'], "text"),
                    
GetSQLValueString($_POST['campo2'], "text"));
mysql_select_db($database_connection$connection); 
 
$Result1 mysql_query($insertSQL1$connection) or die(mysql_error()); }}
 
$Result1 mysql_query($insertSQL2$connection) or die(mysql_error()); 
Donde tengo una duda es lo siguiente los insert se realizan al mismo tiempo (presionar el botón) .... pero existe alguna forma para q primero se realice la consulta 1.... y después pueda tomar el id que se asigno a ese registro ... y tomar ese valor para realizar la consulta dos.... ejemplo

Consulta uno...
Usuario
id=1 campo1= yyyy campo2=xxxx

en la consulta dos necesito tomar el id asignado en este caso el numero 1
que puedo hacer????
  #2 (permalink)  
Antiguo 10/09/2013, 13:07
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Problema al hacer un insert doble

Puedes mirar esta función

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #3 (permalink)  
Antiguo 10/09/2013, 13:14
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Problema al hacer un insert doble

Se supone que si realizas una inserción, y tienes el campo ID de manera AUTOINCREMENT debería aumentarte automáticamente los valores... por ende, en la primera inserción tendrías el ID=1 ... en la segunda el ID=2 y así sucesivamente....

Por ende, lo que debes hacer es tomar el último ID inserto... lo puedes hacer de varias formas, pero se me ocurre que la forma mas sencilla es con MAX de sql..

por ejemplo:

Código PHP:
Ver original
  1. $insert = mysql_query("INSERT INTO tabla (campo) VALUES (valor)");

luego buscamos el último ID insertado

Código PHP:
Ver original
  1. $rs = mysql_query("SELECT MAX(id_tabla) AS id FROM tabla");
  2. $row = mysql_fetch_row($rs)

y asignamos un valor de variable al ID
Código PHP:
Ver original
  1. $id = trim($row[0]);

y vuelves a hacer el insert siguiente

Código PHP:
Ver original
  1. $insert2 = mysql_query("INSERT INTO tabla (id, campo) VALUES ( $id, valor)");

espero se entienda el ejemplo
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #4 (permalink)  
Antiguo 10/09/2013, 13:16
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 8 meses
Puntos: 194
Respuesta: Problema al hacer un insert doble

Primero que nada, desaconsejo el uso de la libreria mysql, tal como el manual lo indica, se encuentra obsoleta, y se recomienda el uso de MySQLi.

Usar la función que recomiendan en el la respuesta anterior, no es aconsejable, lo mismo con el "SELECT MAX(id_tabla)", no hay ninguna seguridad que en el mismo momento que insertaste, no exista otro usuario haciendo lo mismo y te entregue ese id...

Deberías probar con PDO o ADODB y realizarlo con una transacción, se que tal vez eleve la complejidad, pero así puedes estar tranquila que funcionara sin problemas
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #5 (permalink)  
Antiguo 10/09/2013, 13:20
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Problema al hacer un insert doble

Deberías aportar algo referente al problema, la librería MYSQLi o PDO, o POSTGRESql da igual, si no sabes cómo resolver el problema de manera lógica... la sintaxis SQL no se cambia porque PHP decide simplificar o modernizar sus librerías... la gente confunde librería de PHP con lenguaje SQL... no confundas a los posteadores con tus aclaraciones.
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #6 (permalink)  
Antiguo 10/09/2013, 13:42
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 8 meses
Puntos: 194
Respuesta: Problema al hacer un insert doble

Cita:
Iniciado por loncho_rojas Ver Mensaje
Deberías aportar algo referente al problema, la librería MYSQLi o PDO, o POSTGRESql da igual, si no sabes cómo resolver el problema de manera lógica... la sintaxis SQL no se cambia porque PHP decide simplificar o modernizar sus librerías... la gente confunde librería de PHP con lenguaje SQL... no confundas a los posteadores con tus aclaraciones.
Disculpa loncho_rojas, pero estas comparando peras con manzanas.

PDO define una interface para poder abstraerte de la Base que estés utilizando ( Contiene los drivers necesarios para la DB que desees), mientras que Mysql o Mysqli son meras librerias de conexión, nunca hable de lenguajes.

Te invito a que nos expliques como resolver de "manera lógica" una transaccion con la libreria Mysql, por como lo expones seguramente sera mucho mas optimo y facil que utilizar begind y end transaction de PDO o Adodb...

La solución que planteas rescatando el max(id) es rapida, pero arriesgada y poco confiable, puedes tener problemas de concurrencia y nunca enterarte.
Por si no se entiende, cuando haces max(id) no hay nada que te este atando al insert anterior realmente, y no puedes estar seguro si el ultimo es realmente el que quieres, o es un insert provocado por otro usuario, pudiendo otorgarle ese id a 2 usuario al mismo tiempo. De ahí surja la necesidad de "atar" las consultas con una transacción, y es la forma correcta de hacerlo.

Es momento de dar consejos y soluciones de calidad, y parar de contestar respuestas pobres, que no ayudan a mejorar la calidad del código en general, ni aportan mucho a la comunidad. Reitero, se que lo que propongo no es lo mas sencillo, pero es una de las maneras Correctas de hacerlo.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives

Última edición por h2swider; 10/09/2013 a las 13:51
  #7 (permalink)  
Antiguo 10/09/2013, 13:55
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Problema al hacer un insert doble

Cita:
Iniciado por h2swider Ver Mensaje
Reitero, se que lo que propongo no es lo mas sencillo, pero es una de las maneras Correctas de hacerlo.
No aportas nada igual... podés criticar o no los métodos, pero no veo que aportes nada al problema que surge... mucha demagogia... si vas a aportar algo, por lo menos que baje a tierra... no te parece... tenés alguna función para aportar, algún código, algún hilo, algo??? Será bienvenida
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #8 (permalink)  
Antiguo 10/09/2013, 14:09
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 8 meses
Puntos: 194
Respuesta: Problema al hacer un insert doble

La verdad que prefiero no aportar código que aconsejar malas practicas, como el uso de librerías obsoletas o inserts sucesivos sin control.

Igualmente aqui tienes tu ejemplo, a ver si puedes analizarlo y aceptar algunos buenos consejos.

Código PHP:

//previo include de ADODB y realizada la conexion en $conn
$sql "insert into tabla (id)";
$sql2 "insert into tabla2 (:id)";

$conn->BeginTrans();
$ok $conn->Execute($sql);
$id $conn->Insert_ID( )
if (
$ok$ok $conn->Execute($sql2$id);
if (!
$ok$conn->RollbackTrans();
else 
$conn->CommitTrans(); 
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives

Última edición por h2swider; 10/09/2013 a las 14:27
  #9 (permalink)  
Antiguo 10/09/2013, 14:43
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Problema al hacer un insert doble

Genial.. cosa así, si aportan, pero dime.. o muestrame donde esta en el manual de PHP que la librería Mysql ESTA DEPRECADA OFICIALMENTE

Recien hasta una version de PHP 5.5.x se aplicaría.. aún funcionan las librerías... aunque es un alivio que se mejoren con otras más eficientes...
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...

Etiquetas: doble, insert, mysql, registro, select, sql
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 13:48.