Ik heb een script gemaakt waarbij ik 2 resultaten uit een tabel wil weergeven.

Normaal zou ik dit met een while functie doen. Maar omdat class bij beide resultaten anders is, heb ik het op deze manier gedaan.

Nu is mijn vraag, of er een nettere/betere manier is om dit te doen:


$qry ='
	SELECT 
		referenties.id,
		referenties.naam,
		referenties.tekst,
		referenties.beoordeling,
		referenties.medium,
		referenties.datum,
		referenties_medium.naam as mediumnaam,
		referenties_medium.link
	FROM 
		referenties
			INNER JOIN
				referenties_medium
			ON
				referenties.medium = referenties_medium.id
	ORDER BY 
		RAND()
	LIMIT
		1';
if(!$result = $connection->query($qry)) {
    echo 'Fout in query: '.$connection->error;
} else {
	 $list = $result->fetch_assoc();		
$main .='				
                  <blockquote class="blockquote1 first wow fadeInUp" data-wow-duration="1s" data-wow-delay="0.1s">
                    <cite>'.$list['tekst'].'</cite>
                    <span class="author">'.$list['naam'].'</span>
                    <span class="date">'.$list['datum'].'</span>
                    <span class="star">'.$list['beoordeling'].'</span>
                    <a href="'.$list['link'].'" target "_blank">'.$list['mediumnaam'].'</a>
                  </blockquote>';
}
				  
$qry2 ='
	SELECT 
		referenties.id,
		referenties.naam,
		referenties.tekst,
		referenties.beoordeling,
		referenties.medium,
		referenties.datum,
		referenties_medium.naam as mediumnaam,
		referenties_medium.link
	FROM 
		referenties
			INNER JOIN
				referenties_medium
			ON
				referenties.medium = referenties_medium.id
	WHERE
		referenties.id != '.$list['id'].'
	ORDER BY 
		RAND()
	LIMIT
		1';
if(!$result2 = $connection->query($qry2)) {
    echo 'Fout in query: '.$connection->error;
} else {
	 $list2 = $result2->fetch_assoc();
$main .='	 
                  <blockquote class="blockquote1 second wow fadeInUp" data-wow-duration="1s" data-wow-delay="0.2s">
                    <cite>'.$list2['tekst'].'</cite>
                    <span class="author">'.$list2['naam'].'</span>
                    <span class="date">'.$list2['datum'].'</span>
                    <span class="star">'.$list2['beoordeling'].'</span>
                    <a href="'.$list2['link'].'" target "_blank">'.$list2['mediumnaam'].'</a>
                  </blockquote>';
}
In plaats van 2 keer ORDER BY RAND() LIMIT 1 kun je toch 1 keer ORDER BY RAND() LIMIT 2 gebruiken?
En daarna gewoon tijdens het ophalen de class per iteratie van je loop veranderen, bijvoorbeeld met een modulo operatie.
Bedankt voor jullie reacties.

@ ward:
Dat kan inderdaad, ik kom alleen in de knoop met de blockquote, deze is bij beide weergave anders.

@Ben

Bedoel je dan zoiets?


for($i = 0; $i < 2; $i++) {
		if($i == 1){
	$main .=' first';
		} elseif ($i == 2){
	$main .=' second';
		}
	}


Ik heb hier mee zitten stoeien maar kreeg het niet werkend, dus dacht het op deze manier niet kon.

edit: ik kreeg ineens een ingeving. Voor the while loop geef ik an:

$i = 0;
En dan in the while loop:
$i++

if($i==1){
...
} elseif ($i==2){
...
}

Weet niet of dit de meest handige manier is maar het werkt wel.

Correct. En als je meerdere resultaten hebt kun je iets doen als:
<?php
$i = 0;
while (...) {
if ($i++ % 2 == 0) {
$main .= ' first';
} else {
$main .= ' second';
}
// hier je rij
}
?>
Dank je wel,

Kun je mee beetje helpen met de uitleg van de functie?

$i++ verhoogt $i elke keer met 1 als de functie langs komt
%2 2 keer uitvoeren of als $i gelijk is aan 2 dan $i is gelijk aan 0?

De $i++ % 2 doet het volgende:
Geef eerst de waarde van $i terug
Verhoog vervolgens $i
Wanneer $i gelijk is aan 2 wordt deze gelijk gemaakt aan 0, de modulo operatie. Zie http://php.net/manual/en/language.operators.arithmetic.php
Het eindresultaat hiervan is een interpolatie tussen de getallen 0 en 1.
Dit is ook te bereiken met iets als $i & 1. Een eenvoudige AND operatie.
Kijken of ik het nu goed begrepen heb.

Ik heb dit gemaakt


<?php
  $i=0;
	$stars = '<img src="'.$url.'images/star.png" alt="Star"/>';
	 $totalstars ='';
	 $count = $list['beoordeling']; 
	for($i = 0; $i < $count; $i++) {
	$totalstars .= $stars;
	}
?>


Waarbij $list['beoordeling'] als waarde 5 heeft.

Het script werkt prima, maar wilde even kijken of mijn manier nu de juiste is.
Hier hoef je $i niet te initialiseren, dit doet de for loop al voor je. Ik zie ook niet helemaal hoe deze code zich verhoudt tot de eerdere vraag. Echter zou ik het zo doen:
<?php
$stars = '<img src="'.$url.'images/star.png" alt="Star"/>';
$totalstars = str_repeat($stars, $list['beoordeling']);
?>

Reageren