Newsgroup: it.comp.www.php
Titolo: Come impostare un ciclo while  particolare

Ciao a tutti,
normalmente riempio una <table> con dati provenienti da una tabella mysql 
con un ciclo while
Ogni riga corrisponde ad un record e non ci sono problemi.
Questa volta però ho una <table> che ha 5 <td> ognuno dei quali è un record 
della tabella che contiene un campo col nome di una foto da visualizzare
Quindi ogni riga <tr> contiene 5 records della tabella mysql.
Come impostereste il ciclo while per riempire in orrizontale le 5 <td>e in 
verticale tutte le<tr> necessarie a mostrare tutte le foro?
Grazie


Una possibile soluzione potrebbe essere quello di ciclare su tutti i 
risultati della select e all'interno del ciclo utilizzare un contatore e 
tutte le volte che $cnt % 5 == 0 chiudi e riapri il tag tr. Ovviamente 
finito il ciclo devi completare la riga, aggiungendo le celle vuote che 
mancano per raggiungere il 5.
	Francesco

Ciao,

lo imposti per fare quello che hai scritto...
per esempio, in linguaggio informale
 rs = contiene il recordset
while(not_end_of( rs)) {
 <tr>
      <td> rs.item</td> //qui ci metti il primo item
   rs.next; // passi al secondo
      <td> rs.item</td> //qui ci metti il secondo item
   rs.next; // passi al successivo
       <td> rs.item</td> //qui ci metti il terzo item
   rs.next; // passi al successivo
       <td> rs.item</td> //qui ci metti il quarto item
   rs.next; // passi al secondo
       <td> rs.item</td> //qui ci metti il quinto item
   rs.next; // passi al successivo (per quando rientri nel prossimo
giro di while.... ricordati che devi controllare se rs.next esiste o
avrai un'errore quindi se rs.next andrai a crearti il tuo td che
contiene &nbsp;
</tr>
}
il punto è che il while ripete il blocco che vuoi... se vuoi ripetere
una tr con n td, il corpo del while deve contenere la tr con i vari
td...
Ciao Gianmarco

 contiene &nbsp;
Non mi piace molto, in particolare perchè:
1) Se in seguito decidessi di mostrare - che so - 6 items per riga che fai ?
2) Se il recordset finisce in mezzo al while, ovvero quattro volte su 
cinque, ovvero quasi sempre, come gestisci l'errore ?
IMHO meglio (in *pseudo*Php (r)):
$itemsPerLine = 5;
$itemCount = 0;
while( $row = $db->fetchRow() ) {
	$newLine = ($itemCount % $itemsPerLine == 0) ? TRUE : FALSE;
	if ($newline) { echo '<tr>'; }
	echo '<td>';
 
	echo 'BLA BLA BLA BLA BLA YODA FOOO'; // I dati del tuo item
	echo '</td>';
	if ($newline) { echo '</tr>'; }
	$itemCount++;
}
ciao, f.

 IMHO meglio (in *pseudo*Php (r)):
[..]
OOOPS. ;)
Lascia perdere lo pseudocidice, che **NON** fa quello che vuoi.
Intendevo questo:
Metti un <tr> ed un </tr> fuori dal cliclo while, rispettivamente prima 
(del blocco while) e dopo. All'interno del blocco while, usa un 
contatore per contare le iterazioni, e ad ogni cinque chiudi e riapri <tr>.
ciao, f.

 ciao, f.
e tu mi spiegheresti che dovrebbe fare questo tuo codice a parte i
blabla?
non stampa una tabella e, come scrivi tu 4 volte su 5 che mancano gli
elementi per completare il tr fa produrre un codice html SBAGLIATO, e
fai un numero di operazioni algebriche immotivato.
Ciao Gianmarco

 fai un numero di operazioni algebriche immotivato.
Mi sono corretto **UN MINUTO** dopo, con un altro post. Se avessi avuto
la pazienza di accorgertene, invece di sbraitare come una checca
isterica avresti evitato questa n-esima figura di merda.
PS: lo ripeto: **non mi piace il tuo codice**, e *non* mi pare motivo
per offendersi, a meno che tu non abbia 12 anni.
Quanto alle operazioni immotivate, col tempo ho scelto di favorire la
leggibilità A MENO CHE la situazione non lo richieda. E non è questo il
caso.
Ciao & tromba di più ;)
f.

 f.
si forse hai ragione, tu invece fatti portare fuori più spesso, ne hai
proprio bisogno.
Ciao
               Gianmarco

 visualizzare
A lato della flame, io ti dico che non userei una table ma una ul, con un 
li per ogni elemento, e formatterei il tutto coi css:
<ul class="fotogallery">
 <?php foreach ($listadati as $dato): ?>
   <li><?php print $dato; ?></li>
 <?php endforeach; ?>
</ul>
Nel css:
ul.fotogallery { width: QuelCheVuoipx; overflow: hidden; }
ul.fotogallery li { width: 19%; float: left;}
Se ne vuoi 3 invece di 5, cambi il 19% con 32%. Se ne vuoi due metti 49%, 
se ne vuoi 10 metti 9%, ecc.
E` una LISTA di foto, non una tabella, quindi devi usare le liste.
Bye.

 molto meglio)
Nonhai capito NULLA, ti suggerisco di finirla qua al fine di arginare
per quanto possibile la fugura di merda.
Buoba giornata, genio ! ;)
ciao, f.

 proprio bisogno.
PS: Tieni, genio.
Passami l'array al posto del recordset.
Inoltre, qualsiasi considerazione circa stili, css et cetera è fuori
luogo, visto che siamo su un NG di **PHP** e la domanda riguardava un
cliclo WHILE, motivo per cui scrivo la cosa più semplice possibile per
illustrare il concetto.
Ciao genio, buona vita.
<?php
    $items = Array (
 
                    'Item8',
                    'Item7',
                    'Item6',
                    'Item5',
                    'Item4',
                    'Item3',
                    'Item2',
                    'Item1',                    
 
                    );
 
?>
<table border="1">
    <tr>
        <?php
 
            $itemsPerLine   =   5;
            $itemCount      =   1;
 
            while ( $row = array_pop($items) ) {
 
                echo '<td>'.$row.'</td>';
 
                if ( $itemCount % $itemsPerLine == 0) { echo
'</tr><tr>'; }
 
                $itemCount++;
 
            }
 
            while ( ($itemCount-1) % $itemsPerLine != 0 ) {
 
                echo '<td>&nbsp;</td>';
                $itemCount++;
 
            }
 
        ?>
 
    </tr>
</table>

 li per ogni elemento, e formatterei il tutto coi css:
Senz'altro una soluzione migliore.
Le tabelle *per�* non le ho suggerite io, erano indicate nel post
originale.
ciao, f.

 quello di Pellizzari
E allora ?
E' stato l'autore **DELLA DOMANDA** a chiedere come implementare un
ciclo while che permettesse di generare *UNA TABELLA* con un numero
variabile di td.
Per quanto mi riguarda, quindi, l'uso della tabella era parte della
specifica, non ho modo di sapere se per in motivo valido oppure no.
Infinitamente pi� elegante la soluzione di Pellizzari, non v'e' dubbio,
ma la domanda posta in origine era un'altra.
Furthermore, la sua (pur migliore) soluzione c'entra abbastanza poco con
php.
ciao, f.

 PS: Tieni, genio.
senti, hai dei seri problemi di varia natura, dal lato tecnico che da
quello comportamentale, ti segnalo alcune cose:
1) tu hai parlato di logica di display, che a casa mia è proprio
quello di cui si parla nel 3d di partenza, per cui stili e tutto il
resto SONO importanti, il problema era 'come faccio a visualizzare'...
2) nello sketch di codice che ho scritto, in maniera molto grossolana,
ho detto che devi controllare l'esistenza dell'item o generare il td
vuoto, dove hai letto che controllo un record ogni 5?
3) sei tu che usi una espressione condizionale per assegnare valori
booleani ad una variabile... :(
dopo di questo non aggiungo altro, io ci ho perso 3 minuti a fornire
una soluzione semplice per il problema 'voglio mettere 5 record per
riga in una tabella', tenendo conto che se uno ha questo problema
vuole prima capire come fare, non come scrivere il miglior programma
per fare questo.
Ciao Gianmarco

 per fare questo.
Bene, ma allora vale anche per me e quindi perchè pignoleggi su cose
quali il punto 3 ?
Il problema è che a casa mia "non mi piace il tuo codice perchè .. ...
.." è uno spunto di discussione, e tu l'hai preso come un insulto
personale. Tutto qui.
Se non ti piace il mio codice io non mi offendo, quello che non capisco
assolutamente è la tua risposta irritata ad un mio post sicuramente
critico, sicuramente anch'esso opinabile, ma comunqe ritengo educato e
motivato. Hai reagito come se io ti avessi scritto "idiota, cazzo scrivi
?" ;) ... senza che io avessi scritto nè sottinteso niente del genere.
ciao, f.

 [cut]
[OT]
Per quanto riguarda il flame, la mia opinione è che sia stato tu il
principale artefice, colorendo per primo le tue affermazioni con termini
tipo: genio, checca isterica, ... (che diciamo non esattamente cordiali)

 ciao, f.
premesso che io non mi offendo, non credo che sia tu in grado di
'insegnarmi' a programmare, si contesta dicendo cose vere, tu non hai
capito il mio brano di codice e lo hai commentato in maniera errata.
:
[quote]
1) Se in seguito decidessi di mostrare - che so - 6 items per riga che
fai ?
2) Se il recordset finisce in mezzo al while, ovvero quattro volte su
cinque, ovvero quasi sempre, come gestisci l'errore ?
[/quote]
non hai letto/capito cosa ho scritto ma non ti sei risparmiato di
commentare, ho riposto a queste tue affermazioni infondate.
Non è che mi puoi dire non mi piace come porti i capelli e poi scopri
che sono calvo.
Ciao Gianmarco

> contiene &nbsp;
oppure molto più dinamicamente con l'uso di un semplice semaforo:
-----------
$sem=1;
$col=5;
while(not_end_of( rs))
{
  echo '<tr>';
    for ($i=1; $i<=$col; $i++)
    {
       $a='';
       if($sem==1)
       {
          $a=rs.item;
          rs.next;
          if (rs.eof)
          {
             $sem=0;
          }
       }
       echo '<td>' . $a . '</td>';
    }
  echo '</tr>';
}
------------
in questo caso basta cambiare il valore di $col per avere la possibilità 
di variare il numero di colonne a piacere
Lucignolo
-- 
Sign in progress

 tipo: genio, checca isterica, ... (che diciamo non esattamente cordiali)
Concordo sul fatto che non siano cordiali... me ne scuso (volendo), ma
hai letto il post al quale stavo rispondendo ?
ciao, f.

           }
può indurre un errore molto subdolo fare next e poi verificare se sei
già a rs.eof...
invece del semaforo puoi proprio scrivere
         if (rs.next)...{td valorizzato}
                   else {td con &nbsp;}
Ciao Gianmarco

 che sono calvo.
Beh, sarà, ma a me non mi piace come non porti i capelli. ;) ;) ;)
ciao, f.

 ciao, f.
Ciao Gianmarco

 sono pelato :P
Si lo immaginavo. ;)
MENO MALE che non ti sei accorto del "a me mi". ;)
Uno potrebbe supporre che io non sappia affatto l'italiano, in realtà ho
cambiato all'ultimo un "non mi piace" con un "a me non piace", ma
nell'editing frettoloso ho omesso di cancellare il "mi".
Vedi com'e' facile scrivere minchiate ?
;)
ciao, f.

 Vedi com'e' facile scrivere minchiate ?
certo, capita a tutti, ma in questo caso particolare ti sei un po'
accanito e hai sottovalutato me e quello che ho scritto, non è una
cosa grave, visto che mi pare che le cose ora siano più chiare e
almeno io non ho alcun rancore
Ciao Gianmarco