Ver Mensaje Individual
  #7 (permalink)  
Antiguo 23/08/2014, 17:01
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Uso del foreach

En uno de los mensajes anteriores dijiste que lo intentaste con Ajax y obtuviste el mismo resultado que sin utilizar esa técnica. Bueno, debes haber hecho algo mal porque es lo mejor para casos como este y así evitar incomodar al usuario con la recarga de toda la ventana. Voy a utilizar un ejemplo para que veas qué tan sencillo puede ser.

Supongamos que tenemos una base de datos con tres tablas:

TABLA: Categorías
CAMPOS:
  • id_categoria
  • nombre_categoria

TABLA: Alimentos
CAMPOS:
  • id_alimento
  • id_categoria
  • nombre_alimento

TABLA: Detalles
CAMPOS:
  • id_detalle
  • id_alimento
  • tipo_sabor
  • lugar_procedencia
  • precio

El ejemplo se presta para crear más tablas, pero para este ejemplo, solo usaremos tres. Ahora bien, el orden de consulta es el siguiente:
  1. Consulta a la tabla 'Categorías'
  2. Consulta a la tabla 'Alimentos' con el ID de la categoría seleccionada
  3. Consulta a la tabla 'Detalles' con el ID de la categoría seleccionada

Sabiendo esto, en nuestro documento tendremos la siguiente estructura (la variable $conexion nos permitirá realizar la conexión con nuestra base de datos):

Código PHP:
Ver original
  1. <section id = "salida_categorias">
  2. <?php
  3. $query_categorias = mysqli_query('SELECT * FROM categorias');
  4. if (mysqli_num_rows($query_categorias)){
  5. ?>
  6.     <select id = "categorias" onchange = "ajax('id_categoria', this.value, 'salida_alimentos', 'alimentos.php', this.id)">
  7.         <option value = "0">Seleccione una categoría</option>
  8. <?php
  9.     while ($row_categorias = mysqli_fetch_array($query_categorias)){
  10. ?>
  11.         <option value = "<?=$row_categorias['id_categoria']?>"><?=$row_categorias['nombre_categoria']?></option>
  12. <?php
  13.     }
  14.     mysqli_free_result($query_categorias);
  15. ?>
  16.     </select>
  17. <?php    
  18. }
  19. ?>
  20. </section>
  21.  
  22. <section id = "salida_alimentos"></section>
  23. <section id = "salida_detalles"></section>

Para hacer las consultas a las tablas restantes, usaremos dos archivos distintos:

alimentos.php
Código PHP:
Ver original
  1. <?php
  2. $id_categoria = mysqli_real_escape_string($conexion, strip_tags($_GET['id_categoria']));
  3.  
  4. $query_alimentos = mysqli_query($conexion, 'SELECT * FROM alimentos WHERE id_categoria = ' . $id_categoria);
  5. if (mysqli_num_rows($query_alimentos)){
  6. ?>
  7.     <select id = "alimentos" onchange = "ajax('id_alimento', this.value, 'salida_detalles', 'detalles.php')">
  8.         <option value = "0">Seleccione un alimento</option>
  9. <?php
  10.     while ($row_alimentos = mysqli_fetch_array($query_alimentos)){
  11. ?>
  12.         <option value = "<?=$row_alimentos['id_alimento']?>"><?=$row_alimentos['nombre_alimento']?></option>
  13. <?php
  14.     }
  15.     mysqli_free_result($query_alimentos);
  16. ?>
  17.     </select>
  18. <?php
  19. }
  20. ?>

detalles.php
Código PHP:
Ver original
  1. <?php
  2. $id_alimento = mysqli_real_escape_string($conexion, strip_tags($_GET['id_alimento']));
  3.  
  4. $query_detalles = mysqli_query($conexion, 'SELECT * FROM detalles WHERE id_alimento = ' . $id_alimento);
  5. if (mysqli_num_rows($query_detalles)){
  6. ?>
  7.     <table>
  8.         <thead>
  9.             <th>Tipo de sabor<th>
  10.             <th>Lugar de procedencia</th>
  11.             <th>Precio (US$)</th>
  12.         </thead>
  13.  
  14.         <tbody>
  15. <?php
  16.         while ($row_detalles = mysqli_fetch_array($query_detalles)){
  17. ?>
  18.             <tr>
  19.                 <td><?=$row_detalles['tipo_sabor']?></td>
  20.                 <td><?=$row_detalles['lugar_procedencia']?></td>
  21.                 <td><?=$row_detalles['precio']?></td>
  22.             </tr>
  23. <?php
  24.         }
  25.         mysqli_free_result($query_detalles);
  26. ?>
  27.         </tbody>
  28.     </table>
  29. <?php
  30. }
  31. ?>

Y, por último, el archivo con el código JavaScript para realizar la petición Ajax:

Código Javascript:
Ver original
  1. function ajax(variable, valor, id_salida, url, id_actual){
  2.     var xhr = window.XMLHttpRequest ?
  3.               new XMLHttpRequest() :
  4.               new ActiveXObject("Microsoft.XMLHTTP") ||
  5.               new ActiveXObject("Msxml2.XMLHTTP"),
  6.         queryString = valor !== 0 ? variable + "=" + valor : null;
  7.  
  8.     if (id_actual && id_actual == "categorias"){
  9.         document.getElementById("salida_alimentos").innerHTML = null;
  10.         document.getElementById("salida_detalles").innerHTML = null;
  11.     }
  12.  
  13.     if (valor !== 0){
  14.         xhr.open("GET", url + "?" + queryString, true);
  15.         xhr.onreadystatechange = function(){
  16.             if (xhr.readyState == 4){
  17.                 switch (xhr.status){
  18.                     case 200:
  19.                         document.getElementById(id_salida).innerHTML = xhr.responseText;
  20.                         break;
  21.                     case 404:
  22.                         document.getElementById(id_salida).innerHTML = "Error 404 Not Found";
  23.                         break;
  24.                     default:
  25.                         document.getElementById(id_salida).innerHTML = "Error: " + xhr.status;
  26.                         break;
  27.                 }
  28.             }
  29.         };
  30.         xhr.send(null);
  31.     }
  32. }

Y bien, lo que hago en este ejemplo es simple. Primero, en el archivo principal, realizo una búsqueda en la tabla 'Categorías' y de haber datos, los listo en un select. Más abajo, hay dos secciones para los alimentos y detalles, respectivamente. Al cambiar el valor del combo con las categorías, envío a mi función Ajax los siguientes parámetros:
  • variable: El nombre de la variable en la query string.
  • valor: El valor seleccionado en el combo.
  • id_salida: El ID de la sección en la que veremos la respuesta a nuestra petición.
  • url: El nombre del archivo al cual realizaremos la petición.
  • id_actual: Este parámetro es opcional y solo me será útil al elegir una opción en el primer combo.

Una vez que seleccionamos un valor del primer combo (el de los alimentos), enviamos el valor seleccionado al archivo alimentos.php en el cual realizamos la búsqueda de los alimentos que correspondan con la categoría seleccionada, para lo cual, enviamos a través de Ajax el ID de la categoría que categoriza (valga la redundancia) a los alimentos. De encontrarse datos, se imprimirá un combo con la lista de alimentos encontrados. El proceso es muy similar al elegir un alimento de la lista, con la diferencia de que dicho cambio generará que el archivo detalles.php imprima una tabla con los detalles correspondientes.

Cabe señalar que el parámetro id_actual que envío a la función Ajax solo me es útil con el primer combo, pues al cambiar de categoría, limpio las secciones con los alimentos y detalles ya que no habría correspondencia entre dichos datos y la nueva categoría seleccionada. Además, solo si el valor seleccionado es diferente a '0' (la opción seleccionada por defecto), se realizará la petición.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand