Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Retornar un array en un bucle desde una función

Estas en el tema de [SOLUCIONADO] Retornar un array en un bucle desde una función en el foro de PHP en Foros del Web. Creo que mi problema es un pco específico. Lo que quiero lograr es imprimir una serie de opciones guardadas en la base de datos mediante ...
  #1 (permalink)  
Antiguo 16/04/2009, 13:20
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 10 meses
Puntos: 2
De acuerdo [SOLUCIONADO] Retornar un array en un bucle desde una función

Creo que mi problema es un pco específico.
Lo que quiero lograr es imprimir una serie de opciones guardadas en la base de datos mediante la inicialización de una función.

El código sería este:
Código php:
Ver original
  1. function opciones() {
  2. // Utilizo global $sql_c; para que la función pueda conectarse a la base de datos
  3. // mediante una variable inicializada exteriormente
  4. global $sql_c;
  5. // La variable $options no podía usarla fuera de la función hasta que la incializé
  6. // mediante la palabra clave global
  7. global $options;
  8.     $opcion = mysql_query("SELECT * FROM opciones", $sql_c)
  9.         or die (mysql_error());
  10.     if ($opcion=='') {
  11.         // Retorno este array por si no existen entradas en la base de datos
  12.         return $options = array('id'=>'0','nombre'=>'Todavía no hay opciones');
  13.     }
  14.     else {
  15.         return $options = mysql_fetch_array($opcion);
  16.     }
  17. }

Fuera del código PHP sería así:
Código html:
Ver original
  1. <select name="opcion" id="opcion">
  2. <?php while (opciones()) : ?>
  3.     <option value="<?php echo $options['id']; ?>"><?php echo $options['nombre']; ?></option>
  4. <?php endwhile; ?>

Ahora el problema es que el bucle es infinito y no sé porqué. El bucle imprime unicamente la primer fila de la tabla de la base de datos.
También use print_r(opciones()); por si el array contenía algún error y el resultado fue:

Array ( [0] => 2 [id] => 2 [1] => prueba 1 [nombre] => prueba 1 )

Es decir que el array está perfecto pero el bucle no reconoce nada más allá del primer objeto.

Desde ya muchas gracias.

- SOLUCIÓN -
Ahora que lo solucioné les dejo la solución.
Ahora creé una nueva función a la cual solo hay que pasarle el nombre de la tabla de la que quiero obtener las opciones:
Código PHP:
function lista($tabla) {
    global 
$sql_c// Hago esto porque mis datos de conexión los tengo fuera de la función
    
$reg mysql_query("SELECT * FROM $tabla"$sql_c)
    or die (
"Problemas al obtener los resultados de la tabla ".$tabla." porque: " mysql_error());
    if (
$reg == '') {
        echo 
"<option value=\"0\">Todavía no hay registros</option>
            "
;
    }
    else {
        while (
$a mysql_fetch_array($reg)) :
        echo 
"<option value=\"".$a['id']."\">".$a['nombre']."</option>
            "
;
        endwhile;
    }

Luego para mostrar la lista lo hago de la siguiente manera:
Código HTML:
<select name="opcion" id="opcion">
	<?php lista(tabla1); ?> <!-- Aqui logro obtener todos los registros de la tabla1 -->
</select> 

Gracias a todos y más a mi porque lo solucioné yo :P

Saludos

Última edición por MauXXI; 17/04/2009 a las 12:27 Razón: Solucionado
  #2 (permalink)  
Antiguo 16/04/2009, 13:43
Avatar de deivax  
Fecha de Ingreso: marzo-2006
Mensajes: 31
Antigüedad: 18 años
Puntos: 0
Respuesta: Retornar un array en un bucle desde una función

Tenés que utilizar un for, foreach o un while con contador. Un while sin contador se convierte en loop infinito si no tiene una manera de hacer que la condición se vuelva falsa.
Por ejemplo:
Código PHP:
<select name="opcion" id="opcion">
<?php foreach (opciones() as $opcion): ?>
<option value="<?php echo $opcion['id']; ?>"><?php echo $opcion['nombre']; ?></option>
<?php endforeach; ?>
</select>
  #3 (permalink)  
Antiguo 16/04/2009, 13:55
 
Fecha de Ingreso: junio-2007
Mensajes: 189
Antigüedad: 16 años, 9 meses
Puntos: 3
Respuesta: Retornar un array en un bucle desde una función

Yo recuperaria primero los valores, los guardaria en una variable y trabajaria con ella...

Código:
<select name="opcion" id="opcion">
<?php 

$opciones = opciones;

foreach ($opciones as $opcion)
{
?>
<option value="<?php echo $opcion['id']; ?>"><?php echo $opcion['nombre']; ?></option>
<?php }?>
</select>
  #4 (permalink)  
Antiguo 16/04/2009, 14:06
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Retornar un array en un bucle desde una función

Ahora entiendo. El problema era que cada vez que se verificaba opciones() dentro de while siempre devolvía un único elemento y me lo repetía infinitas veces.

En cuanto a solucionar con foreach (que me parecio lo más correcto) el bucle se vuelve finito pero dado el array ( [0] => 2 [id] => 2 [1] => prueba 1 [nombre] => prueba 1 ), foreach me devuelve los valores de esta manera:

Código html:
Ver original
  1. <select name="id_grupo" id="id_grupo">
  2.     <option value="2">2</option>
  3.     <option value="2">2</option>
  4.     <option value="p">p</option>
  5.     <option value="p">p</option>

Esto es más extraño aún (para mí) ya que se supone que el resultado debería ser:
Código html:
Ver original
  1. <select name="id_grupo" id="id_grupo">
  2.     <option value="1">prueba 1</option>
  3.     <option value="2">prueba 2</option>

Porque para colmo en la base de datos tengo dos entradas y en la consulta me aparece como resultado sólo una.

Es cierto SoutlinK, debería guardar los resultados en una variable lo que me llevaría a eliminar las funciones ya que es lo mismo que trabajar sin ellas.
De todos modos guardar los resultado de una función en una variable sería un tanto inutil hasta no solucionar el problema del porqué la función devuelve como único resultado el Array ( [0] => 2 [id] => 2 [1] => prueba 1 [nombre] => prueba 1 ).

En cuanto a mi práctica con while siempre lo usé de la siguiente manera:
Código php:
Ver original
  1. while($registro=mysql_fetch_array($consulta) {
  2. echo $registro['id'];
  3. echo $registro['nombre'];
  4. }

Este código ejemplo muestra un bucle finito, siempre me funcionó, pero ahora que quiero usarlo dentro de una función deja de funcionar (ironía).

Desde ya gracias a los que me están ayudando :P
  #5 (permalink)  
Antiguo 17/04/2009, 08:08
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Retornar un array en un bucle desde una función

Hola? nadie más que pueda ayudarme?
Por favor.
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 16:49.