Goedemorgen allen!

We hebben een site (soort toprank site) waarbij men sites kunnen aanmelden, doormiddel van clicks komen ze hoger op de pagina...

Alles werkt ook tot zover alleen willen wij de tabel die we hebben opsplitsen in 3 per pagina en wanneer we naar pagina 2 gaan klopt de telling niet meer.

Op pagina 1 zie je netjes nummer 1, 2, 3 enzovoor enzovoort.. Tot aan 30 toe maar wanneer we naar pagina 2 gaan begint de telling opnieuw, hier zal juist nummer 31 dan moeten komen.

Verder willen wij dus ook in plaats van 1 tabel die we nu hebben 3 tabellen per pagina laten zien met 10 records per tabel zodat we daar tussenin een advertentie ruimte kunnen maken.

Wie is hier eventueel heel handig in en kan dit snel vinden doormiddel van onze code?

Onze code bovenaan de pagina:


$per_pagina_record = 30;

if (isset($_GET["pagina"])) {    

$pagina  = $_GET["pagina"];    
        
}	else {    

$pagina=1;    

}


Dan onze tabel:


<table class="tabel">
  <tr>
    <td class="tabelkop" style="width:5%;text-align: center;">Nummer</td>
    <td class="tabelkop" style="width:85%;text-align: center;">Naam en content</td>
  </tr>
  <?php
	$sql = "SELECT * from websites WHERE `status` = '2' ORDER BY aantalin DESC LIMIT $start_from, $per_pagina_record";
	$return = $conn->query($sql );
						
	while ($row = $return->fetch_object()){
		
	if($i%2 == 0)
    {
        $color = "row1"; // Kleur 1
    }
    else
    {
        $color = "row2"; // Kleur 2
    }
    ++$i;
		
	echo '<tr class="'.$color.'"><td class="rank">'.$i.'</td><td class="col2">  <div style="text-align: center;"> <a href="index.php?uit='.$row->link_id.'" target="_blank"><img src="'.$row->banner.'" class="b468" alt="'.$row->site_naam.'"></a></div>  <a href="index.php?uit='.$row->link_id.'" target="_blank"><strong>'.$row->site_naam.'</strong></a><br>
	'.$row->beschrijving.'  </td>
	</tr>'; } ?>
</table>


En vervolgens onze pagination:


<div class="pagination">
<?php  
	$query = "SELECT COUNT(*) FROM websites WHERE `status` = '2'";
	$rs_result = mysqli_query($conn, $query);
	$row = mysqli_fetch_row($rs_result);
	$total_records = $row[0];
          
	echo "</br>";

	$total_paginas = ceil($total_records / $per_pagina_record);
	$pagLink = "";
      
	if($pagina>=2){
		echo "<a href='index.php?pagina=".($pagina-1)."'><b> Vorige pagina </b></a>";
	}
                   
	for ($i=1; $i<=$total_paginas; $i++) {

	if ($i == $pagina) {
	
		$pagLink .= "<a class = 'active' href='index.php?pagina=".$i."'><b>".$i."</b> </a>";
	
	}	else  {
		
		$pagLink .= "<a href='index.php?pagina=".$i."'><b>".$i."</b> </a>";
		
		}
	};
	
	echo $pagLink;
  
	if($pagina<$total_paginas){
		
		echo "<a href='index.php?pagina=".($pagina+1)."'><b> Volgende pagina </b></a>";
	
	}
?>
</div>


Dit werkt tot zo ver echt goed, althans voor de homepagina, wanneer we naar de 2e pagina gaan begint de telling opnieuw en we zouden graag de tabellen willen verdelen.

Alvast bedankt voor het lezen en helpen!
Heb je deze code zelf geschreven?
Pagination bijvoorbeeld komt van Javatpoint af...
Les 1: begrijp de code die je zelf schrijft. Ongeacht waar die vandaan komt. Jij bent de programmeur, dus jij moet iedere letter code kunnen verklaren.

Terug naar je vraag. Ik ken jouw code dus niet, maar door 'm te lezen zie ik het volgende.

In je SQL-query staat een variabele $start_from. Omdat die nergens wordt geset zal die als 0 worden geïnterpreteerd. Dit betekent dat de LIMIT functie in je query altijd start bij 0. Echter, op pagina 2 moet die niet starten bij 0 maar bij 30. En op pagina 3 moet die niet starten bij 30 maar bij 60. Het enige wat je dus hoeft te doen is die $start_from instellen nadat je het paginanummer weet.

Had je deze code zelf geschreven, dan had je de vraag waarschijnlijk niet hoeven stellen ;-) Weet dus waar je mee bezig bent. Succes.
Klopt en snap ook zeker wat je hiermee wil aangeven maar heb verschillende dingen geprobeerd wat dit betreft en telkens wil het niet werken...


$start_from = ($pagina-1) * $per_pagina_record;


Deze was ik er nog bij vergeten te zetten, dit is de start_from
Dus precies de regel waar het om draait vergeet je te vermelden in je voorbeeld? ;-)


Voeg maar toe en kijk wat er gebeurt, ofwel debuggen:

<?

$start_from = ($pagina-1) * $per_pagina_record;

echo '**** start = ' . $start_from . ' *****<br>';

?
Eigenlijk is het heel simpel. Je hebt al de pagination die alle records verdeelt over meerdere pagina's. En je hebt een whileloop, die alles wat aan de voorwaarden voor de pagination voldoet, laat zien. Dan is het een kwestie om een optellende integer $i++ de telling plaats te laten vinden.

Op de eerste pagina start je met 0 buiten je while-loop waarbij je $i++ doet in je whileloop om er eentje bij op te tellen.
Uiteindelijk op de volgende pagina begin je met 30, en op de volgende pagina met 60. Dit aantal kan je prima bepalen aan de hand van de $_GET['pagina'] die het paginanummer omschrijft.
Ik moet hierbij wel vermelden dat de pagination later is gekomen dan alle overige..


<table class="tabel">
  <tr>
    <td class="tabelkop" style="width:5%;text-align: center;">Nummer</td>
    <td class="tabelkop" style="width:85%;text-align: center;">Naam en content</td>
  </tr>
  <?php
    $sql = "SELECT * from websites WHERE `status` = '2' ORDER BY aantalin DESC LIMIT $start_from, $per_pagina_record";
    $return = $conn->query($sql );
                        
    while ($row = $return->fetch_object()){
        
    if($i%2 == 0)
    {
        $color = "row1"; // Kleur 1
    }
    else
    {
        $color = "row2"; // Kleur 2
    }
    ++$i;
        
    echo '<tr class="'.$color.'"><td class="rank">'.$i.'</td><td class="col2">  <div style="text-align: center;"> <a href="index.php?uit='.$row->link_id.'" target="_blank"><img src="'.$row->banner.'" class="b468" alt="'.$row->site_naam.'"></a></div>  <a href="index.php?uit='.$row->link_id.'" target="_blank"><strong>'.$row->site_naam.'</strong></a><br>
    '.$row->beschrijving.'  </td>
    </tr>'; } ?>
</table>


Hier werkte de telling al zonder pagination... toen was er enkel nog geen sprake van pagina 2, 3 enzovoort enzovoort... Ik weet dus dat de telling wel werkt echter wil ik het namelijk ook nog zo hebben dat het op de pagina's inderdaad verder zal gaan met 30, 60 enzovoort enzovoort.

Ook wil ik graag van 1 tabel per pagina die 3 laten zien van 10 per stuk... alleen valt dit net een beetje buiten mijn range geloof ik :)
Waar komt $i vandaan? Ik neem aan dat die buiten je while-loop defineert als 1
Verder zie ik dat je ++$i gebruikt, terwijl het $i++ is.

Maar goed, je pagination werkt inmiddels? Dan kan je aan de hand van je $_GET['pagina'] bepalen waar je $i weer start.


[size=xsmall]Toevoeging op 19/08/2022 12:00:04:[/size]

Nog een goede tip:
Je hoeft echt niet met PHP te bepalen welke kleuren de rijen om en om zijn. Dan kan prima met CSS:

https://www.w3.org/Style/Examples/007/evenodd.en.html
De inmiddels geplaatste $i++ staat inderdaad wel enkel maar in de while... ik begrijp dat dit niet helemaal volledig correct is dan?

De pagination heeft altijd wel gewerkt, hij gaat netjes naar pagina 1 en 2 als voorbeeld maar de teller begint telkens op 0 wat juist bij pagina 2 op 30 zou moeten beginnen
Zie ook mijn bericht net over die rijen met kleuren, die je denk ik net gemist hebt tijdens mijn edit.
Dat scheelt weer een paar lijnen aan PHP-code.

Ik heb het verhaal net al uitgelegd. Je moet de startwaarde van $i bepalen aan de hand van je $_GET['pagina'] en het aantal rijen.

Reageren