Foros del Web » Programando para Internet » PHP »

Uso del foreach

Estas en el tema de Uso del foreach en el foro de PHP en Foros del Web. Buenas tardes amigos, tengo el siguiente problema: Tengo un array, que me trae valores de una tabla, pero necesito "descomponerlo" porque necesito solo un elemento, ...
  #1 (permalink)  
Antiguo 22/08/2014, 15:57
 
Fecha de Ingreso: enero-2014
Mensajes: 127
Antigüedad: 10 años, 2 meses
Puntos: 2
Uso del foreach

Buenas tardes amigos, tengo el siguiente problema:
Tengo un array, que me trae valores de una tabla, pero necesito "descomponerlo" porque necesito solo un elemento, para compararlo con otra tabla.
Código PHP:
while($sub_categoria mysql_fetch_array($sub_categorias))
                    echo 
"<option value=\"$sub_categoria[id_sub]\" data-categoria=\"$sub_categoria[id_cat]\">$sub_categoria[subcategoria]</option>"
Aquí como declaro '$sub_categorias':
Código PHP:
$sub_categorias mysql_query ("select id_cat, id_sub, subcategoria from subcategorias"); 
El campo que me interesa es 'subcategoria', para compararlo como les decía, con otra tabla que contiene un campo llamado "Tipo_prob".

Estuve leyendo y según encontré la mejor forma de recorrerlo o descomponerlo, es con un foreach, la cosa es que no se exactamente como sería esto, los ejemplos y documentación que he leído me confundieron bastante.

Espero que alguien tenga una idea de como sería, o si tienen algún ejemplo perfectamente claro y comprensible, les agradecería mucho que me lo mostraran.

Gracias. :(
  #2 (permalink)  
Antiguo 22/08/2014, 16:23
Avatar de 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.

El bucle foreach itera solo en arrays y objetos, de manera que si el valor del campo subcategoria de tu tabla contiene un elemento cuyo tipo no coincide con uno de los mencionados, entonces de nada te valdrá utilizar esa estructura repetitiva.

Así como nos muestras el código, para obtener el dato de dicho campo, te bastaría con un $sub_categoria['subcategoria'], aunque supongo que eso ya lo sabías, por lo que será mejor que nos expliques mejor qué buscas hacer para poder ayudarte.

Podrías comparar los campos de ambas tablas en la misma consulta usando la sintaxis INNER JOIN. En el enlace hay ejemplos de su uso, pero tendrás que adaptarlos según lo que necesites obtener.

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
  #3 (permalink)  
Antiguo 22/08/2014, 17:00
 
Fecha de Ingreso: enero-2014
Mensajes: 127
Antigüedad: 10 años, 2 meses
Puntos: 2
Respuesta: Uso del foreach.

Estoy haciendo combos dependientes, ya sé que sería mejor con ajax, sin embargo lo he intentado y consigo el mismo resultado que con solo php y mysql, y es que, los ejemplos de combos que hay, pues es eso, precisamente: combos, y yo lo que necesito es lo siguiente:

Tengo una tabla llamada categorias, subcategorias, autos, viáticos, herramientas, y sistemas.

Entonces, supongamos que de la tabla categorías selecciono autos:


Al seleccionarla, me carga las subcategorias (que toma de la tabla subcategorias):


Y luego, en este caso, que seleccione "Autos" me deberá buscar en la tabla con el mismo nombre, todos aquellos registros que en el campo "Tipo_prob" sea igual a la subcategoria que seleccione en "subcategorias", entonces si yo hubiese seleccionado "Llantas" me debería de traer esto:



Bueno, en este caso, solo tengo un registro con eso, pero obviamente, cuando tenga varios, me deberá de traer todos aquellos que coincidan. Por eso es que quería descomponer el array, y así, declarar una variable:

Código PHP:
$buscar $sub_categoria['subcategoria']; 
Que compararía con un select, para traer los resultados:
Código PHP:
$query_autos "SELECT * FROM autos WHERE Tipo_Prob = '$buscar'"
Pero no me sale, y pues me quiero lanzar por la ventana de la desesperación. xD

  #4 (permalink)  
Antiguo 23/08/2014, 00:56
Avatar de 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.

Si lo que tienes te devuelve un registro porque solo tienes uno, ¿no crees que te devolvería cinco cuando tengas cinco registros y así según la cantidad de información existente en la BD? Es decir, a menos que no uses un bucle para iterar sobre el conjunto de datos devueltos por una consulta, siempre obtendrás a más de un registro siempre y cuando haya más de uno.

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
  #5 (permalink)  
Antiguo 23/08/2014, 14:57
 
Fecha de Ingreso: enero-2014
Mensajes: 127
Antigüedad: 10 años, 2 meses
Puntos: 2
Respuesta: Uso del foreach

Creo que no me expliqué bien, sé que me traerá los registros que estén en el momento, en este caso, que solo tengo uno, obviamente solo me trae uno.

La última imagen, donde muestra la tabla justo como la quiero, no corresponde al select de arriba, simplemente la puse, para que te dieras una idea de como necesito que me traiga la información, y era para explicar porque es que necesito/necesitaba el foreach, porque como te decía, necesito comparar lo que haya sido seleccionado en el menú de subcategoría, y respecto a eso, saber en que tabla buscar, evidentemente, esto último se hace con condicionales, pero mi problema sigue siendo, que no sé como declarar la variable, o usar un foreach o algo, para que me traiga los resultados que necesito.

Gracias.
  #6 (permalink)  
Antiguo 23/08/2014, 15:05
 
Fecha de Ingreso: julio-2008
Ubicación: Córdoba, Argentina
Mensajes: 266
Antigüedad: 15 años, 9 meses
Puntos: 26
Respuesta: Uso del foreach

Hola Karen.

El valor que toma el combo de la subcategoría al pulsar el botón "Ver" (supongo que ese es el botón que se utilizaría para buscar los registros asociados a la subcategoría elegida) lo obtienes en un índice de la variable $_POST, como el valor de cualquier otro campo en un formulario.

Supongamos que tu formulario está definido más o menos así:
Código HTML:
<form action="<!-- Aquí el nombre del script PHP donde muestras los registros -->" method="post">
    <select name="categoria">
        <!-- Aquí los <option> de las categorías -->
    </select>
    <select name="subcategoria">
        <?php
            $sub_categorias = mysql_query ("select id_cat, id_sub, subcategoria from subcategorias");

            while($sub_categoria = mysql_fetch_array($sub_categorias))
                    echo "<option value=\"$sub_categoria[id_sub]\" data-categoria=\"$sub_categoria[id_cat]\">$sub_categoria[subcategoria]</option>";
        ?>
    </select>
    <input type="submit" value="Ver" >
</form> 
Cuando hagas clic en "Ver", tu formulario enviará el valor del atributo "value" del <option> seleccionado en el combo, que podrás leer así:
Código PHP:
$buscar $_POST['subcategoria'];

$query_autos "SELECT * FROM autos WHERE Tipo_Prob = '$buscar'"// Acá faltaría preguntar qué categoría se ha seleccionado, para saber en qué tabla buscar 
Todo esto es suponiendo que NO utilizas AJAX, por lo tanto la página deberá recargarse para mostrar los registros.

Espero haberte ayudado. Un saludo.

Última edición por RabidFish; 23/08/2014 a las 15:18
  #7 (permalink)  
Antiguo 23/08/2014, 17:01
Avatar de 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

Etiquetas: mysql, select, tabla
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 06:58.