Foros del Web » Programando para Internet » PHP »

Mostrar datos de tablas enlazadas

Estas en el tema de Mostrar datos de tablas enlazadas en el foro de PHP en Foros del Web. Esto es mas o menos un ejemplo de lo q necesito hacer. Se tiene las siguientes tablas: Documentos - documento.d_id - documento.d_nombre Formatos - formato.f_id ...
  #1 (permalink)  
Antiguo 30/08/2008, 20:52
 
Fecha de Ingreso: agosto-2008
Mensajes: 11
Antigüedad: 15 años, 7 meses
Puntos: 0
Mostrar datos de tablas enlazadas

Esto es mas o menos un ejemplo de lo q necesito hacer. Se tiene las siguientes tablas:

Documentos
- documento.d_id
- documento.d_nombre

Formatos
- formato.f_id
- formato.f_d_id
- formato.f_orden
- formato.f_title
- formato.f_digitos

al ejecutar "SELECT * FROM documentos, formatos WHERE d_id=f_d_id ORDER BY f_d_id and f_orden"

me muestra:
Código HTML:
|--------------------------------------------------------------------|
| d_id | d_nombre | f_id | f_d_id | f_orden | f_title    | f_digitos |
|------+----------+------+--------+---------+------------+-----------|
|    1 | doc1     |    1 |      1 |       1 | nombre     |        32 |
|    1 | doc1     |    2 |      1 |       2 | apellido   |        32 |
|    1 | doc1     |    3 |      1 |       3 | edad       |         3 |
|    1 | doc1     |    4 |      1 |       4 | e-mail     |        24 |
|    2 | doc2     |    5 |      2 |       1 | nombre     |        32 |
|    2 | doc2     |    6 |      2 |       2 | apellido   |        32 |
|    2 | doc2     |    7 |      2 |       3 | e-mail     |        24 |
|    3 | doc3     |    8 |      3 |       1 | codigo     |        10 |
|    3 | doc3     |    9 |      3 |       2 | e-mail     |        24 |
|--------------------------------------------------------------------|
Por favor, necesito q alguien me oriente de como podria mostrar los datos de la tabla enlazada en el siguiente formato:

Código HTML:
doc1:  nombre   apellido   edad   e-mail 
doc2:  nombre   apellido   e-mail 
doc3:  codigo   e-mail
Gracias de antemano por cualquier ayuda
  #2 (permalink)  
Antiguo 30/08/2008, 21:26
Avatar de xbx
xbx
 
Fecha de Ingreso: mayo-2008
Ubicación: /home/xbx
Mensajes: 301
Antigüedad: 15 años, 11 meses
Puntos: 11
Respuesta: Mostrar datos de tablas enlazadas

Hola!

Una forma es usar GROUP_CONCAT de mysql

Código:
SELECT documento.d_nombre, GROUP_CONCAT(formato.f_title SEPARATOR ' ') as titles FROM documentos, formatos WHERE d_id=f_d_id GROUP BY documento.d_nombre ORDER BY f_d_id and f_orden
Luego haces un fetch por cada fila (para el caso que presentas, seran 3).

Mas ayuda o asi esta bien?
  #3 (permalink)  
Antiguo 30/08/2008, 23:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Mostrar datos de tablas enlazadas

Tema trasladado a MySQL.
  #4 (permalink)  
Antiguo 31/08/2008, 07:56
 
Fecha de Ingreso: agosto-2008
Mensajes: 11
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Mostrar datos de tablas enlazadas

Gracias XbX por la respuesta... creo q falto explicarlo mejor.
No siempre va darme esa tabla al hacer el select, la proxima vez podria darme:

Código:
|--------------------------------------------------------------------|
| d_id | d_nombre | f_id | f_d_id | f_orden | f_title    | f_digitos |
|------+----------+------+--------+---------+------------+-----------|
|    3 | doc3     |   11 |      3 |       1 | nombre     |        32 |
|    3 | doc3     |   20 |      3 |       2 | apellido   |        32 |
|    3 | doc3     |   23 |      3 |       3 | edad       |         3 |
|    3 | doc3     |   28 |      3 |       4 | e-mail     |        24 |
|    5 | doc5     |   35 |      5 |       1 | nombre     |        32 |
|    5 | doc5     |   36 |      5 |       2 | apellido   |        32 |
|   11 | doc11    |   48 |     11 |       1 | codigo     |        10 |
|   11 | doc11    |   59 |     11 |       2 | e-mail     |        24 |
|   15 | doc15    |   90 |     15 |       1 | e-mail     |        24 |
|--------------------------------------------------------------------|
Dependiendo el usuario q efectue la sesion jala los registros que le correspondan de la tabla documentos y con el d_id hace la busqueda de los campos q requiere cada documento, en la tabla falta la columna d_user (id de ususario) que seria el mismo valor para todos.
Mi pregunta iba a si esta bien como voy pues me da un documento y varios campos (doc3 -> nombre, apellido, edad, e-mail) porque luego quiero poder mostrarlo en la pagina web con PHP y no me sale como hacer q se muestre asi por ejemplo:

Código HTML:
El usuario "Miguel" tiene los siguientes documentos a llenar:
doc3:  nombre   apellido   edad   e-mail 
doc5:  nombre   apellido
doc11:  codigo   e-mail
doc15:  e-mail
En realidad mi problema estaria en el codigo PHP para mostrar los datos en la pagina web, trate de hacerlo con un par de for, combinacion for y while, etc. pero me enrede y no me salio. Quizas este algo dificil, quizas este oxidado en lo de PHP (hace tiempo q no hacia un programa) pero lo que se viene es peor, pues con estos campos debo hacer q genere un formulario de busqueda para cada documento y segun seleccione el documento vaya mostrandole solamente los campos con el formato que se puede hacer la busqueda, pero eso imagino q ya sera un lio con los scrips ocultando y mostrando capas segun la seleccion de un menu de los documentos para ese usuario... creo q ya estoy divagando... jejeje.
Bueno, cualquier ayuda se los agradecedia mucho
  #5 (permalink)  
Antiguo 31/08/2008, 13:54
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
Respuesta: Mostrar datos de tablas enlazadas

Trasladado de BD a PHP a solicitud del usuario.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #6 (permalink)  
Antiguo 02/09/2008, 16:47
Avatar de xbx
xbx
 
Fecha de Ingreso: mayo-2008
Ubicación: /home/xbx
Mensajes: 301
Antigüedad: 15 años, 11 meses
Puntos: 11
Respuesta: Mostrar datos de tablas enlazadas

Has probado la consulta que yo te envie?
Resulta que obtienes lo que buscas.
Por que no posteas lo que da como resultado?
saludos
  #7 (permalink)  
Antiguo 08/09/2008, 03:32
 
Fecha de Ingreso: agosto-2008
Mensajes: 11
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Mostrar datos de tablas enlazadas

Hola XbX
si, probe usando GROUP_CONCAT y me dio lo que queria en solo dos columnas, pero cuando quise usarlo para un formulario no sabia como separara la columna titles

Código PHP:
SELECT work_nameGROUP_CONCAT(format_title SEPARATOR ' | ') AS titles
FROM works
formats
WHERE work_customer_id
=AND
 
work_id format_work_id AND
 (
format_print >OR format_search >OR format_cant >0)
GROUP BY work_name
ORDER BY format_work_id 
AND format_order 
Código HTML:
|--------------------------------------------------|
| work_name | titles                               |
|-----------+--------------------------------------|
| doc3      | Cod. Compañia | Numeracion | Control |
| doc4      | Cantidad                             |
| doc8      | Cod. Compañia | Numeracion | Control |
| doc9      | Cod. Compañia | Numeracion | Control |
| doc17     | Cod. Compañia | Numeracion | Control |
| doc23     | Cod. Compañia | Control              |
|--------------------------------------------------|
Por si a alguien le pueda servir les envio el codigo que use, imagino que esta para depurarlo pero ahorita me conformo con que funcione, despues lo pondre lindo... jaja.

Código PHP:
 $query="SELECT * FROM works, formats WHERE work_customer_id=".$_SESSION['k_customerid']." AND work_id=format_work_id AND (format_print>0 OR format_search>0 OR format_cant>0) ORDER BY format_work_id AND format_order";
 echo 
"  <h3>Ordenes de Impresión</h3>\n";
 
$num_f_d=mysql_query("SELECT a.work_id, a.work_name, count(format_id) FROM (".$query.") a GROUP BY a.work_id");
 
$formats=mysql_query($query);
 
$k=0;
  echo 
"  <P align='center'><FORM name='formorder' action='orden_send.php' method='post'>
   <table align='center' cellspacing='2' cellpadding='2' border='0'>\n"
;
 for (
$i=0;$i<mysql_num_rows($num_f_d);$i++){
  
$wid=mysql_result($num_f_d,$i,"work_id");
  
$wname=mysql_result($num_f_d,$i,"work_name");
  
$fxd=mysql_result($num_f_d,$i,2);
  echo 
"    <tr align='center' valign='top'>
     <td>"
.$wname.":</td>
     <td bgcolor='#DDDDDD'>Seleccionar<br><input type='checkbox' name='workid["
.$i."]' value='".$i."'><input type='hidden' name='workid[".$i."]' value='".$wid."'><input type='hidden' name='workname[".$i."]' value='".$wname."'></td>\n";
  for (
$j=0;$j<$fxd;$j++){
   
$fid=mysql_result($formats,$k,'format_id');
   
$ftitle=mysql_result($formats,$k,'format_title');
   
$fdigits=mysql_result($formats,$k,'format_digits');
   
$fdefault=mysql_result($formats,$k,'format_default');
   
$fprint=mysql_result($formats,$k,'format_print');
   
$fsearch=mysql_result($formats,$k,'format_search');
   
$fcant=mysql_result($formats,$k,'format_cant');
   if(
$fprint!=0){ echo "     <td bgcolor='#DDDDDD'>".$ftitle."<br>".$fdefault."</td>\n";}
   if(
$fsearch!=0){
    echo 
"     <td bgcolor='#DDDDDD'><input type='hidden' name='formatid[".$i."]' value='".$fid."'><input type='hidden' name='formattitle[".$i."]' value='".$ftitle."'>".$ftitle." Inicial<br><input type='text' name='campoi[".$i."]' size='".$fdigits."' maxlength='".$fdigits."'></td>\n";
    echo 
"     <td bgcolor='#DDDDDD'>".$ftitle." Final<br><input type='text' name='campof[".$i."]' size='".$fdigits."' maxlength='".$fdigits."'></td>\n";
   }
   if(
$fcant!=0){
    echo 
"     <td bgcolor='#DDDDDD'><input type='hidden' name='formatid[]' value='".$fid."'><input type='hidden' name='formattitle[]' value='".$ftitle."'>".$ftitle."<br><input type='text' name='cant[".$i."]' size='".$fdigits."' maxlength='".$fdigits."'></td>\n";
   }
   
$k++;
  }
  echo 
"    </tr>\n";
 }
 echo 
"   </table><input type='submit' value='Enviar'>
  </FORM></P>\n"
;
 
mysql_free_result($num_f_d);
 
mysql_free_result($formats); 
Pero ahora tengo otro problema con el programa en "orden_send.php". ¿Como hago para recibir la informacion de solamente las opciones que tienen el checkbox? y poder hacer un codigo para insertar la informacion en una tabla:
Código HTML:
|-------------------------------------------------------------------------|
| work_id | work_name | format_id | format_title | campoi | campof | cant |
|-------------------------------------------------------------------------|
La verdad que estoy mareado con tantas cosas que he probado y nada me ha resultado. Muchas gracias de antemano.

Última edición por Abdiel74; 08/09/2008 a las 03:49
  #8 (permalink)  
Antiguo 08/09/2008, 20:01
Avatar de xbx
xbx
 
Fecha de Ingreso: mayo-2008
Ubicación: /home/xbx
Mensajes: 301
Antigüedad: 15 años, 11 meses
Puntos: 11
Respuesta: Mostrar datos de tablas enlazadas

Hola Abdiel74

En tu orden_send.php debes hacer un foreach de los datos recibidos por post.
Lo que te recomiendo es que nombres a los campos de la siguiente manera:
Código PHP:
 echo "     <td bgcolor='#DDDDDD'><input type='hidden' name='datos[".$i."][formatid]' value='".$fid."'><input type='hidden' name='datos[".$i."][formattitle]' value='".$ftitle."'>".$ftitle." Inicial<br><input type='text' name='datos[".$i."][campoi]' size='".$fdigits."' maxlength='".$fdigits."'></td>\n"
 echo 
"     <td bgcolor='#DDDDDD'>".$ftitle." Final<br><input type='text' name='datos[".$i."][campof]' size='".$fdigits."' maxlength='".$fdigits."'></td>\n"
Luego te será mas facil hacer el foreach
Código PHP:
foreach($_POST["datos"] as $algo)
{
 echo 
$algo["formatid"]; //por ejemplo
//aqui haz las inserciones a tu base de datos


saludos

Última edición por xbx; 08/09/2008 a las 20:11 Razón: correccion
  #9 (permalink)  
Antiguo 09/09/2008, 21:34
 
Fecha de Ingreso: agosto-2008
Mensajes: 11
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Mostrar datos de tablas enlazadas

Hola XbX,

Muchas gracias por el dato, definitivamente tiene mucha mas logica que lo que trataba de hacer... jajaja. Pero aun tengo un problemita con los documentos que solicitan varios campos en el formulario, especificamente documentos con doble numeracion. Haciendo las correcciones que me hiciste me da por ejemplo el siguiente codigo de formulario para un cliente:

Código HTML:
 <P align='center'><FORM name='formorder' action='orden_send.php' method='post'>
   <table align='center' cellspacing='2' cellpadding='2' border='0'>
    <tr align='center' valign='top'>
     <td>Doc10:</td>
     <td bgcolor='#DDDDDD'>Seleccionar<br><input type='checkbox' name='datos[0][seleccion]' value='0'><input type='hidden' name='datos[0][workid]' value='10'><input type='hidden' name='datos[0][workname]' value='Doc10'></td>
     <td bgcolor='#DDDDDD'>Prefijo<br>13</td>
     <td bgcolor='#DDDDDD'><input type='hidden' name='datos[0][formatid]' value='14'><input type='hidden' name='datos[0][formattitle]' value='Numero'>Numero Inicial<br><input type='text' name='datos[0][valori]' size='8' maxlength='8'></td>
     <td bgcolor='#DDDDDD'>Numero Final<br><input type='text' name='datos[0][valorf]' size='8' maxlength='8'></td>
    </tr>
    <tr align='center' valign='top'>
     <td>Doc12:</td>
     <td bgcolor='#DDDDDD'>Seleccionar<br><input type='checkbox' name='datos[1][seleccion]' value='1'><input type='hidden' name='datos[1][workid]' value='12'><input type='hidden' name='datos[1][workname]' value='Doc12'></td>
     <td bgcolor='#DDDDDD'>Prefijo<br>13</td>
     <td bgcolor='#DDDDDD'><input type='hidden' name='datos[1][formatid]' value='16'><input type='hidden' name='datos[1][formattitle]' value='Numero'>Numero Inicial<br><input type='text' name='datos[1][valori]' size='8' maxlength='8'></td>
     <td bgcolor='#DDDDDD'>Numero Final<br><input type='text' name='datos[1][valorf]' size='8' maxlength='8'></td>
     <td bgcolor='#DDDDDD'><input type='hidden' name='datos[1][formatid]' value='17'><input type='hidden' name='datos[1][formattitle]' value='Control'>Control Inicial<br><input type='text' name='datos[1][valori]' size='13' maxlength='13'></td>
     <td bgcolor='#DDDDDD'>Control Final<br><input type='text' name='datos[1][valorf]' size='13' maxlength='13'></td>
    </tr>
    <tr align='center' valign='top'>
     <td>Doc33:</td>
     <td bgcolor='#DDDDDD'>Seleccionar<br><input type='checkbox' name='datos[2][seleccion]' value='2'><input type='hidden' name='datos[2][workid]' value='33'><input type='hidden' name='datos[2][workname]' value='Doc33'></td>
     <td bgcolor='#DDDDDD'><input type='hidden' name='datos[2][formatid]' value='22'><input type='hidden' name='datos[2][formattitle]' value='Cantidad'>Cantidad<br><input type='text' name='datos[2][cantidad]' size='7' maxlength='7'></td>
    </tr> 
y al capturar los datos en el orden_send.php:
Código PHP:
 echo "<table border='1'><tr><td>seleccion</td><td>workid</td><td>workname</td><td>formatid</td><td>formattitle</td><td>valori</td><td>valorf</td><td>cantidad</td></tr>";
foreach(
$_POST[datos] as $algo){
 echo 
"<tr><td>".$algo[seleccion]."</td><td>".$algo[workid]."</td><td>".$algo[workname]."</td><td>".$algo[formatid]."</td><td>".$algo[formattitle]."</td><td>".$algo[valori]."</td><td>".$algo[valorf]."</td><td>".$algo[cantidad]."</td></tr>";
}
 echo 
"</table>"
Me da:
Código:
|---------------------------------------------------------------------------|
| box | workid | workname | formatid | formattitle | valori | valorf | cant |
|-----+--------+----------+----------+-------------+--------+--------+------|
|   0 |     10 | doc10    |       14 | Numero      |    150 |    300 |      |
|   1 |     12 | doc12    |       17 | Control     |2008500 |2008800 |      |
|   2 |     33 | doc33    |       22 | Cantidad    |        |        |  100 |
|---------------------------------------------------------------------------|
Doc12 maneja dos variables numericas en su formato y yo debo almacenar ambas numeraciones iniciales y fianles para esta orden, entonces necesito que me de esto:
Código:
|---------------------------------------------------------------------------|
| box | workid | workname | formatid | formattitle | valori | valorf | cant |
|-----+--------+----------+----------+-------------+--------+--------+------|
|   0 |     10 | doc10    |       14 | Numero      |    150 |    300 |      |
|   1 |     12 | doc12    |       16 | Numero      |    300 |    600 |      |
|   1 |     12 | doc12    |       17 | Control     |2008500 |2008800 |      |
|   2 |     33 | doc33    |       22 | Cantidad    |        |        |  100 |
|---------------------------------------------------------------------------|
es decir el formato 17 chanca los valores del formato 16. como podria hacer para que no pase esto?. Gracias por toda la ayuda que me vas dando pero tengo que molestarte una vez mas XbX (:s)
  #10 (permalink)  
Antiguo 10/09/2008, 22:05
 
Fecha de Ingreso: agosto-2008
Mensajes: 11
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Mostrar datos de tablas enlazadas

Bueno,
despues de muchas pruebas y navegar por internet hasta quedar como un thundercat (:P), creo que logre lo que queria.
Ahi les dejo el codigo para quien le pueda servir. Hice los siguientes cambios en el formulario:
Código PHP:
   if($fprint!=0){ echo "     <td bgcolor='#DDDDDD'>".$ftitle."<br>".$fdefault."</td>\n";}
   if(
$fsearch!=0){
    echo 
"     <td bgcolor='#DDDDDD'><input type='hidden' name='datos[".$i."][format][".$j."][formatid]' value='".$fid."'><input type='hidden' name='datos[".$i."][format][".$j."][formattitle]' value='".$ftitle."'>".$ftitle." Inicial<br><input type='text' name='datos[".$i."][format][".$j."][valori]' size='".$fdigits."' maxlength='".$fdigits."'></td>\n";
    echo 
"     <td bgcolor='#DDDDDD'>".$ftitle." Final<br><input type='text' name='datos[".$i."][format][".$j."][valorf]' size='".$fdigits."' maxlength='".$fdigits."'></td>\n";
   }
   if(
$fcant!=0){
    echo 
"     <td bgcolor='#DDDDDD'><input type='hidden' name='datos[".$i."][formatid]' value='".$fid."'><input type='hidden' name='datos[".$i."][formattitle]' value='".$ftitle."'>".$ftitle."<br><input type='text' name='datos[".$i."][cantidad]' size='".$fdigits."' maxlength='".$fdigits."'></td>\n";
   } 
Y en el orden_send.php:
Código PHP:
 echo "<table border='1'><tr><td>seleccion</td><td>workid</td><td>workname</td><td>formatid</td><td>formattitle</td><td>valori</td><td>valorf</td><td>cantidad</td></tr>";
 foreach(
$_POST[datos] as $algo){
  
$string="<tr><td>".$algo[seleccion]."</td><td>".$algo[workid]."</td><td>".$algo[workname]."</td><td>";
  if (!
is_array($algo[format])){
    echo 
$string.$algo[formatid]."</td><td>".$algo[formattitle]."</td><td>".$algo[valori]."</td><td>".$algo[valorf]."</td><td>".$algo[cantidad]."</td></tr>";
  }else{
   foreach(
$algo[format] as $campo){
    echo 
$string.$campo[formatid]."</td><td>".$campo[formattitle]."</td><td>".$campo[valori]."</td><td>".$campo[valorf]."</td><td>".$algo[cantidad]."</td></tr>";
   }
  }
 }
 echo 
"</table>"
Use una herramienta que sirvio mucho y me permitio ver la estructura de los array para ir guiandome:
Código PHP:
function sanitize(&$array) {
 foreach (
$array as &$data) {
  if (!
is_array($data)){ //Si no es un array
   
$data $data;
  }else{ 
// Si es un array, llama a la funcion en si misma
   
sanitize($data);
  }
 }
}
$test=$_POST[datos];
sanitize($test);
print_r($test); 
No la he depurado del todo pero es una preocupacion menos... por ahora!... jajaja. Porfa, si ven algo que se pudiera mejorar, les agradeceria me lo hagan notar.
Gracias por toda la ayuda XbX, me sirvio de mucho.
Saludos,

Edwin Sánchez
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:13.