Meerdere pagina's op 1 pagina.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jasper Schellekens

Jasper Schellekens

23/02/2018 19:30:48
Quote Anchor link
Ik heb nu een klein script die alle in-game reports laat zien.
Maar nu is het zo dat de pagina super lang word.

Hoe kan ik nou op deze zelfde pagina iets maken waardoor je naar next page en previous page kan gaan?

Wat ik me zo kan bedenken:
Als er bijv 10 rijen zijn, wordt de 11e en de daaropvolgende niet meer laten zien, maar komt er een next page knopje.
Als het goed is kan ik dit doen met rowid. Bijv alleen rowid 1 tm 10 laten zien.
En stel je voor ik heb dan index.php?p=reports en daar wil ik index.php?p=reports&page=2 van maken.
dan zou ik bij page=2 bijvoorbeeld alleen 11 tm 20 laten zien.

Alleen wat ik hierboven heb beschreven lijkt me niet de beste manier om dit te doen, en mijn vraag is dan. Wat is wel de juiste manier om dit te doen?

Want met de manier die ik zojuist beschreven heb zou ik dus iedere pagina moeten aangeven. en als ik er maar 10 heb gemaakt en er zijn er dan 11 heb ik dus een probleem.
 
PHP hulp

PHP hulp

22/12/2024 22:44:07
 
- Ariën  -
Beheerder

- Ariën -

23/02/2018 21:13:43
Quote Anchor link
Heb je al eens gekeken op het trefwoord: 'pagina navigatie' of 'page navigation'
 
Jasper Schellekens

Jasper Schellekens

23/02/2018 22:24:34
Quote Anchor link
Jep maar vind er niet echt iets over. Kom op paginas zoals dit uit de heletijd:
https://stackoverflow.com/questions/10934975/navigating-pages-in-php
 
Adoptive Solution

Adoptive Solution

23/02/2018 22:29:22
 
- Ariën  -
Beheerder

- Ariën -

23/02/2018 22:53:39
Quote Anchor link
En als je het zelf wilt bouwen/begrijpen:
http://www.sitemasters.be/tutorials/1/1/198/PHP/Pagina_navigatie_in_PHP_en_MySQL

Ik zou het dan wel meteen herschrijven naar MySQLi.
Gewijzigd op 23/02/2018 22:54:10 door - Ariën -
 
Jasper Schellekens

Jasper Schellekens

24/02/2018 00:09:24
Quote Anchor link
- Ariën - op 23/02/2018 22:53:39:
En als je het zelf wilt bouwen/begrijpen:
http://www.sitemasters.be/tutorials/1/1/198/PHP/Pagina_navigatie_in_PHP_en_MySQL

Ik zou het dan wel meteen herschrijven naar MySQLi.


Bedankt voor de link. In mijn geval dus sqlite.:P
Nu heb ik geprobeerd om dit te doen maar ik krijg de volgende errors:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Notice: Undefined index: Status in D:\AppServ\www\ucp\reports.php on line 68

Notice: Undefined index: ID in D:\AppServ\www\ucp\reports.php on line 78

Notice: Undefined index: PlayerName in D:\AppServ\www\ucp\reports.php on line 87

Notice: Undefined index: Reporter in D:\AppServ\www\ucp\reports.php on line 88

Notice: Undefined index: Report in D:\AppServ\www\ucp\reports.php on line 89

Notice: Undefined index: Date in D:\AppServ\www\ucp\reports.php on line 90

Notice: Undefined index: ID in D:\AppServ\www\ucp\reports.php on line 91
'.(0+1).'
#    Status    Name    Reported By    Report    Date    Action
Pending                    View report
Notice: Undefined index: ID in D:\AppServ\www\ucp\reports.php on line 92


Ik heb iets fout gedaan waarschijnlijk met dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$res2q = "SELECT * FROM REPORTS ORDER BY ID DESC LIMIT '$offset','$items_per_pagina'";

maar geen idee wat ik fout heb gedaan.

Dit is mijn code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
  error_reporting(E_ALL);
   $nrows = 0;
   $res1q = "SELECT COUNT(ID) FROM REPORTS";
   $res1 = $db->query($res1q);
   while($res1->fetchArray(SQLITE3_ASSOC) )
   {

      $nrows++;
   }
  
   $items_totaal = $nrows;
   $res1->finalize();
   $items_per_pagina = 5;
   $aantal_paginas =  ceil($items_totaal / $items_per_pagina);

  $huidige_pagina = 0; // default
  if(isset($_GET['p']) && is_numeric($_GET['p']) && $_GET['p'] > 0 && $_GET['p'] < $aantal_paginas) {
    $huidige_pagina = $_GET['p'];
  }


  $offset = $huidige_pagina * $items_per_pagina;
  $res2q = "SELECT * FROM REPORTS ORDER BY ID DESC LIMIT '$offset','$items_per_pagina'";
  $res2 = $db->query($res1q);
 while($row = $res2->fetchArray(SQLITE3_ASSOC) )
 {

        $status = $row['Status'];
        if($status==1)
        {

          echo "<tr class='success'>";
          echo "<td>". $row['ID'] . "</td>";
          echo "<td>Open</td>";
        }

        elseif($status==0)
        {

          echo "<tr class='warning'>";
          echo "<td>". $row['ID'] . "</td>";
          echo "<td>Pending</td>";
        }

        elseif($status==2)
        {

          echo "<tr class='danger'>";
          echo "<td>". $row['ID'] . "</td>";
          echo "<td>Closed</td>";
        }

       echo "<td>". $row['PlayerName'] . "</td>";
       echo "<td>". $row['Reporter'] . "</td>";
       echo "<td>". $row['Report'] . "</td>";
       echo "<td>". $row['Date'] . "</td>";
       echo "<td><a href='index.php?p=viewreport&id=". $row['ID'] . "'><button class='btn btn-info'>View report</button></a>&nbsp;";
       echo "<a href='index.php?p=deletereport&id=". $row['ID'] . "'><button class='btn btn-danger'>Delete</button></a></td>";
       echo "</tr>";
 }

 $res2->finalize();
 for($i = 0; $i < $aantal_paginas; $i++) {
    if($huidige_pagina == $i) {
        echo "<b>'.($i+1).'</b>";
    }
else {
        echo "<a href='".$_SERVER['PHP_SELF']."?p=".$i."'>'.($i+1).'</a>";
    }

    if($i < $aantal_paginas - 1) {
        echo " - ";
    }
}

 $db->close();

?>


Toevoeging op 24/02/2018 00:16:34:

dit werkt ook niet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$res2q = "SELECT * FROM REPORTS ORDER BY ID DESC LIMIT " . $offset . "," . $items_per_pagina;
 
- Ariën  -
Beheerder

- Ariën -

24/02/2018 00:16:44
Quote Anchor link
Ik denk dat de veldnamen niet kloppen in je je $row-variabelen. Debug deze array anders eens met print_r().

Ik raad ook aan om nooit * te gebruiken, maar altijd alle veldnamen te benoemen. En die single-qutoes in je query (lijn 21) kloppen ook niet met de double-quotes die je daar gebruikt.
 
Jasper Schellekens

Jasper Schellekens

24/02/2018 02:06:02
Quote Anchor link
- Ariën - op 24/02/2018 00:16:44:
Ik denk dat de veldnamen niet kloppen in je je $row-variabelen. Debug deze array anders eens met print_r().

Ik raad ook aan om nooit * te gebruiken, maar altijd alle veldnamen te benoemen. En die single-qutoes in je query (lijn 21) kloppen ook niet met de double-quotes die je daar gebruikt.


De veldnamen kloppen wel eigenlijk. Geen idee wat de fout was. Denk dat het een baggere tutorial was want had hem zo uit de tutorial overgenomen.

Ik heb de volgende link als voorbeeld gebruikt, en dat werkt gelukkig prima.
https://stackoverflow.com/questions/41777993/php-pagination-next-previous-button
Gewijzigd op 24/02/2018 02:06:29 door Jasper Schellekens
 
- Ariën  -
Beheerder

- Ariën -

24/02/2018 02:14:59
Quote Anchor link
Zoals ik al zei: Ga je script eens debuggen door de waardes achter de variabelen te tonen.

Het is zeker ook leerzaam! Door naar een ander script te grijpen leer je natuurlijk niks.
Gewijzigd op 24/02/2018 02:17:40 door - Ariën -
 
Jasper Schellekens

Jasper Schellekens

24/02/2018 02:29:48
Quote Anchor link
- Ariën - op 24/02/2018 02:14:59:
Zoals ik al zei: Ga je script eens debuggen door de waardes achter de variabelen te tonen.

Het is zeker ook leerzaam! Door naar een ander script te grijpen leer je natuurlijk niks.


Dat ligt eraan wat je doet met het script. Maar je hebt gelijk inderdaad over niets leren.
Ik heb het nu voor mekaar maar echter nog een vraag.
Is er een manier om te kijken welke pagina de laatste pagina is?

Bijvoorbeeld op de eerste pagina wil ik niet dat de previous knop word laten gezien en dat doe ik zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
if($page != 1)
    {
    echo "<li><a href='index.php?p=admin&option=reports&page=".($page-1)."' class='button'>Previous</a></li>";
    }


hoe kan ik dit met de laatste pagina ook doen?

Dit is de volledige code die ik nu heb:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
error_reporting(E_ALL);
 
 $limit = 20;
  if (isset($_GET["page"] ))
      {

      $page  = $_GET["page"];
      }

  else
     {
      $page=1;
     };
  
 

 $record_index= ($page-1) * $limit;  
 $sql = "SELECT * FROM REPORTS LIMIT $record_index, $limit";
 $stmt = $db->query($sql);

 while($row = $stmt->fetchArray(SQLITE3_ASSOC) )
 {

        $status = $row['Status'];
        if($status==1)
        {

          echo "<tr class='success'>";
          echo "<td>". $row['ID'] . "</td>";
          echo "<td>Open</td>";
        }

        elseif($status==0)
        {

          echo "<tr class='warning'>";
          echo "<td>". $row['ID'] . "</td>";
          echo "<td>Pending</td>";
        }

        elseif($status==2)
        {

          echo "<tr class='danger'>";
          echo "<td>". $row['ID'] . "</td>";
          echo "<td>Closed</td>";
        }

       echo "<td>". $row['PlayerName'] . "</td>";
       echo "<td>". $row['Reporter'] . "</td>";
       echo "<td>". $row['Report'] . "</td>";
       echo "<td>". $row['Date'] . "</td>";
       echo "<td><a href='index.php?p=viewreport&id=". $row['ID'] . "'><button class='btn btn-info'>View report</button></a>&nbsp;";
       echo "<a href='index.php?p=deletereport&id=". $row['ID'] . "'><button class='btn btn-danger'>Delete</button></a></td>";
       echo "</tr>";
 }


 
 $stmt->finalize();

 $sql = "SELECT COUNT(*) FROM REPORTS";
  $stmt = $db->query($sql);  
$row = $stmt->fetchArray(SQLITE3_ASSOC);  
    //  echo $total_records;
$total_pages = ceil($countrows / $limit);  
//$pagLink = "<div class='pagination'>";  
for ($i=1; $i<=$total_pages; $i++) {  

    echo "<p align='center'><ul class='pagination'>";
    if($page != 1)
    {

    echo "<li><a href='index.php?p=admin&option=reports&page=".($page-1)."' class='button'>Previous</a></li>";
    }

    echo "<li><a href='index.php?p=admin&option=reports&page=".$page."'>Page ".$page."</a></li>";
    echo "<li><a href='index.php?p=admin&option=reports&page=".($page+1)."' class='button'>Next</a></li></p>";


    echo"</ul>";              
};

 $db->close();
?>
 
- Ariën  -
Beheerder

- Ariën -

24/02/2018 08:37:14
Quote Anchor link
Jasper, kijk eens goed naar je script: En dan vooral naar $total_pages en je $_GET['page'].

En ik denk dat het wenselijk is om de for-loop alleen maar van de oplopende nummers uit $total_pages te voorzien. De linkjes 'next' en 'previous' horen daar niet in. Alleen wel weer een statement om de huidige pagina in de rij getallen visueel duidelijk te maken met een vergelijking tussen $_GET['page'] en $total_page.
Gewijzigd op 24/02/2018 08:47:16 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

24/02/2018 12:07:03
Quote Anchor link
Jasper Schellekens op 24/02/2018 02:06:02:
De veldnamen kloppen wel eigenlijk. Geen idee wat de fout was. Denk dat het een baggere tutorial was want had hem zo uit de tutorial overgenomen.

Dus je knipt en plakt iets dat meer dan tien jaar oud is en wat tevens geschreven is voor een andere database, en het werkt niet direct? Dat moet wel aan de tutorial liggen dan :).

Jasper Schellekens op 24/02/2018 00:09:24:
geen idee

Mogelijk ligt hier de oorzaak. Als je iets niet begrijpt, maakt het dat niet noodzakelijkerwijs fout.

Ik vraag mij sterk af of je uberhaupt de moeite hebt genomen om de begeleidende tekst te lezen. Ook onderschat je waarschijnlijk de tijd en moeite die is gaan zitten in het schrijven van deze tutorial die probeert duidelijk uit te leggen wat het concept "pagina-navigatie" nu precies inhoudt. Iets met niet verder kijken dan je neus lang is.

Los van het feit dat de code gedateerd is (ik zou het e.e.a. anders aanpakken tegenwoordig) is het idee nog steeds hetzelfde.

Als je het idee begrijpt, dan lijkt het mij niet zo lastig om dit te vertalen naar hedendaagse code, met mogelijk specifieke aanpassingen voor een SQLITE-database.

EDIT: enne,
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$status = $row['Status'];
if($status==1)
{
  echo "<tr class='success'>";
  echo "<td>". $row['ID'] . "</td>";
  echo "<td>Open</td>";
}
elseif($status==0)
{
  echo "<tr class='warning'>";
  echo "<td>". $row['ID'] . "</td>";
  echo "<td>Pending</td>";
}
elseif($status==2)
{
  echo "<tr class='danger'>";
  echo "<td>". $row['ID'] . "</td>";
  echo "<td>Closed</td>";
}

dat kan wel wat korter anders he? Of liever gezegd, het is niet zinnig om iets wat je op eenzelfde (maar inhoudelijk verschillende) manier wordt weergegeven in drie template-snippets te zetten.

Ook doe je er verstandig aan om ampersands in hyperlinks te encoden als &amp; ten einde misinterpretatie te voorkomen.

Daarnaast is het echt nergens voor nodig om al die lappen HTML te echo'en. Je kunt PHP-blokken op elk moment staken en weer voortzetten.

Schot voor de boeg: scheid applicatielogica en presentatielogica:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
switch ($row['Status']) {
    case
0:
        $class = 'warning';
        $text = 'Pending';
    break;
    case
1:
        $class = 'success';
        $text = 'Open';
    break;
    case
2:
        $class = 'danger';
        $text = 'Closed';
    break;
}

?>
<tr class="<?php echo $class ?>">
    <td><?php echo $row['ID'] ?></td>
    <td><?php echo $text ?></td>
</tr>
Gewijzigd op 24/02/2018 12:35:08 door Thomas van den Heuvel
 
Jasper Schellekens

Jasper Schellekens

24/02/2018 12:49:51
Quote Anchor link
Bedankt voor jullie reacties.

Toevoeging op 24/02/2018 13:19:04:

Door te debuggen ben ik erachter gekomen dat $total_pages altijd 1 is omdat countrows ook 1 was.
Ik probeerde de rows te tellen doormiddel van countrows++; maar helaas werkt dat niet.
Nu probeer ik het volgende, van de volgende pagina maar krijg de volgende errors
http://www.nusphere.com/kb/phpmanual/function.sqlite-num-rows.htm

Zie ik nou iets over het hoofd of wat doe ik verkeerd?

$countrows = sqlite_num_rows($stmt);
Dit geeft error Fatal error: Call to undefined function sqlite_num_rows() in D:\AppServ\www\ucp\reports.php on

$countrows = $stmt->numRows();
Dit geeft error Fatal error: Call to undefined method SQLite3Result::numRows() in D:\AppServ\www\ucp\reports.php on line 62




Toevoeging op 24/02/2018 13:29:16:

Ik heb het opgelost. Mocht iemand interesse hebben in de oplossing:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
    function SqliteNumRows($query){
        $numRows = 0;
        while($rows = $query->fetchArray()){
            ++
$numRows;
        }

        return $numRows;
    }

?>

$countrows = SqliteNumRows($stmt);
Gewijzigd op 24/02/2018 13:26:13 door Jasper Schellekens
 
Thomas van den Heuvel

Thomas van den Heuvel

24/02/2018 14:55:10
Quote Anchor link
Dat lijkt mij geen goede oplossing. Daarmee tel je alle rijen, wat nogal overkill is.

In een voorgaand codefragment staat $countrows ook nergens gedefinieerd, weet je zeker dat deze wel een goede waarde krijgt? Hoe wordt die bepaald?

En ja, het aantal resultaatrijen van een COUNT()-query is altijd één, het is de bedoeling dat je van zo'n query het COUNT()-resultaat pakt, en niet het aantal rijen telt.

Zoals je op PHP.net kunt zien is sqlite_num_rows() / SQLite::numRows() niet standaard meer inbegrepen in PHP vanaf versie 5.4.0:
Quote:
(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)

PDO heeft ook een SQLite driver, maar je zult moeten kijken of die voor jou ook beschikbaar is.
Gewijzigd op 24/02/2018 15:28:12 door Thomas van den Heuvel
 
- Ariën  -
Beheerder

- Ariën -

24/02/2018 15:37:50
Quote Anchor link
Mag ik vragen wat de reden is waarom er SQL-lite wordt gebruikt, in plaats van de MySQLi-driver voor MySQL/MariaDB databases? SQL-Lite kent weer nadelen dat er geen useraccess aan vast zit ("wil je wel delete-rechten hebben binnen je frontend?"), en dat het minder goed te tunen is.

Als je meer wilt weten over MySQL, SQL-lite en PostgreSQL, dan is dit leuk leesvoer:
https://www.digitalocean.com/community/tutorials/sqlite-vs-mysql-vs-postgresql-a-comparison-of-relational-database-management-systems

Ik zie het niet vaak, maar misschien is het natuurlijk een bewust en zorgvuldig gekozen keuze.
Gewijzigd op 24/02/2018 15:42:32 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

24/02/2018 16:08:05
Quote Anchor link
Daar heb ik zou mijn twijfels bij als je SQLite voor een webgame wilt gebruiken:
Quote:
Situations Where A Client/Server RDBMS May Work Better
...
High Concurrency

SQLite supports an unlimited number of simultaneous readers, but it will only allow one writer at any instant in time. For many situations, this is not a problem. Writer queue up. Each application does its database work quickly and moves on, and no lock lasts for more than a few dozen milliseconds. But there are some applications that require more concurrency, and those applications may need to seek a different solution.

Op dezelfde pagina staat ook een checklist waarmee je kunt bepalen in hoeverre SQLite geschikt is voor wat je probeert te doen.

Come to think of it: voor @Hans de Ridder zou SQLite mogelijk wel een geschikt(er) alternatief zijn dan al die IPTC mumbo-jumbo.
Gewijzigd op 24/02/2018 16:12:39 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.