entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Como mostrar resultados de una consulta de tablas relacionadas con diferentes campos

Buen día comunidad,

Tengo un problema para mostrar los resultados de dos tablas relacionadas a traves de una FK, son dos tablas (caja) y (empleados) en caja tengo los campos idcaja, fechacaja, numerocaja, valorcaja, notacaja, idempleado1(fk); en empleados los campos que necesito que me muestre en la consulta son nombreempleado, apellidoPaterno, apellidoMaterno, conectados por su ideempleado.

Una vez se insertan los datos lo que busco es que muestre el ultimo registro para que la persona pueda observar si lo que registro es correcto o no, en caso de que no lo pueda modificar para un correcto registro.

El problema que tengo tambien es que una vez registrado y solicitada la consulta no me muestra los campos donde existe registro es decir: fecha caja aparece el nombre del campo mas nó el dato.

Escribo el codigo que tengo para saber que me falta o que debo modificar, por ahora trabajo mysql debido a que mysqli lo voy a empezar a estudiar.

<?php
$conexion = mysql_connect("localhost","root","");
if(!$conexion){
  echo "Falla la Conexion con el servidor.".mysql_error();
  exit();
}
$db = mysql_select_db("redcolegalizacion",$conexion);
if(!$db){
  echo "Fallo la conexion con la base de datos.".mysql_error();
  exit();
}

// registar los datos en tabla caja
$fechacaja= $_POST['fechacaja'];
$valorcaja= $_POST['valorcaja'];
$notacaja= $_POST['notacaja'];
$idempleado1= $_POST['idempleado1'];

$consulta = "insert into caja (fechacaja,valorcaja,notacaja,idempleado1) values ('$fechacaja','$valorcaja','$notacaja','$idempleado1')";
if (TRUE === mysql_query($consulta)) {
   $update = "UPDATE caja SET numerocaja = LAST_INSERT_ID(idcaja) WHERE idcaja = idcaja ";
   if (!mysql_query($update)) {
      echo 'Error en update';
   }
} else {
  echo 'Error en insert';
}
mysql_close($conexion);
?>
<?php
$conexion = mysql_connect("localhost","root","");
if(!$conexion){
  echo "Falla la Conexion con el servidor.".mysql_error();
  exit();
}
$db = mysql_select_db("redcolegalizacion",$conexion);
if(!$db){
  echo "Fallo la conexion con la base de datos.".mysql_error();
  exit();
}

$consulta= "SELECT caja.fechacaja, caja.numerocaja, caja.valorcaja, caja.notacaja, caja.idempleado1, empleados.nombreempleado, empleados.apellidoPaterno, empleados.apellidoMaterno FROM caja INNER JOIN empleados WHERE caja.idempleado1 = empleados.nombreempleado ORDER BY idcaja DESC LIMIT 1";
$resultado= mysql_query($consulta, $conexion);
if(!$resultado){
die("Error: no se pudo realizar la consulta".mysql_error()); 
 } 
echo '<form method="post" action="notificarcaja.php">';
echo '<tr><td><img src = "images/logoredco.jpg" width = "168" height = "95"></td> </td><td colspan = "7" align = "center" height = "115"><font size = "5" ><B>Sistema de Gestion para Legalización - Asignación de Caja</B></font></th></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td colspan = "8" align = "left" height = "30"><B>Confirmación Datos para Notificación Caja - Ingeniería Redco S.A.S.</B></td></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td width = "160">Fecha Asignación Caja</td>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td width = "160">Número de Caja</td>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td>Valor Caja Asignada</td>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td>Nota importante</td>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td>Nombre Empleado</td>';
while($reg = mysql_fetch_array($resultado)){
  echo "<td>". $reg['fechacaja']."</td>";
  echo "<td>". $reg['numerocaja']. "</td>";
  echo "<td>". $reg['valorcaja']. "</td>";
  echo "<td>". $reg['notacaja']. "</td>";
  echo "<td>". $reg['idempleado1']. "</td>";
  echo "</tr>";
 }
 echo "</table>";
 mysql_free_result($resultado);
 mysql_close($conexion);    
?>

1 Respuesta

2votos

magarzon Puntos30650

Para empezar, supongo que el campo idempleado1 de la tabla caja se relaciona con un campo id o idempleado de la tabla empleados, y no con nombreempleado, que es con el que parece que quieres hacer el JOIN, pero es que además, estás usando WHERE, cuando en un JOIN la relación se pone con ON.

Así sería la consulta correcta (asumiendo que el id de la tabla empleados es id)

SELECT caja.fechacaja, caja.numerocaja, caja.valorcaja, caja.notacaja, caja.idempleado1, empleados.nombreempleado, empleados.apellidoPaterno, empleados.apellidoMaterno FROM caja INNER JOIN empleados ON caja.idempleado1 = empleados.id ORDER BY idcaja DESC LIMIT 1

Pero como ya te dije en otra pregunta, puedes tener problemas si tienes más de un usuario trabajando en el sistema, ya que esto lo que te da es el último registro insertado en la tabla, pero si tienes más de un usuario, puede ocurrir que no sea el último insertado por ese usuario.

Para ello tendrías dos opciones:

  1. Almacenar el id del registro creado en la tabla caja (lo tienes fácil con el LAST_INSERT_ID) y hacer la consulta añadiendo un WHERE con idcaja = '$ultimoid'
  2. Tener un registro de qué usuario ha insertado qué registros, lo que no viene mal para auditoría, si tienes más de un usuario, y entonces el WHERE que tendrías que añadir sería para relacionar un campo idusuario con el usuario logueado que hizo la inserción

2votos

gramirezpi comentado

Hola magarzon,
Aplico el codigo recomendado pasando de WHERE a ON pero sigue registrando el mismo problema, ahora me sale el siguiente error que detecto en el WHILE cuando se realiza la consulta:
"SCREAM: Error suppression ignored for"
"Notice: Undefined index: fechacaja in C:\wamp\www\webdb\asignacioncaja1.php on line 84"
los datos se insertan en la tabla pero cuando realizo la consulta para que la persona pueda ver lo que registro no los muestra.
en cuanto al LAST INSERT ID como debe ser escrito esta parte del código para evitar el error de multiusuarios?

2votos

magarzon comentado

Usando LAST_INSERT_ID sería así, pero esta query tiene que realizarse en la misma llamada que la que se hace el insert, si llamas a un PHP para insertar, y a otro para consultar, no te funcionará:

SELECT caja.fechacaja, caja.numerocaja, caja.valorcaja, caja.notacaja, caja.idempleado1, empleados.nombreempleado, empleados.apellidoPaterno, empleados.apellidoMaterno FROM caja INNER JOIN empleados ON caja.idempleado1 = empleados.id WHERE caja.idcaja = LAST_INSERT_ID() ORDER BY idcaja DESC 

1voto

gramirezpi comentado

Gracias Magarzon,
Ya en cuanto a mostrar resultado funciona con el ON, solo que tenia un error el cual era que habia colocado ROW en vez de ARRAY. ahora tengo el siguiente problema, necesito que los resultados me los muestre de la siguiente manera:
fecha caja: 01-01-2000
numero caja: 90
así sucesivamente, pero me sale todos los resultados en una sola hilera y al final y no como quiero, como debo corregir esa parte del codidgo?,
otra cosa como hago para que el caja.idempleado1 no aparezca el numero del id sino el nombre de la persona?, como debo escribir esa parte del codigo?

1voto

gramirezpi comentado

hola magarzon,
ya pude corregir lo del orden de impresión era solo un error bobo que cometi en el código, solo me falta es que el idempleado1 no me muestre el numero del id sino el nombre del empleado, creo que tocaria indicar que idempleado1 sea igual a nombre+apellido, pero no se como escribir esa parte del codigo. gracias por la ayuda

1voto

magarzon comentado

La select que te puse antes te debe estar dando ya el nombre del empleado, para eso se hace el JOIN, comprueba la respuesta que te da el mysql_query

0voto

gramirezpi comentado

Hola Magarzon
Le comento que ya finalmente pude insertar bien el código el cual quedo así:

$consulta= "SELECT caja.fechacaja, caja.numerocaja, caja.valorcaja, caja.notacaja, caja.idempleado1, empleados.idempleados, empleados.nombreempleado, empleados.apellidoPaterno, empleados.apellidoMaterno FROM caja INNER JOIN empleados ON caja.idempleado1 = empleados.idempleados WHERE caja.idcaja = LAST_INSERT_ID (idcaja) ORDER BY idcaja DESC LIMIT 1";
$resultado= mysql_query($consulta, $conexion);
if(!$resultado){
die("Error: no se pudo realizar la consulta".mysql_error()); 
 } 
echo '<tr><td><img src="images/logoredco.jpg" width="168" height="95"></td> </td><td colspan="7" align="center" height="115"><font size="5"><B>Sistema de Gestion para Legalización - Asignación de Caja</B></font></th></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td colspan="8" align="left" height="30"><B>Confirmación Datos para Notificación Caja - Ingeniería Redco S.A.S.</B></td></tr>';
while($reg = mysql_fetch_array($resultado)){
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td width="160"><B>Fecha Asignación Caja:</B></td>';
echo "<td>".$reg['fechacaja']."</td>";
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td width="160"><B>Número de Caja:</B></td>';
echo "<td>". $reg['numerocaja']."</td>";
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td><B>Valor Caja Asignada:</B></td>';
echo "<td>". $reg['valorcaja']."</td>";
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td><B>Nota importante:</B></td>';
echo "<td>". $reg['notacaja']."</td>";
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr></tr>';
echo '<tr><td><B>Nombre Empleado:</B></td>';
echo "<td>". $reg['nombreempleado']." ".$reg['apellidoPaterno']." ".$reg['apellidoMaterno'] ."</td>";
echo "</tr>";
}
echo "</table>";
mysql_free_result($resultado);
mysql_close($conexion);

ya muestra bien la consulta y hasta ahí funciona bien, tengo una duda, al realizar los cambios del código yo daba F5 para actualizar la vista de la página, pero cada vez que lo hacía resulta dando un nuevo registro, eso es normal? o tendre alguna falla?, gracias ante todo por la gran ayuda.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta