Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[PHP-MYSQL]-Creare un indice per dividere in pagine i risultati di una query

169 views
Skip to first unread message

mrzac

unread,
Dec 24, 2007, 9:15:27 AM12/24/07
to
Ciao a tutti, vorrei realizzare in una pagina XHTML un indice di link
tipo quello di Google che permette di scegliere, una volta fatta
un'interrogazione, quale pagina visualizzare (es. ci sono 100 risultati,
se li voglio 10 per pagina avrò un indice di 10 link alle 10 pagine di
risultati e avrò visualizzata subito la prima pagina con i primi 10
link, immagino sappiate tutti com'è la cosa non c'è bisogno di
spiegarlo... :) ).

Mi sapreste dare una fonte autorevole dove trovare un esempio di
implementazione efficiente di questo algoritmo o dare indicazioni per
realizzarlo in maniera efficiente?

Pensavo ovviamente di usare LIMIT nell'interrogazione mysql però non
saprei come fare la cosa in maniera efficiente. Ad esempio: faccio PRIMA
l'interrogazione senza usare LIMIT, trovo con mysql_num_rows() il numero
di risultati e quindi faccio una nuova interrogazione con LIMIT in cui
cerco solo i risultati che voglio visualizzare nella prima pagina o non
c'è bisogno di fare due interrogazioni? Perchè se la faccio subito con
LIMIT ho visto che non so il numero totale di risultati e di conseguenza
non posso calcolare quante pagine devo linkare (l'indice di cui parlavo
prima) nella pagina con i risultati.
Immagino che ci sia da fare il minor numero di query possibile,
specialmente nell'ottica di un sito con tanti utenti connessi
contemporaneamente...

ciao e grazie anticipatamente per le risposte!

Francesco F

unread,
Dec 24, 2007, 9:37:07 AM12/24/07
to
mrzac ha scritto:
> Pensavo ovviamente di usare LIMIT nell'interrogazione mysql perň non
> saprei come fare la cosa in maniera efficiente. Ad esempio: faccio PRIMA
> l'interrogazione senza usare LIMIT, trovo con mysql_num_rows() il numero
> di risultati e quindi faccio una nuova interrogazione con LIMIT in cui
> cerco solo i risultati che voglio visualizzare nella prima pagina o non
> c'č bisogno di fare due interrogazioni? Perchč se la faccio subito con
> LIMIT ho visto che non so il numero totale di risultati e di conseguenza
> non posso calcolare quante pagine devo linkare (l'indice di cui parlavo
> prima) nella pagina con i risultati.
> Immagino che ci sia da fare il minor numero di query possibile,
> specialmente nell'ottica di un sito con tanti utenti connessi
> contemporaneamente...

Praticamente hai giů descritto il funzionamento da solo, tranne un paio di
cose: fai prima a fare due diverse query, la prima per il conteggio dei
risultati, tramite COUNT (e non con mysql_num_rows), la seconda per
l'estrapolazione dei dati tramite limit. Se il database č ben strutturato
e le query ottimizzate, il tempo necessario per la loro esecuzione č quasi
trascurabile.

Francesco

--

questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ab...@newsland.it


ghigno

unread,
Dec 24, 2007, 9:40:21 AM12/24/07
to

allora:
imposti il numero di record da visualizzare per pagina (prendiamo per
esemio 10)

$num =10;

quindi nelle query si avranno i limit:
-pagina 1: LIMIT 0-9
-pagina2: LIMIT 10-19
-pagina3: LIMIT 20-29

e cosi via
poi prendi in GET il numero di pagina o imposti il valore a 1 in caso
di prima pgina

if (isset($_GET['pagina'])) $pagina= $_GET['pagina']; else
$pagina=1;

ora calcoli i limit della query:


//limite basso
if ($pagina==1) $limite_down=0;
else $limite_down = ($pagina-1)*$num;

//limite alto
$limit_up = $limit_down+($mun-1)


ora che hai i limiti procedi con la query semplicissima:
$query = "SELECT * FROM tua_tabella LIMIT ".$limit_down." , ".
$limit_up;

poi visualizzi i tuoi record come piu ti aggrada
e alla fine fai ii link pagina successiva e pagina precedente:

>> <a href="stessapagina?pagina=<?php echo $pagina+1">
<< <a href="stessapagina?pagina=<?php echo $pagina-1">


è una cosa abbastanza di base quella che ti ho scritto qui sopra. stai
attento che devi aggiungere i controlli dei link in caso di prima e
ultima pagina (se sei a pagina 1 non linkare pagina 0 - aggiungi il
controllo sui record totali per avere un limite in alto )

mrzac

unread,
Dec 24, 2007, 9:54:07 AM12/24/07
to
mrzac wrote:
> Ciao a tutti, vorrei realizzare in una pagina XHTML un indice di link
> [..]
> contemporaneamente...
>
Grazie per i suggerimenti fin qui arrivati!
Volevo chiedervi:
fare una prima query usando SQL_CALC_FOUND_ROWS scritto dopo la parola
"SELECT" nella query e impostando da subito in questa query il LIMIT può
andare?
Praticamente richiamerei subito dopo con la funzione SELECT FOUND_ROWS()
il numero totale di risultati (che avrei avuto senza usare la LIMIT). Ho
appena visto adesso questa prassi nel manuale mysql (sono un niubbo, non
l'ho già letto tutto :) ).

Chiedo perchè prima ho letto da Francesco F di usare COUNT.

ciao e grazie anticipatamente per il supporto!

ghigno

unread,
Dec 24, 2007, 9:57:09 AM12/24/07
to

sinceramente nn lo so. io ti ho postato la procedura che utilizzo
solitamente, questo non vuol dire ceh sia la piu giusta.
il comando sql che dici te non lo conosco. io ti direi di provare. se
funziona hai gia fatto
(anche perche ammetto che il mio metodo è un po macchinoso eheh)

Francesco F

unread,
Dec 24, 2007, 10:02:53 AM12/24/07
to
mrzac ha scritto:

> fare una prima query usando SQL_CALC_FOUND_ROWS scritto dopo la parola
> "SELECT" nella query e impostando da subito in questa query il LIMIT può
> andare?
> Praticamente richiamerei subito dopo con la funzione SELECT FOUND_ROWS()
> il numero totale di risultati (che avrei avuto senza usare la LIMIT). Ho
> appena visto adesso questa prassi nel manuale mysql (sono un niubbo, non
> l'ho già letto tutto :) ).

Sinceramente non la conoscevo, può essere interessante valutare, su grandi
mole di dati, le differenze di prestazioni tra due distinte query e tale
opzione, fermo restando:
1 - SQL_CALC_FOUND_ROWS and FOUND_ROWS() are available starting at MySQL
4.0.0.
2 - E' strettamente collegata con il DMBS

Se hai voglia di far due prove, posta il risultato!

mrzac

unread,
Dec 24, 2007, 10:06:31 AM12/24/07
to
ghigno wrote:
> sinceramente nn lo so. io ti ho postato la procedura che utilizzo
> solitamente, questo non vuol dire ceh sia la piu giusta.
> il comando sql che dici te non lo conosco. io ti direi di provare. se
> funziona hai gia fatto
> (anche perche ammetto che il mio metodo č un po macchinoso eheh)
>
Beh, se l'alternativa č una COUNT(*) direi che č analogamente macchinosa. :)
Tu come la fai di solito la conta del numero totale di risultati da
visualizzare su piů pagine?

ciao e grazie.

mrzac

unread,
Dec 24, 2007, 10:08:16 AM12/24/07
to
Francesco F wrote:
> Sinceramente non la conoscevo, può essere interessante valutare, su grandi
> mole di dati, le differenze di prestazioni tra due distinte query e tale
> opzione, fermo restando:
> 1 - SQL_CALC_FOUND_ROWS and FOUND_ROWS() are available starting at MySQL
> 4.0.0.
> 2 - E' strettamente collegata con il DMBS
>
> Se hai voglia di far due prove, posta il risultato!
>
Non so fare ed esula dal mio progetto (che devo finire in fretta), sorry!
Se a qualcuno va di fare questo bench postate pure i risultati che
possono servire a tutti! ;)

ciao e grazie.

ghigno

unread,
Dec 24, 2007, 11:38:06 AM12/24/07
to

ah semplicemente faccio la query senza limit all'inizio
e poi con il comando mysql_num_rows($query) ho il totale dei record.

0 new messages