Pages

Thursday, October 7, 2010

Pagination (Σελιδοποίηση) με την PHP

Αν και δεν το θεωρώ απαραίτητο, καθώς λίγο-πολύ ο τίτλος είναι αρκετά σαφής, ας εξηγήσω τι θα δείξω σε αυτό το post.

Έστω ότι έχουμε ένα κατάστημα, και σε κάθε κατηγορία έχουμε πολλά προϊόντα.
Μπορούμε να τα εμφανίσουμε όλα μαζί σε μια σελίδα, το οποίο ειναι και το πιο εύκολο, ή μπορούμε να το κάνουμε να εμφανίζει 10-15-20 προϊόντα κάθε φορά, το οποίο είναι λίγο πιο περίπλοκο αλλά ταυτόχρονα και το πιο σωστό και χρηστικό.

Για να γίνει αυτό θα χρησιμοποιήσουμε τον τελεστή LIMIT της mysql.

Αυτός ο τελεστής μπορεί να πάρει 1 ή 2 ορίσματα, και λειτουργεί ως εξής:



Δίνοντας 2 ορίσματα, το 1ο είναι από ποια εγγραφή και μετά να διαβάσει, ενώ το 2ο είναι πόσες εγγραφές να διαβάσει.

Δίνοντας 1 όρισμα, τότε απλά προσδιορίζουμε πόσες εγγραφές θέλουμε να διαβάσουμε από την αρχή.

Στην προκειμένη περίπτωση χρησιμοποιούμε 2 ορίσματα, προσδιορίζοντας με αυτόν τον τρόπο και από ποια εγγραφή να ξεκινήσει να διαβάζει και πόσες να διαβάσει.

Η όλη ιδέα λειτουργεί ως εξής:

  • Μετράμε πρώτα πόσες είναι όλες οι εγγραφές.
  • Ορίζουμε μια μεταβλητή η οποία θα είναι το πλήθος των εγγραφών που θα εμφανίζονται ανά σελίδα.
  • Ελέγχουμε σε ποια σελίδα βρισκόμαστε τώρα.
  • Προσδιορίζουμε το από ποια εγγραφή θέλουμε να ξεκινήσουμε την ανάγνωση
  • Κάνουμε το ερώτημα χρησιμοποιώντας τον τελεστή LIKE.
  • Τέλος εμφανίζουμε τα αποτελέσματα, μαζί με links για την πλοήγηση στα αποτελέσματα.


Ιδού και ο κώδικας:

<?php
    $con = mysql_connect("localhost", "root", "root");
    if($con)
    {
        if(mysql_select_db("tests",$con))
        {

            $maxPerPage = 10;

            //Vlepoume to plithos twn eggrafwn
            $query = "SELECT * FROM pagination";
            $res = mysql_query($query);
            $rows = mysql_num_rows($res);


            //se periptwsi pou exoume zitisei kapoia sygkekrimeni selida
            //tote pairnoume tin zitoumeni, alliws pairnoume tin 1i
            if(isset($_GET['page']))
            {
                $curPage = $_GET['page'];
            }
            else
            {
                $curPage = 1;
            }

            //Ypologizoume apo poia eggrafi kai meta na diavasei
            $startFrom = ($curPage-1) * $maxPerPage;
            $query = "SELECT item_name FROM pagination LIMIT $startFrom, $maxPerPage";

            $res = mysql_query($query);
            if($res)
            {
                $data = array();
                while($row = mysql_fetch_object($res))
                {
                    $data[] = $row;
                }
            }

            //i teleutaia selida einai i diairesi tou plithous twn eggrafwn
            //me ton arithmo twn eggrafwn ana selida, stroggulopoiimeno
            //ston epomeno akeraio
            $lastPage = ceil($rows/$maxPerPage);
        }
    }
?>


<html>
    <head>
        <title>Pagination with PHP</title>
    </head>

    <body>
        <?php

            //kai telos emfanizoume ta apotelesmata
            echo "<ul>";
            foreach($data as $tmpRow)
            {
                echo "<li>". $tmpRow->item_name ."</li>";
            }
            echo "</ul>";

            echo "Page $curPage from $lastPage <br />";
            if($curPage != 1)
            {
                echo "<a href='". $_SERVER['PHP_SELF'] ."?page=". ($curPage-1) ."'><< Previous</a> &nbsp;";
            }
            if($curPage != $lastPage)
            {
                echo "<a href='". $_SERVER['PHP_SELF'] ."?page=". ($curPage+1) ."'>Next >></a>";
            }
        ?>

    </body>


</html>



Το παραπάνω μπορεί να γίνει πλήρως παραμετροποιήσιμο έτσι ώστε να πάρει την μορφή συνάρτησης και να μη γράφεται συνέχεια ο ίδιος κώδικας.

Τον κώδικα μπορείτε να τον κατεβάσετε από εδώ:

http://www.mediafire.com/?3h37d3kx4j0f1md


Σχόλια και προτάσεις ευπρόσδεκτα.

No comments:

Post a Comment