2012-08-15 8 views
7

¿Es posible escribir varias condiciones en un ciclo while? Si no, ¿qué es una alternativa? Lo intenté y me lo devolvieron con un error relacionado con la línea de código que configura las condiciones para el ciclo while. Aquí hay un ejemplo de lo que quiero decir.While Loops and Multiple Conditions

$s = 1; 

while ($result_row = mysql_fetch_assoc($query) && $s < 5) 
{ 
echo $result_row['id']; 
$s++; 
} 
+1

Claro que es posible. ¿Lo intentaste? Toda la condición 'while', independientemente de los componentes que pueda tener, debe evaluarse como VERDADERO o FALSO. Ese es el único requisito. Tenga cuidado al hacer una tarea en una declaración compuesta así, aunque ... '$ result_row' puede no obtener lo que espera debido a la precedencia del operador. –

+1

Tu lógica es correcta. ¿Qué dice exactamente el error? –

+1

Absolutamente es posible como cualquier otra estructura de control. Solo tiene que evaluar a verdadero o falso. – j08691

Respuesta

22

eso es posible, pero debido a = tiene menor precedence que && necesita paréntesis para asegurar que su declaración se interpreta correctamente: No se requieren

while (($result_row = mysql_fetch_assoc($query)) && ($s < 5)) 

Los paréntesis alrededor $s < 5 aquí, pero me los he incluido para mayor claridad.

Sin embargo, sería más fácil simplemente modificar su consulta para solo devolver 5 filas, agregando LIMIT 5.

SELECT ... 
FROM yourtable 
ORDER BY ... 
LIMIT 5 
+1

Mejor aún: [mysqli_stmt_num_rows()] (http://www.php.net/manual/en/mysqli-stmt.num-rows.php) – ghoti

+0

La precedencia vinculada no requiere el segundo par interno de corchetes aquí, entonces parece un poco engañoso sugerir ponerlos allí. Sin embargo, no duelen. – hakre

0

mientras veo nada malo en eso. al revés es hacer algo como esto.

$s = 1; 
while ($result_row = mysql_fetch_assoc($query)) 
{ 
    if($s < 5) { 
     //enter the condition 
    } 
    $s++; 
} 
0

El valor de $result_row probablemente está siendo ajustado a la condición booleana de si mysql_fetch_assoc($query) vuelve algo verdadero-ish y $s es inferior a 5. Por lo tanto tratar de leer $result_row como un diccionario ya no funciona.

Puede utilizar paréntesis para especificar exactamente cómo las cosas se analizan:

while (($result_row = mysql_fetch_assoc($query)) && ($s < 5)) 

De esta manera, $result_row se establece en mysql_fetch_assoc($query), que es lo que desea, y el bucle continúa siempre y cuando el valor lógico de esa asignación devuelve algo verdadero-ish, así como s es menor que 5.