2009-08-07 37 views
6
$sql = mysql_query("SELECT * FROM comments WHERE user = 1"); 

$i = 1; 
while ($row = mysql_fetch_assoc($sql)) { 

<p>$i. <?php echo $row['comment'] ?></p> 

<div class="border"></div> 

$i++; 
} 

¿Cómo puedo hacer para no generar <div class="border"></div> en el último comentario?PHP while loop encontrar la última fila

Respuesta

20
$sql = mysql_query("SELECT * FROM comments WHERE user = 1"); 
$number = mysql_num_rows($sql); 
$i = 1; 
while ($row = mysql_fetch_assoc($sql)) { 

    echo '<p>' . $i . $row['comment'] . '</p>'; 

    if ($i < $number) 
    { 
     echo '<div class="border"></div>'; 
    } 

    $i ++; 
} 

Usando la sugerencia de WebDevHobo.

+5

No es necesario el 'I' $. Solo usa 'if (- $ number === 0)'. – Martijn

+0

Con PDO: '$ number = $ req-> rowCount(); tiempo (...) { si (- $ number = 0) { ... }} ' – cyclone200

3
$number = mysql_num_rows($sql); 

Esto le indicará cuántas filas se devolverán. Basado en eso, puede asegurarse de que el último encendido no tenga el DIV.

0
$rslt = mysql_query("SELECT * FROM comments WHERE user = 1"); 

$i = 1; 
if ($row = mysql_fetch_assoc($rslt)) { 
    echo '<p>'. $i . ' '. $row['comment'] . '</p>'; 
    $i++; 
    while ($row = mysql_fetch_assoc($rslt)){ 
    echo '<div class="border"></div>'; 
    echo '<p>'. $i . ' ' . $row['comment'] . '</p>'; 
    $i++; 
    } // end while 
} // end if 

Evita la necesidad de saber el número de filas. Ejecuta la instrucción if solo una vez en lugar de cada ciclo. El HTML y php eran un poco desordenados e inconsistentes, así que supuse que todo el bloque estaba dentro de las etiquetas php. Obviamente, abra y cierre la etiqueta php como mejor le parezca.

Esto es en gran parte un problema de estilo, pero decidí que el nombre de la variable $ sql era un poco engañoso, ya que a menudo y comúnmente se usa para mantener ejecutada la cadena de la instrucción sql. Por lo tanto, cambié el nombre de la variable a $ rslt.

7
$sql = mysql_query("SELECT * FROM comments WHERE user = 1"); 
$output = array(); 
while ($row = mysql_fetch_assoc($sql)) { 
    $output[] = $row['comment']; 
} 
echo join('<div class="border"></div>', $output); 
+0

me gusta la separación de la lógica y de salida ... buen diseño. – Umingo

1
$sql = mysql_query("SELECT * FROM comments WHERE user = 1"); 

$i = 1; 
while ($row = mysql_fetch_assoc($sql)) { 

$out_data[] = "<p>$i {$row['comment']} </p>"; 

$i++; 
} 

$divider = '<div class="border"></div>'; 
$output = implode ($divider, $out_data); 

echo $output; 
0

una respuesta general a este tipo de problemas, y el uso de Javascript porque es fácil lanzar en una consola y jugar con:

var count = 0; 
var foo = 3; 
while(count < 3) { 
    console.log("Header - " + count); 
    console.log("Body - "+ count); 
    console.log("Footer - " + count); 
    count++; 
} 

Esto imprimirá:

Cabecera - 0
Cuerpo - 0
Pie de página - 0
Cabecera - 1
Cuerpo - 1
pie de página - 1
cabecera - 2
Cuerpo - 2
pie de página - 2

El caso que se solicita es básicamente diciendo "imprimir un pie en todos menos en el último elemento. "

Si considera que la iteración del segundo bucle es simplemente la continuación de la primera, puede ver cómo hacerlo sin tener que buscar la cantidad total de registros, p. no es necesario hacer una segunda consulta para contar. De manera más sucinta: cuando te encuentras atascado tratando de descubrir cómo hacer algo usando un bucle (o recursión), deberías intentar escribir lo que hace tu bucle, pero sin hacer bucles, por ejemplo. Copie y pegue el bloque de bucle al menos tres veces.

En lugar de hacer eso aquí, sólo voy a terminar con la respuesta, y dejar la derivación para el lector: ~)

var count = 0; 
var foo = 3; 
while(count < 3) { 
    if(count > 0) { 
     console.log("Footer - " + (count - 1)); 
    } 
    console.log("Header - " + count); 
    console.log("Body - "+ count); 
    count++; 
}