Viariable optellen in while loop

Status
Niet open voor verdere reacties.

mbakker71

Gebruiker
Lid geworden
25 mei 2012
Berichten
163
Hallo,

Ik heb een code waarbij hij elke keer een nieuwe div moet aanmaken voor elke record in een tabel. Nou mogen er maximaal 3 divs worden gemaakt in de tag <article> dus ik dacht dit zou wel werken:

Code:
$sql = "SELECT * 
FROM  `software`";
$res = mysql_query($sql);

$i = 0;
while($row = mysql_fetch_array($res)) {
	if($i = 0){
		echo '<article id="wrapper">';
	}
	echo '<div class="box">';
    echo $row['naam'];
	echo '</div>';
	$i = $i + 1;
	if($i = 2){
	echo '</article>';
	}
}

Maar $i blijft maar 1 en ik weet niet hoe ik dat moet oplossen. misschien een van jullie wel?

Martijn
 
Ik zou beginnen om de vergelijkings operatoren goed neer te zetten, ik denk dat dit al een heel eind scheelt.

Code:
while($row = mysql_fetch_array($res))

wordt :

Code:
while($row == mysql_fetch_array($res))

en

Code:
	if($i = 2){

wordt :

Code:
	if($i == 2){
 
Top dankje!

Was inderdaad waar wat je zei bij die if functies. Was dat even vergeten en hij doet het nu super.

Alleen die while functie was wel goed die crasht namelijk als je == doet.

Martijn
 
Mooi dat je probleem is opgelost.

Voor het geval je wilt weten waarom je in het while-statement een enkele "=" gebruikt en geen dubbele (en laten we wel wezen, het is een stuk makkelijker programmeren als je ook daadwerkelijk weet wat je code doet):

Dit stukje code

PHP:
while ( $row = mysql_fetch_array( $res ) )

geeft je steeds het volgende resultaat uit de set van resultaten die de mysql(i)_query functie ophaalde. In de resultset ($res) wordt een pointer bijgehouden, zodat de $res variable zelf weet welk resultaat als volgende "aan de beurt" is. Op een gegeven moment is er geen resultaat meer en zal de functie "false" teruggeven. Dat resulteert erin dat je statement tussen de haakje niet meer "waar" is en je loop eindigt. Met die kennis van de functie, weet je eigenlijk direct dat het hier onzin is om een "==" te gebruiken, zoals gast0158 aangaf.

Ik weet niet hoeveel resultaten je nu vanuit MySQL terugkrijgt, maar de code doet nu nog niet echt wat je aangaf te willen. Zo zul je bij tientallen resultaten nog steeds maar één keer een afsluitende </article> krijgen. Ik begrijp uit je openingspost, dat je voor iedere drie records uit je MySQL een nieuw <article> wilt maken. Hieronder staat de code zoals ik 'm zou schrijven, voorzien van commentaar:

PHP:
// Je SQL statement zoals je dat zelf ook al had.
// Kan overigens gewoon op één regel.
$sql = "SELECT * FROM software";
// Resultaat ophalen. Ik wil niet de eeuwige discussie met je
// aangaan, maar kijk ook eens naar de mysqli_* functies.
$res = mysql_query( $sql );

// Een counter, zoals je zelf al goed bedacht had.
$i = 0;

// Het while-statement, had je ook zelf al prima voor elkaar.
while ( $row = mysql_fetch_array( $res ) )
{

    // Hier kijk je met de modulus-operator (%) wat de restwaarde is als je $i door 3 deelt.
    // Stel dat $i 5 is, dan is de restwaarde 2. Als $i 27 is, is de restwaarde 0.
    // Als de restwaarde 0 is, open je een <article>.
    if ( $i % 3 == 0 )
    {
        // Aangezien je zo meerdere <article>'s krijgt, kun je geen vaststaand "id" gebruiken.
        // Ik ben dus zo vrij geweest daar een class van te maken. Zou je eventueel dus
        // je CSS op aan moeten passen.
        echo '<article class="wrapper">';
    }

    // De printf functie is meer een persoonlijke voorkeur. Je kunt een "template"-opgeven,
    // waar vervolgens de variabelen in gesubstitueerd worden. Zeer de moeite waard om
    // eens kort de documentatie op php.net te lezen. Scheelt een hoop bij het "printen"
    // van strings.
    printf( '<div class="box">%s</div>', $row[ 'naam' ] );

    // De "++" operator is een kortere variant die in principe gelijk is aan $i = $i + 1; of $i += 1;
    // Let wel op: er zijn twee varianten, $i++ en ++$i. Lijken hetzelfde te doen, maar dat is niet zo.
    // Als je ze gebruikt in een statement, zoals hieronder, zal ++$i eerst de waarde verhogen en dan
    // het statement evalueren, $i++ zal eerst evalueren, dan verhogen.
    if ( ++$i % 3 == 0 )
    {
        echo '</article>';
    }

}

Waar je alleen nog wel even rekening mee moet houden, is dat als je aantal resultaten nu geen veelvoud is van drie, dat je laatste <article> niet afgesloten wordt. Lijkt me een mooie uitdaging voor je, om daar zelf wat op te verzinnen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan