Η σελίδα μας αναβαθμίστηκε, γι' αυτό τον λόγο τα μέλη μας θα πρέπει να ζητήσουν νέο κωδικό πρόσβασης από την υπηρεσία "Αποστολή κωδικού πρόσβασης".
Εάν το email με τον νέο κωδικό δεν έρθει στο inbox κοιτάξτε και στο spam folder. Ο server είναι φρέσκος και δεν έχει το reputation που του αξίζει.

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

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

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

Απάντηση
Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

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

Δημοσίευση από korgr » 15 Οκτ 2008 19:17

Με την ευκαιρία που ήρθε το topic αυτό στην επιφάνεια (και έτσι το είδα και εγώ), ας συνεισφέρω και εγώ κάτι.
Πριν από μερικές μέρες είχα δημοσιεύσει ένα pagination tutorial στο vcdc.gr το οποίο κατά τύχη είναι νοητή συνέχεια αυτού που δημοσίευσε εδώ ο panosru. Αν λοιπόν έχουμε τις δύο σημαντικές μεταβλητές ($getDataLen ==> πόσα αποτελέσματα έχουμε και $lpr ==> ανά πόσα θα εμφανίζονται σε κάθε σελίδα), έρχεται να αναλάβει η δική μου function:

function pagination($numrows, $rows_per_page, $hasdetails, $qstring)

Τα ορίσματα είναι:
$numrows σύνολο εγγραφών δηλαδή η $getDataLen
$rows_per_page ανά πόσες εγγραφές θα αλλάζουμε σελίδα, δηλαδή η $lpr
$hasdetails (true/false) αν θέλουμε να εμφανίζει τους extra headers "Βρέθηκαν χ εγγραφές (Σελίδα χ από χ)
$qstring οποιεσδήποτε άλλες GET μεταβλητές θέλουμε να περνάμε από σελίδα σε σελίδα, χωρισμένες με κόμμα (πχ $qstring = 'section,category,mode')

Δυνατότητες:
first page- previous page- next page- last page
εμφάνιση τρέχουσας σελίδας πλαισιωμένη από χ σελίδες προς κάθε κατεύθυνση

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

<?
function pagination&#40;$numrows, $rows_per_page, $hasdetails, $qstring&#41;&#123;
if&#40;!$numrows || !$rows_per_page&#41; &#123; return; &#125;
$qstring = &#40;$qstring != ''&#41; ? buildquerystring&#40;$qstring&#41; &#58; '' ; // αν υπάρχουν μεταβλητές να κτισθεί το Query String
$page = &#40;isset&#40;$_GET&#91;'page'&#93;&#41;&#41; ? $_GET&#91;'page'&#93; &#58; 1; // αν δεν έχει δωθεί η μεταβλητή $page να ορισθεί ως 1 &#40;πρώτη&#41;
$lastpage = ceil&#40;$numrows/$rows_per_page&#41;; // υπολογισμός του αριθμού της τελευταίας σελίδας αποτελεσμάτων
$page = &#40;int&#41;$page; // η $page να είναι πάντα ακέραιος
$page = &#40;$page > $lastpage&#41; ? $lastpage &#58; $page; //έλεγχος αν η μεταβλητή $page ισούται με την τελευταία σελίδα
$page = &#40;$page < 1&#41; ? 1 &#58; $page; // έλεγχος αν η μεταβλητή $page είναι μικρότερη από 1
$offset = 5; // πόσες σελίδες να εμφανίζονται ως προηγούμενες και επόμενες σε σχέση με την τρέχουσα σελίδα &#40;$page&#41;
$leftoffset = &#40;&#40;$page-$offset&#41; > 0&#41; ? $offset &#58; $page-1; // αριθμός εμφανιζόμενων σελίδων αριστερά από την τρέχουσα
$rightoffset = &#40;&#40;$page+$offset&#41; < $lastpage &#41; ? $offset &#58; $lastpage-$page; // αριθμός εμφανιζόμενων σελίδων δεξιά από την τρέχουσα

if&#40;$hasdetails&#41;&#123;
echo&#40;"<div class='pages'>Βρέθηκαν $numrows αποτελέσματα &#40;Σελίδα $page από $lastpage&#41;</div>"&#41;;
echo&#40;"<div class='free'></div>"&#41;;
&#125;
if&#40;$numrows > $rows_per_page&#41;&#123; // εμφάνιση μόνο αν τα αποτελέσματα δεν χωράνε σε μία σελίδα
echo&#40;"<div class='pagination'>"&#41;;
echo&#40;"<p class='container'>"&#41;;

if&#40;$page > 1&#41; &#123;
if&#40;$page > 2&#41; &#123;
echo&#40;"<a href='?page=1$qstring' class='startarrow' title='πρώτη σελίδα'><<</a>"&#41;;
&#125;
$p = $page-1;
echo&#40;"<a href='?page=$p$qstring' class='larrow' title='προηγούμενη σελίδα'><</a>"&#41;;
&#125;
for&#40;$n=$page-$leftoffset; $n<$page; $n++&#41;&#123;
echo&#40;"<a href='?page=$n$qstring'  title='μετάβαση στη σελίδα $n'>$n</a>"&#41;;
&#125;
echo&#40;"<a href='#' onClick='return false;' class='current'>$page</a>"&#41;;
$p = $page+1;
for&#40;$n=$p; $n<=$page+$rightoffset; $n++&#41;&#123;
echo&#40;"<a href='?page=$n$qstring'  title='μετάβαση στη σελίδα $n'>$n</a>"&#41;;
&#125;
if&#40;$page < $lastpage&#41; &#123;
echo&#40;"<a href='?page=$p$qstring' class='rarrow' title='επόμενη σελίδα'>></a>"&#41;;
if&#40;$page < $lastpage-1&#41;&#123;
echo&#40;"<a href='?page=$lastpage$qstring' class='lastarrow' title='τελευταία σελίδα'>>></a>"&#41;;
&#125;
&#125;
echo&#40;"</p>"&#41;;
echo&#40;"</div><div class='free'></div>"&#41;;
&#125;
&#125; // end of function


function buildquerystring &#40;$vars&#41;&#123;
$temparray= explode &#40;',', $vars&#41;;
$qs="&";
for&#40;$i=0; $i < sizeof&#40;$temparray&#41;; $i++&#41;&#123;
if&#40;$temparray&#91;$i&#93;&#41;&#123;
global $&#123;$temparray&#91;$i&#93;&#125;;
$qs.=$temparray&#91;$i&#93;."=".$&#123;$temparray&#91;$i&#93;&#125;."&";
&#125;
&#125;
$querystring=substr&#40;$qs, 0, strlen&#40;$qs&#41;-1&#41;;
return $querystring;
&#125; // end of function

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>pagination</title>
<link rel="stylesheet" type="text/css" href="pagination.css" media="all" />
</head>
<body style="margin&#58; 20px">
<?


// -----κάποιες μεταβλητές που θέλουμε να περάσουμε στο QUERY STRING ----------
$section=2;
$category=5;
$mode="advanced_search";
// ----------------------------------------------------------------------------------------------------



$vars='section,category,mode'; // Τα ονόματα των μεταβλητών που θέλουμε να περνάμε στα query strings με GET Method, χωρισμένα με κόμμα &#40;,&#41;

pagination&#40;300, 20, true, $vars&#41;; //δημιουργία pagination για 300 συνολικές εγγραφές παρουσιαζόμενες ανά 20 με εμφάνιση details
?>
<br><br><br><br><br><br><br><br><br><br><div align="center">Παρουσίαση αποτελεσμάτων...</div><br><br><br><br><br><br><br><br><br><br>
<?
pagination&#40;300, 20, false, $vars&#41;; //δημιουργία pagination για 300 συνολικές εγγραφές παρουσιαζόμενες ανά 20 χωρίς εμφάνιση details
?>
</body>
</html>

και το css που μπορείτε να παραμετροποιήσετε:

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

.pagination &#123;
padding&#58; 5px 0;
margin-right&#58; 10px;
&#125;
.pagination a &#123;
font-family&#58; Verdana, Arial;
font-size&#58; 10px;
text-decoration&#58; none;
display&#58; block;
color&#58; #000;
margin&#58; 1px;
float&#58; left;
padding&#58; 1px 10px;
font-weight&#58; bold;
background&#58; url&#40;images/pagination_bg.jpg&#41; 0 0 no-repeat;
&#125;
.pagination a&#58;hover &#123;
color&#58; #fff;
background-position&#58; 0 -20px;
&#125;
.pages &#123;
font-family&#58; Verdana, Arial;
font-size&#58; 10px;
color&#58; #000;
color&#58; #000;
text-align&#58; right;
border-bottom&#58; 1px solid;
width&#58; auto;
padding&#58; 7px 0;
margin&#58; 0 10px 0 10px;
&#125;
.free &#123;
clear&#58;both;
&#125;
.pagination .current, .pagination .current&#58;hover&#123;
background-position&#58; 0 -40px;
color&#58; #fff;
cursor&#58; default;
&#125;
.pagination .container&#123;
float&#58; right;
margin&#58; 0;
&#125;
.pagination .larrow &#123;margin-right&#58; 5px;&#125;
.pagination .rarrow &#123;margin-left&#58; 5px;&#125;
.pagination .startarrow &#123;margin-right&#58; 10px;&#125;
.pagination .lastarrow &#123;margin-left&#58; 10px;&#125; 
Live Demo για την εμφάνιση στο:
http://www.vcdc.gr/tests/pagination/

Υπάρχουν στον κώδικα ελληνικά σχόλια για να το φέρετε στα μέτρα σας

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27560
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

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

Δημοσίευση από cordis » 15 Οκτ 2008 22:15

ωραίο!

το έκοψα για να είναι μόνο του, νομίζω το αξίζει ;)
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
Basilakis
PHP Moderator
Δημοσιεύσεις: 8573
Εγγραφή: 17 Νοέμ 2003 13:03
Τοποθεσία: Womans' Brain
Επικοινωνία:

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

Δημοσίευση από Basilakis » 15 Οκτ 2008 23:10

Όμορφο.

Έχει το εξής πρόβλημα. θα πρέπει όταν αυξάνωνται η αριθμού, να κρίβονται κάπιοιυ και να φένονται μόνο οι καινο΄θργιοι... παράδειγμα

1 2 3 4 5 6 7

active η σελίδα 1

όταν είναι active η σελίδα 4 να είναι κάπως έτσι

4 5 6 7 8 9 10

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

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

Δημοσίευση από korgr » 15 Οκτ 2008 23:21

Basilakisweb έγραψε:Όμορφο.

Έχει το εξής πρόβλημα. θα πρέπει όταν αυξάνωνται η αριθμού, να κρίβονται κάπιοιυ και να φένονται μόνο οι καινο΄θργιοι... παράδειγμα

1 2 3 4 5 6 7

active η σελίδα 1

όταν είναι active η σελίδα 4 να είναι κάπως έτσι

4 5 6 7 8 9 10
Αν θες μια τέτοια συμπεριφορά θα πρέπει να αλλάξεις τιμές στις $rightoffset και $offset ως εξής:
$rightoffset = 0;
$offset = 6 ή όσες σελίδες θες να φαίνονται δεξιά...

cordis σε ευχαριστώ, ελπίζω να βοηθήσει κάποιους

alohagr
Δημοσιεύσεις: 25
Εγγραφή: 16 Ιουν 2007 10:41

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

Δημοσίευση από alohagr » 20 Οκτ 2008 13:31

θα ήθελα να ρωτήσω αν αυτό το pagination script μπορεί να χρησιμοποιηθεί και σε στατικές σελίδες. Αν για παράδειγμα έχω 100 φωτογραφίες και θέλω να τις παρουσιάζω από 10 σε κάθε σελίδα. Γίνεται; ή θα πρέπει να υπάρχει βάση δεδομένων ; ευχαριστώ

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

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

Δημοσίευση από korgr » 20 Οκτ 2008 14:31

Η βάση στην ουσία είναι απαραίτητη...
Πάντως αν δεν τρέχει η php δεν δουλεύει καθόλου το script, οπότε για στατικές σελίδες δεν έχεις τύχη... (λογικό αφού το pagination είναι εξ ορισμού δυναμικό στοιχείο)

alohagr
Δημοσιεύσεις: 25
Εγγραφή: 16 Ιουν 2007 10:41

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

Δημοσίευση από alohagr » 20 Οκτ 2008 15:04

Μάλιστα. Μήπως θα μπορούσες λίγο να με βοηθήσεις σε ποιο σημείο του script θα καλέσω τον πίνακα της βάσης που θα φτιάξω. Αν για παράδειγμα έχω ένα πίνακα με τις φωτογραφίες μου που τον ονομάζω data, λογικά δεν θα πρέπει να κάνω κάπου ένα SELECT και να το συνδυάσω με το script σου. Θα με βοηθούσε πολύ αν μου έκανες ένα απλο παράδειγμα του script. Ευχαριστώ προκαταβολικά.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

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

Δημοσίευση από korgr » 21 Οκτ 2008 00:31

Δανείζομαι τον κώδικα από το παράδειγμα pagination που δημοσίευσε ο panosru στο http://www.freestuff.gr/forums/viewtopic.php?t=28203 (php4) ώστε να δεις το mysql part και πως προκύπτουν οι βασικές δύο μεταβλητές (σύνολο εγγραφών & εμφανιζόμενες εγγραφές ανά σελίδα) και απλά αντικαθιστώ το pagination.


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

<?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 />';
//**********************************************************
// εδώ βάζεις την pagination function...
//ενοείται πως στην αρχή του κώδικά σου θα συμπεριλάβεις και τον κώδικα της function που δημοσίευσα...


pagination&#40;$getDataLen, $lpr, false, ''&#41;;


//*********************************************************** 
   
// Close link to database
mysql_close&#40;$cID&#41;;
?>

alohagr
Δημοσιεύσεις: 25
Εγγραφή: 16 Ιουν 2007 10:41

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

Δημοσίευση από alohagr » 21 Οκτ 2008 10:21

Σε ευχαριστώ πάρα πολύ φίλε korgr, θα το δοκιμάσω άμεσα.

Άβαταρ μέλους
bilakios
Δημοσιεύσεις: 14
Εγγραφή: 22 Οκτ 2005 02:00
Τοποθεσία: Glyfada

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

Δημοσίευση από bilakios » 22 Οκτ 2008 13:51

filarako korgr
poli kalo bravo :kaloe:

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

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

Δημοσίευση από korgr » 31 Οκτ 2008 18:26

Παρατηρώ πως λείπει ένα κομμάτι κώδικα το οποίο πρέπει να το βάλουμε πριν το τελικό query ώστε από την τιμή της $page να υπολογίζουμε την $startrecord (αρχική τιμή της LIMIT στο τελικό query):

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

$result=mysql_query&#40;"select * from table where 1"&#41;; //count records
$maxrows=mysql_num_rows &#40;$result&#41;;
$mode=30; // Αριθμός εμφανιζόμενων εγγραφών ανά σελίδα
$page = &#40;$page > 0&#41; ? $page &#58; 1; // αν δεν έχει δωθεί η μεταβλητή $page να ορισθεί ως 1
$startrecord=&#40;$page * $mode&#41; - $mode; // η πρώτη εγγραφή του σετ &#40;αρχική τιμή της LIMIT&#41;
$startrecord=&#40;$startrecord < 0&#41; ? 0 &#58; $startrecord ; // Απαγορεύεται η αρνητική τιμή
$result=mysql_query&#40;"select * from table where 1 LIMIT $startrecord, $mode"&#41;;
$rows=mysql_num_rows &#40;$result&#41;;
if&#40;$rows&#41;&#123;
$vars = 'getvar1,getvar2'; // αν έχουμε GET μεταβλητές τις περνάμε εδώ...
pagination&#40;$maxrows, $mode, true, $vars&#41;; 
//...
//παρουσίαση αποτελεσμάτων
//...
&#125;
pagination&#40;$maxrows, $mode, false, $vars&#41;; 
Είπα να το δημοσιεύσω μήπως και δεν θεωρήθηκε δεδομένο πως χρειάζεται για την σωστή σύνταξη του query...

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

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

Δημοσίευση από dimsis » 07 Φεβ 2009 12:52

Αν δεν έχει περάσει ήδη το Link, ένα tutorial για pagination και απο το nettuts που έχει δεχθεί αρκετά θετικά σχόλια και περιλαμβάνει και τον source code για άμεσο download:
How to Paginate Data with PHP

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

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

Δημοσίευση από cherouvim » 07 Φεβ 2009 18:13

Σχετικό άρθρο και συζήτηση από ένα guru της MySQL
http://www.mysqlperformanceblog.com/200 ... -displays/

Άβαταρ μέλους
malla
Δημοσιεύσεις: 17
Εγγραφή: 21 Ιούλ 2010 00:06
Επικοινωνία:

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

Δημοσίευση από malla » 04 Αύγ 2010 15:01

καλησπερα
σελιδοποιηση για αρχαριους...πως μπορω να ξεκινησω ,τι πρεπει να ξερω,αφου δεν γνωριζω ajax..?!!

Απάντηση

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

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

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