Foros del Web » Programando para Internet » PHP »

Ayuda mysql_insert_id()!!!!

Estas en el tema de Ayuda mysql_insert_id()!!!! en el foro de PHP en Foros del Web. Buenas. Tengo problemas con el uso de mysql_insert_id();. Planteo mi problema a ver si alguien puede ayudarme. Inserto mediante un formulario php un pedido en ...
  #1 (permalink)  
Antiguo 09/03/2009, 05:20
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Ayuda mysql_insert_id()!!!!

Buenas. Tengo problemas con el uso de mysql_insert_id();. Planteo mi problema a ver si alguien puede ayudarme.

Inserto mediante un formulario php un pedido en la tabla pedidos y referencias en la tabla referencias de la siguiente manera:
1)Inserto el pedido, donde npedido es AUTO_INCREMENTED y PRIMARY KEY.
2)Inserto la referencia, donde npedido es FOREIGN KEY.

Mi problema es que no consigo insertar npedido en la tabla referencias.
Os pongo las dos funciones de registro a ver si me dais una solución.

function insertar_pedido($nor,$nmec,$nrec,$nconcesion){
//Declaramos las variables

//Conectamos a mysql. Si falla muestra mensaje


//Seleccionamos la base de datos. Si falla muestra mensaje

//Ejecuta la sentencia sql de insercion
@mysql_query("INSERT INTO pedido (nor,nmec,nrec,nconcesion) VALUES ('$nor','$nmec','$nrec','$nconcesion')");
$npedido=mysql_insert_id();

if (mysql_error($conexion)==""){
echo "<div>Pedido $npedido registrado.</div>";
}
else {
echo "<div>Ha habido un error en la introducción de datos.</div>";
}
}
################################################## ##
function insertar_referencia($npedido,$referencia,$cantidad ,$descripcion,$epedido,$tpedido){
//Declaramos las variables

//Conectamos a mysql. Si falla muestra mensaje

//Seleccionamos la base de datos. Si falla muestra mensaje

//Ejecuta la sentencia sql de insercion
@mysql_query("INSERT INTO referencias (npedido,referencia,cantidad,descripcion,epedido,t pedido) VALUES ('$npedido','$referencia','$cantidad','$descripcio n'),('$epedido'),('$tpedido')");
if (mysql_error($conexion)==""){
echo "<div>Referencia registrada. Ahora puedes insertar otra referencia.</div>\n";
}
else {
echo "<div>Ha habido un error en la introducción de datos.</div>\n";
}
}
  #2 (permalink)  
Antiguo 09/03/2009, 08:36
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Ayuda mysql_insert_id()!!!!

Holas aliza

Creo que no consigues insertar el registro en la segunda tabla porque como haces las inserciones dentro de funciones, los valores nunca pasan de una función a otra, pues son locales.

Se me ocurren dos formas de solucionar eso:
1. Que hagas que la variable $npedido sea global, ó
2. Que tu función insertar_pedido() retorne el ID del pedido, de modo que antes de ejecutar la segunda función, recojas el valor en una variable a usar en esta última función.
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #3 (permalink)  
Antiguo 09/03/2009, 08:45
 
Fecha de Ingreso: noviembre-2008
Mensajes: 44
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: Ayuda mysql_insert_id()!!!!

Probablemente sea lo que dice quinqui, de todas formas para asegurarte quita el @ de delante de las mysql_query y mira que warnig/error se muestra.
saludos
  #4 (permalink)  
Antiguo 09/03/2009, 09:43
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Ayuda mysql_insert_id()!!!!

Gracias a ambos por la dedicación. Suponía que el problema era porque la variable es local.

He declarado la variable al principio del código php y la he inicializado: $npedido='';.

Luego en la primera función la he llamado: global $npedido; y le he asignado un valor: $npedido=mysql_insert_id();

Por último, en la segunda función la he vuelto a llamar antes de la sentencia SQL para que la introduzca: global $npedido;

Y sigue sin introducir. Tengo puesto un mensaje de alerta para cuando no introduce los valores que es el de: echo "<div>Ha habido un error en la introducción de datos.</div>\n"; que es el que me lanza, por eso se que es problema de $npedido, porque el resto del código está perfecto.
  #5 (permalink)  
Antiguo 09/03/2009, 09:57
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Ayuda mysql_insert_id()!!!!

La forma en que debieras usar la variable global creo que sería:

Código PHP:
function insertar_pedido($nor$nmec$nrec$nconcesion)
{
  global 
$npedido;
  
//contenido de funcion
}

function 
insertar_referencia($npedido$referencia$cantidad$descripcion$epedido$tpedido)
{
  
//Contenido de funcion 2
}

$npedido 0;

insertar_pedido(1234);

if (
$npedido 0)
{
  
insertar_referencia($npedido5100"hola""""");

Las variables globales usadas en funciones deben ser declaradas después de las funciones que las usan, creo. No sé si la habrás usado así tú, pero lo digo para descartar errores :)
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #6 (permalink)  
Antiguo 09/03/2009, 10:31
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Ayuda mysql_insert_id()!!!!

Sigo sin poder, te pongo el código de mis funciones y cuando las llamo.
##################################################
function insertar_pedido($nor,$nmec,$nrec,$nconcesion){
//Declaramos las variables
$host='192.168.1.214';
$usr='usuario';
$pass='usuario';
$db='recambios';

//Conectamos a mysql. Si falla muestra mensaje
$conexion=mysql_connect($host,$usr,$pass)
or die("No se pudo conectar, por favor, contacta con el departamento de Informatica." );

//Seleccionamos la base de datos. Si falla muestra mensaje
mysql_select_db($db,$conexion)
or die("No se pudo seleccionar la Base de Datos, por favor, contacta con el departamento de Informatica.");

//Ejecuta la sentencia sql de insercion
@mysql_query("INSERT INTO pedido (nor,nmec,nrec,nconcesion) VALUES ('$nor','$nmec','$nrec','$nconcesion')");
global $npedido;//aqui le dices php que busque la variable globlar $npedido
$npedido=mysql_insert_id();//aqui modifico el valor global de la variable

if (mysql_error($conexion)==""){
echo "<div>Pedido $npedido registrado.</div>";
}
else {
echo "<div>Ha habido un error en la introducción de datos, por favor, contacta con el departamento de Informatica.</div>";
}
}
##################################################
function insertar_referencia($npedido,$referencia,$cantidad ,$descripcion,$epedido,$tpedido){
//Declaramos las variables
$host='192.168.1.214';
$usr='usuario';
$pass='usuario';
$db='recambios';
global $npedido;//aqui le dices php que busque la variable globlar $npedido

//Conectamos a mysql. Si falla muestra mensaje
$conexion=mysql_connect($host,$usr,$pass)
or die("No se pudo conectar, por favor, contacta con el departamento de Informatica." );

//Seleccionamos la base de datos. Si falla muestra mensaje
mysql_select_db($db,$conexion)
or die("No se pudo seleccionar la Base de Datos, por favor, contacta con el departamento de Informatica.");

//Ejecuta la sentencia sql de insercion
@mysql_query("INSERT INTO referencias (npedido,referencia,cantidad,descripcion,epedido,t pedido) VALUES ('$npedido','$referencia','$cantidad','$descripcio n','$epedido','$tpedido')");
if (mysql_error($conexion)==""){
echo "<div>Referencia registrada.Ahora puedes insertar otra referencia.</div>\n";
}
else {
echo "<div>Ha habido un error en la introducción de datos, por favor, contacta con el departamento de Informatica.</div>\n";
}
}
##################################################
...
$npedido='';
echo "<form action='' method='post'>\n";
echo "<table align='center'>\n";
echo "<tr>\n";
echo "<td colspan='2'>REGISTRAR PEDIDO</td>\n";
echo "<td colspan='2' rowspan='9'>\n";
echo "<div>1) Registre un pedido:</div>\n";
echo "<div><br /></div>\n";
echo "<div><input type='submit' name='registrar' value='Registrar' /></div>\n";
echo "<div>";
if (isset($_REQUEST['registrar'])){
insertar_pedido($nor,$nmec,$nrec,$nconcesion);
}
echo "</div>\n";
echo "<div><br /></div>\n";
echo "<div>2) Enviar una referencia:</div>\n";
echo "<div><br /></div>\n";
echo "<div><input type='submit' name='enviar' value='Enviar' /></div>\n";
if (isset($_REQUEST['enviar'])){
insertar_referencia($npedido,$referencia,$cantidad ,$descripcion,$epedido,$tpedido);
}
echo "</td>\n";
echo "</tr>\n";
...

Última edición por aliza; 09/03/2009 a las 10:37
  #7 (permalink)  
Antiguo 09/03/2009, 10:45
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Ayuda mysql_insert_id()!!!!

Una pregunta: las funciones y la parte donde las ejecutas, están en un mismo script o al menos dentro de un mismo entorno (vía require o include)? Que si no, las variables globales no sirven o_o

Lo otro, no creo que sea necesario que vuelvas a llamar como global a $npedido en la segunda función: si recibió un valor en la primera función, al enviarla a la segunda como parámetro, no tienes para qué llamarla como externa.

Ahora, viendo tu código nuevo, revisa también si tu variable $_REQUEST['enviar'] está en un valor afirmativo para poder ejecutar la siguiente función...

No se me ocurre otra cosa por ahora...
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #8 (permalink)  
Antiguo 09/03/2009, 10:48
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Ayuda mysql_insert_id()!!!!

Está todo en un mismo script. Voy a seguir investigando.
  #9 (permalink)  
Antiguo 10/03/2009, 03:31
 
Fecha de Ingreso: noviembre-2008
Mensajes: 44
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: Ayuda mysql_insert_id()!!!!

perdona por insistir :S pero deberias quitar el @ de las funciones @mysql_query para saber que error está lanzando la libreria mysql, y cuando hayas encontrado el error, lo vuelves a poner.

otro consejo, es que imprimas la sentencia que vas a ejecutar:

echo "INSERT INTO referencias (npedido,referencia,cantidad,descripcion,epedido,t pedido) VALUES ('$npedido','$referencia','$cantidad','$descripcio n','$epedido','$tpedido')";

para ver si se está construyendo correctamente. Y aunque aparentemente la sentencia esté construida correctamente cópiala y ejecutala en algún cliente mysql que tengas, para asegurarte.

con estos dos sencillos consejos ya dispondrás de algo más de información para encontrar el error y la información que obtengas posteala por aki, a ver si damos con el error.
  #10 (permalink)  
Antiguo 10/03/2009, 03:51
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Ayuda mysql_insert_id()!!!!

Buenas El_Barba, muchísimas gracias pero ya lo tengo todo solucionado. Te explico:
No quito las @ porque tengo mensajes de alerta para cada situación (que no conecte a la base de datos por el usuario, la bd, o la ip, que no conecte porque introduce mal un dato...) por eso se en cada momento por qué falla.
Tras comprobar reiteradamente que fallaba por la introducción de $npedido en npedido, usé las variables globales, pero entonces tenía el problema de que al pulsar el botón de registrar pedido, el proceso de php se reiniciaba entonces el valor de $npedido volvía a ser 0 y no mysql_insert_id(); y entonces cuando pulsaba el botón de enviar referencia no me introducía el npedido.

Al final opté por usar coockies, que nunca las había usado... es más, desconocía su uso en los formularios (soy algo nuevo en esto) y así he conseguido hacerlo.
A la primera función le añadí setcookie(npedido,mysql_insert_id()); y al código html $npedido=$_COOKIE['npedido'];, por lo que así ya tiene el valor npedido la variable $npedido durante toda la sesión.

Muchas gracias por tu interés, atención y ayuda.

Espero resolver algo a alguien con esta respuesta si la lee.
  #11 (permalink)  
Antiguo 10/03/2009, 03:53
 
Fecha de Ingreso: noviembre-2008
Mensajes: 44
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: Ayuda mysql_insert_id()!!!!

tb puedes dejar el @ y al final cuando miras si ha habido algun error poner

if (mysql_error($conexion)==""){
echo "<div>Referencia registrada. Ahora puedes insertar otra referencia.</div>\n";
}
else {
echo mysql_error($conexion); //imprimes el último error que hubo en mysql.
}
}

php o mysql suelen mostrar mensajes de errores que son de mucha ayuda.

por supuesto, cuando la aplicación esté terminada debes poner los @ y mostrar tus propios mensajes de error personalizados, ya que el usuario final no debe los mensajes lanzados por php o mysql , tanto por motivos de estética como de seguridad. Pero mientras desarrollas...

Actualización:
vale, me alegro de que lo hayas solucionado :D . Aunque te recomiendo que lo intentes hacer por POST, que viendo tu código otra vez .. en vez de poner $_REQUEST['enviar'] tal vez, deberias poner $_POST['enviar'], ya que en el formulario has indicado la transeferencia por POST :
"method='post'>\n";

Última edición por El_Barba; 10/03/2009 a las 04:02
  #12 (permalink)  
Antiguo 10/03/2009, 04:11
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Ayuda mysql_insert_id()!!!!

Cierto... lo empiezo con post... Mi problema con php es que aprendí solo y hay cosas de las que no me doy cuenta, ... hago mucho copy/paste.
Ahora estoy empezando a escribir los códigos enteros yo solo, pero tengo vicios de otras aplicaciones que he hecho. Probaré tus recomendaciones, gracias de nuevo.
  #13 (permalink)  
Antiguo 10/03/2009, 04:22
 
Fecha de Ingreso: noviembre-2008
Mensajes: 44
Antigüedad: 15 años, 6 meses
Puntos: 2
las cookies, son una mala opción para guardar información importante , ya que son accesibles desde el navegador.. por ejemplo valores como contraseñas y demás no se deben por ningún motivo guardar en cookies. lo normal, es pasar los valores por post y/ o en variables de sessión.

es normal adquirir los vicios q comentas, a todos nos ha pasado... y se van quitando según vayas obteniendo experiencia.. asi que ánimo!

Última edición por GatorV; 10/03/2009 a las 11:06
  #14 (permalink)  
Antiguo 10/03/2009, 10:41
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Ayuda mysql_insert_id()!!!!

O sea que la ejecución de las funciones no las hacías en un mismo script/entorno después de todo ¬_¬... (lo hacías con el mismo script, pero llamándolo en dos instancias separadas, supongo que debí preguntar si lo ejecutabas una o más veces +_+).

Yo también te aconsejo, como El_Barba, que no uses el arreglo $_COOKIES. Habría sido mejor que la enviaras por post en un segundo formulario, o bien, si no es necesaria la confirmación del usuario, que realices los dos procesos de una sola vez, siendo tu propio script el que verifique que se realice la ejecución del segundo paso sólo si el primero se realizó correctamente (como en el ejemplo que te di yo en mensaje anterior).
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #15 (permalink)  
Antiguo 10/03/2009, 10:51
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Ayuda mysql_insert_id()!!!!

Hola quinqui. Ya le he dado bastantes vueltas y se que no es lo más adecuado, pero al ser un programa interno para mi empresa de momento así vale... más que nada porque me lo están reclamando ya. A ver si termino esta semana, que llevo ya cerca de un mes porque es una aplicación un poco grande.
Con la experiencia y tiempo iré modificando todo esto, pero de momento para salir del paso va bien. Muchas gracias.
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 07:18.