Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Μια περιοχή όπου τα μέλη μας μπορούν να βάζουν τα PHP scripts που έχουν φτιάξει και θέλουν να τα μοιραστούν με τα υπόλοιπα μέλη.

Συντονιστές: Super-Moderators, WebDev Moderators, PHP Moderators

Απάντηση
panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από panosru » 17 Απρ 2007 15:53

Επειδή παρατήρησα ότι πολλοί χρηστες έχουν προβλήματα με το pagination είπα να γράψω στον λιγοστό χρόνο που έχω το τελευταίο καιρό ένα παράδειγμα, ίσος φανεί χρήσιμο σε μερικούς.

Προτού αρχίσω να δηλώσω πως δουλεύω με UTF8 γενικά, το παράδειγμα όμως δεν περιορίζεται εκεί απλά κάντε τις κατάλληλες αλλαγές για τα δικά σας character sets

Για το παράδειγμα δημιούργησα μια βάση και την ονόμασα paggination

SQL query:

Κώδικας: Επιλογή όλων

CREATE DATABASE `paggination` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Έπειτα δημιούργησα ένα πινακα με το όνομα `data`

SQL query:

Κώδικας: Επιλογή όλων

CREATE TABLE `data` (
	`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
	`user` VARCHAR( 100 ) NOT NULL
) ENGINE = MYISAM ;
Εφόσον δημιουργήσαμε τον πινακα πρέπει να βάλουμε δεδομένα.

Ας βάλουμε λοιπόν καμια εκατοστή ονόματα.

Κώδικας: Επιλογή όλων

INSERT INTO data (user) VALUES ('Mari'), ('Grace'), ('Davis'), ('Leigh'), ('Aimee'), ('Timon'), ('Jocelyn'), ('Uriah'), ('Xenos'), ('Rose'), ('Peter'), ('Irene'), ('Kimberly'), ('Baker'), ('Nicholas'), ('Carissa'), ('McKenzie'), ('Dustin'), ('Hiram'), ('Paloma'), ('Carl'), ('Brent'), ('Joseph'), ('Felicia'), ('Kaitlin'), ('Orlando'), ('Chanda'), ('Jayme'), ('Tucker'), ('Xyla'), ('Herman'), ('Kirk'), ('Fritz'), ('Martin'), ('Burke'), ('Geraldine'), ('Kristen'), ('Madison'), ('Dora'), ('Keelie'), ('Iris'), ('Alden'), ('Xavier'), ('Zelenia'), ('Blossom'), ('Michael'), ('Callum'), ('Quin'), ('Wesley'), ('Kitra'), ('Kadeem'), ('Boris'), ('Moana'), ('Abbot'), ('Imogene'), ('Charlotte'), ('Orson'), ('Lucian'), ('McKenzie'), ('Mary'), ('Leah'), ('Anne'), ('Clarke'), ('Troy'), ('Nicole'), ('Gary'), ('Devin'), ('Destiny'), ('Xanthus'), ('Kelsie'), ('Reed'), ('Hollee'), ('Kyla'), ('Preston'), ('Helen'), ('Merrill'), ('Indira'), ('Kieran'), ('Ingrid'), ('Harriet'), ('Beverly'), ('Vivian'), ('Joshua'), ('Rana'), ('Vladimir'), ('Ursula'), ('Xavier'), ('Mohammad'), ('Kelsey'), ('Maggie'), ('Francesca'), ('Bree'), ('Moses'), ('Kellie'), ('Alice'), ('Hayes'), ('Stuart'), ('Emerald'), ('Mason'), ('Shad');

Στην συνεχεια αν δουλεύουμε σε περιβάλλον PHP4 ο παρακάτω κώδικας είναι αυτός εκ τον οποιο θα παραδειγματιστούμε.

Κώδικας: Επιλογή όλων

<?php

// Connect to Database
$cID = @mysql_connect&#40;'localhost','root','admin'&#41;;

// Select Database
mysql_select_db&#40;'paggination'&#41;;

// Define Character set
mysql_query&#40;"SET CHARACTER SET 'utf8'",$cID&#41;;
mysql_query&#40;"SET NAMES 'utf8'",$cID&#41;;

// Get page
$page = $_GET&#91;'page'&#93;;

// If page is not defined we are on page 1
if &#40;$page <= 0&#41; $page = 1;

// Define how much lines per page we are showing &#40;lpr = Lines Per Page&#41;
$lpr = 25;

// Define start, depends on what page we are viewing
$start = &#40;$page * $lpr&#41; - $lpr;

// Define our queries &#40;qp1, qp1 &#123;= Query Part 1 / Query Part 2&#125;&#41;
$qp1 = "SELECT * FROM `data`";
$qp2 = sprintf&#40;"%s ORDER BY `id` DESC LIMIT %d,%d",$qp1,$start,$lpr&#41;;

// Count all rows from `data` table
$getDataLen = mysql_num_rows&#40;mysql_query&#40;$qp1&#41;&#41;;

// Calculate how many pages will be shown
$pages = $getDataLen / $lpr;

// Get ALL from table `data`
$getData = mysql_query&#40;$qp2,$cID&#41;;

// Show users
while &#40;$rows = mysql_fetch_assoc&#40;$getData&#41;&#41;
&#123;
	echo $rows&#91;'user'&#93;.'<br />';
&#125;
echo '<hr />';

// Define First Page link
if &#40;$page > 1&#41;
	echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=1\" title=\"Go to first page\">First Page</a> | ";

// Define previous link
if &#40;$page > 1&#41;
	echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=".&#40;$page - 1&#41;."\" title=\"Go to page ".&#40;$page - 1&#41;."\">Previous</a> | ";
	
// List pages
for &#40;$pageList = 1; $pageList <= $pages; $pageList++&#41;
&#123;
	if &#40;$pageList != $page&#41;
	&#123;
		// Link to page
		echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=&#123;$pageList&#125;\" title=\"Go to page &#123;$pageList&#125;\">&#123;$pageList&#125;</a> | ";
	&#125;
	else
	&#123;
		// Show curent page with strong markup
		echo "<strong>&#123;$pageList&#125;</strong> | ";
	&#125;
&#125;

// Define next link
if &#40;$page != ceil&#40;$pages&#41;&#41;
	echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=".&#40;$page + 1&#41;."\" title=\"Go to page ".&#40;$page + 1&#41;."\">Next</a> | ";

// Define Last Page link
if &#40;$page != ceil&#40;$pages&#41;&#41;
	echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=".ceil&#40;$pages&#41;."\" title=\"Go to last page\">Last Page</a> ";
	
	
// Close link to database
mysql_close&#40;$cID&#41;;
?>
Αν δουλεύουμε σε περιβάλλον PHP5 (5.1 και πάνω) ναι μεν ο παραπάνω κώδικας λειτουργεί χωρίς καμια διαφορα και στην PHP5 αλλα θα ήταν καλύτερο να εκμεταλλευτούμε τις νέες μας δυνατότητες οποτε ο παρακάτω κώδικας είναι για PHP5

Κώδικας: Επιλογή όλων

<?php

// Connect to Database &#40;dbh = Data Base Handler&#41;
/**
 * PDO&#58;&#58;ATTR_PERSISTENT is set to true because of, php.net/pdo says&#58;
 * Many web applications will benefit from making persistent connections to database servers. 
 * Persistent connections are not closed at the end of the script, but are cached and re-used 
 * when another script requests a connection using the same credentials. 
 * The persistent connection cache allows you to avoid the overhead of establishing 
 * a new connection every time a script needs to talk to a database, resulting in a faster web application. 
 */
$dbh = new PDO&#40;'mysql&#58;host=localhost;dbname=paggination','root','admin', array&#40;PDO&#58;&#58;ATTR_PERSISTENT => true&#41;&#41;;

// Define Character set
$dbh->query&#40;"SET CHARACTER SET 'utf8'"&#41;;
$dbh->query&#40;"SET NAMES 'utf8'"&#41;;

// Get page
$page = $_GET&#91;'page'&#93;;

// If page is not defined we are on page 1
if &#40;$page <= 0&#41; $page = 1;

// Define how much lines per page we are showing &#40;lpr = Lines Per Page&#41;
$lpr = 25;

// Define start, depends on what page we are viewing
$start = &#40;$page * $lpr&#41; - $lpr;

// Define our queries &#40;qp1, qp1 &#123;= Query Part 1 / Query Part 2&#125;&#41;
$qp1 = "SELECT * FROM `data`";
$qp2 = sprintf&#40;"%s ORDER BY `id` DESC LIMIT &#58;start,&#58;limit",$qp1&#41;;

// Prepare our queries
$q1 = $dbh->prepare&#40;$qp1&#41;;
$q2 = $dbh->prepare&#40;$qp2&#41;;

// Bind params to q2 &#40;Query 2&#41;
$q2->bindParam&#40;'&#58;start',$a&#41;;
$q2->bindParam&#40;'&#58;limit',$b&#41;;


// Execute queries

// Execute Query 1
$q1->execute&#40;&#41;;

// Execute Query 2

// Define params for Query 2
$a = $start;
$b = $lpr;
$q2->execute&#40;&#41;;


// Count all rows from `data` table
/**
 * I would like to use rowCount function but as shown at php.net...
 * 
 * If the last SQL statement executed by the associated PDOStatement was a SELECT statement, 
 * some databases may return the number of rows returned by that statement. 
 * However, this behaviour is not guaranteed for all databases and should not be relied on for 
 * portable applications.
 * 
 * We could use $getDataLen = $q1->rowCount&#40;&#41;; but it returns me a zero so we use the folowing
 * 
 * I fetch all data with PDO&#58;&#58;FETCH_NUM, just because here we don't need any data to display.
 */ 
$getDataLen = count&#40;$q1->fetchAll&#40;PDO&#58;&#58;FETCH_NUM&#41;&#41;;

// Calculate how many pages will be shown
$pages = $getDataLen / $lpr;

// Get ALL from table `data`
$getData = $q2->fetchAll&#40;PDO&#58;&#58;FETCH_ASSOC&#41;;

// Define usersShow function for array walker
function usersShow &#40;&$item, $key, $params&#41;
&#123;
	echo $params.$item&#91;'user'&#93;.'<br />';
&#125;

// Create array walker
array_walk&#40;$getData,'usersShow','User &#58; '&#41;;

// Adding a seperator
echo '<hr />';

// Define First Page link
if &#40;$page > 1&#41;
	echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=1\" title=\"Go to first page\">First Page</a> | ";

// Define previous link
if &#40;$page > 1&#41;
	echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=".&#40;$page - 1&#41;."\" title=\"Go to page ".&#40;$page - 1&#41;."\">Previous</a> | ";
	
// List pages
for &#40;$pageList = 1; $pageList <= $pages; $pageList++&#41;
&#123;
	if &#40;$pageList != $page&#41;
	&#123;
		// Link to page
		echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=&#123;$pageList&#125;\" title=\"Go to page &#123;$pageList&#125;\">&#123;$pageList&#125;</a> | ";
	&#125;
	else
	&#123;
		// Show curent page with strong markup
		echo "<strong>&#123;$pageList&#125;</strong> | ";
	&#125;
&#125;

// Define next link
if &#40;$page != ceil&#40;$pages&#41;&#41;
	echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=".&#40;$page + 1&#41;."\" title=\"Go to page ".&#40;$page + 1&#41;."\">Next</a> | ";
	
// Define Last Page link
if &#40;$page != ceil&#40;$pages&#41;&#41;
	echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=".ceil&#40;$pages&#41;."\" title=\"Go to last page\">Last Page</a> ";
	
?>
Αυτά από μένα, οτιδήποτε απορίες κτλ υπάρχουν ποστάρετε εδώ.

Για να γεμίσω τον πινακα με δεδομένα χρησιμοποίησα ένα web application το οποιο βρήκα τυχαία στο internet και πλέον είναι από τα favorites μου.
Το app αυτό ονομάζεται Data Generator και είναι εκπληκτικά βολικό όταν είναι να κανεις beta testing και ψάχνεσαι για δεδομένα!

PS: Τα comments στον κώδικα ουσιαστικά αναλύουν το παράδειγμα, τα έγραψα στα αγγλικά επειδή προοριζόταν για άλλο θέμα εξαρχής οποτε το ποστάρω και εδώ.
Τελευταία επεξεργασία από το μέλος panosru την 29 Ιούλ 2007 16:49, έχει επεξεργασθεί 1 φορά συνολικά.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από panosru » 26 Απρ 2007 02:28

To metafero sto PHP τα δικά μας scripts gia na exete kalyterh prosbash s' ayto. Telika fanike xrhshmo se kanenan? :P

Άβαταρ μέλους
midas
Δημοσιεύσεις: 25
Εγγραφή: 25 Μάιος 2007 20:35

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από midas » 22 Ιουν 2007 13:00

To βρήκα πολύ χρήσιμο, μιας και μόλις έχω ξεκινήσει να γράφω δυναμικές σελίδες!

Ευχαριστώ!

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1950
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από vassilism » 21 Ιούλ 2007 22:08

Panosru σ&#8217;ευχαριστούμε πολύ γιαυτό το script.
Δεν είναι απλά χρήσιμο αλλά χρησιμότατο.
Έχω όμως μια απορία.
Προσπαθώ να κάνω link και να με πηγαίνει στην πρώτη και την τελευταία σελίδα, αλλά δεν τα καταφέρνω. Μπορείς να βοηθήσεις?

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από panosru » 25 Ιούλ 2007 02:55

Ela file mou nai pes mou ligo perisoteres leptomeries omos. An katalaba kala psaxneis na breis ena tropo na baleis first page kai last page sosta? An nai me thn 1h euakria tha to ftiakso kai tha ananeoso tous parapano kodikes kai gia php4 kai gia php5 gia na to deis pos ginete, kai fysika tha balo comments me epeksighsh opos kai sta parapano.

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1950
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από vassilism » 25 Ιούλ 2007 21:06

Αυτό ακριβώς εννοώ.
Σ'ευχαριστώ εκ των προτέρων.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από panosru » 29 Ιούλ 2007 16:50

Ok, ta prosthesa stous parapano kodikes, se diaforetika if statments tha mporousan na mpoun kai sta if statments ton next kai previous links antistoixa, anyway tropopoihste ta opos sas boleyoun.

Άβαταρ μέλους
_Invisible_
Δημοσιεύσεις: 418
Εγγραφή: 16 Νοέμ 2006 16:47
Τοποθεσία: Greece

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από _Invisible_ » 10 Αύγ 2007 13:25

Καλός ο panos! Το pagination είναι πραγματικά πολύ χρήσιμο, γιατί πχ σε ένα search δεν μπορείς να πετάξεις 50 εκατομμύρια αποτελέσματα σε μία σελίδα... Θα βάζεις 25 results per page.

Πολλές εφαρμογές χρησιμοποιούν paging και είναι πολύ χρήσιμο.

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1950
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από vassilism » 14 Αύγ 2007 20:11

Pano σ'ευχαριστούμε πολύ που έκατσες και ασχολήθηκες.
Είναι πάρα πολύ χρήσιμό αυτό το script.

Άβαταρ μέλους
avr_freak
Δημοσιεύσεις: 70
Εγγραφή: 13 Αύγ 2006 18:58
Επικοινωνία:

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από avr_freak » 11 Σεπ 2007 09:36

panorsu thanks gia to scriptaki me apallaxe apo polli basano :) ... Etsi gia kathara logous gnosis mporis na exigisis pos doulevei se adres grammes ?

Thanks again man !!!

Άβαταρ μέλους
p_pan
Δημοσιεύσεις: 1248
Εγγραφή: 11 Φεβ 2007 20:45
Τοποθεσία: Άστεγος!

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από p_pan » 30 Σεπ 2007 23:39

mprabo re.... polu sosta ekanes kai to egraces.. epanilimenes fores eixa zitisei na m ejigisi kapoios pos ginete na kanei selidopoihsh se dedomena proerxomena apo basi dedomenon alla oloi me paretrepan se kapoia allh selida p sto telos den ebgaza apotelesma.... ontos an kai den to polu ecaxa to script s mprabo kai mono gia tin protoboulia s...
Αγράματος...

Άβαταρ μέλους
Risk
Δημοσιεύσεις: 319
Εγγραφή: 02 Μάιος 2006 01:16
Τοποθεσία: Κάπου εδώ γύρω...
Επικοινωνία:

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από Risk » 02 Οκτ 2007 20:59

Respect panosru! Έγινε ήδη bookmarking!!!
Εικόνα

Άβαταρ μέλους
p_pan
Δημοσιεύσεις: 1248
Εγγραφή: 11 Φεβ 2007 20:45
Τοποθεσία: Άστεγος!

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από p_pan » 03 Νοέμ 2007 22:21

hello...
panosru 8a h8ela na s po oti to script exei ena la8aki... stin for pou exeis ftiajei gia na emfanizete h lista me tis selides... den emfanizei tin teleutaia... dld...
as poume oti exoume sinolo 6 selides...
emfanizei apo 1 eos 5 kai stin pemti emfanizei pali link gia next page pou se paei stin 6 kai teleutaia selida... mipos mporeis na boh8iseis gt den katafera na kano tpt...
Αγράματος...

Άβαταρ μέλους
afroditi590
Δημοσιεύσεις: 123
Εγγραφή: 08 Ιαν 2007 11:52

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από afroditi590 » 16 Ιαν 2008 13:15

Σε ευχαριστώ πολύ για το πολύ χρήσιμο και αναλυτικό script. :respect: :respect:

p_pan εγώ για να δείχει και την τελευταία σελίδα άλλαξα κάτι στη for, πρόσθεσα το +1 και έτσι δίχνει και την τελευταία σελίδα

Κώδικας: Επιλογή όλων

// List pages
for &#40;$pageList = 1; $pageList <= $pages+1; $pageList++&#41;
&#123;
   if &#40;$pageList != $page&#41;
   &#123;
      // Link to page
      echo "<a href=\"&#123;$_SERVER&#91;'PHP_SELF'&#93;&#125;?page=&#123;$pageList&#125;\" title=\"Go to page &#123;$pageList&#125;\">&#123;$pageList&#125;</a> | ";
   &#125;
   else
   &#123;
      // Show curent page with strong markup
      echo "<strong>&#123;$pageList&#125;</strong> | ";
   &#125;
&#125;

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1950
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

Σελιδοποίηση αποτελεσμάτων από βάση δεδομένων

Δημοσίευση από vassilism » 21 Φεβ 2008 21:53

Θα ήθελα να κάνω μια ερώτηση.

Μπορούμε να προσαρμόσουμε το παραπάνω script έτσι ώστε να δείχνει τις σελίδες πχ ανά 5?

Δηλαδή εκεί που κάνει αυτό:
First Page |Previous | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Next |Last Page
Να κάνει αυτό:
First Page |Previous | 1 2 3 4 5 Next |Last Page
Μετά:
First Page |Previous | 6 7 8 9 10 Next |Last Page
Μετά:
First Page |Previous | 11 12 13 14 15 Next |Last Page

Απάντηση

Επιστροφή στο “PHP τα δικά μας scripts”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης