PDA

View Full Version : dividere in pagine i risultati


kevindavidmitnick
28-02-2007, 04:00
In pratica ho questo codice che mostra le informazioni di ogni singolo utente e le mostra su ogni riga:


for($i=0;$i<$c1;$i++)
{
//show each user
$each = def($users[$i], "./db/users");



echo "$each[id]-$each[email]";

}

$c1 contiene l'array di tutti i risultati

Il problema è che però tutto questo mi viene mostrato solo su una singola pagina, e potete immaginare come su 1400 risultati, un qualsiasi browser possa andare in crash.

Come si fa a dividerle in pagine dove ogni pagina ne contiene solo 50 e cosi via?

Del tipo view.php?pagina=2 e vedo gli altri 50 ecc.....

Per quanto riguarda l'input cioè le caselle dei messaggi per girare pagina ce l'ho già, ma è il sistema che divide i risultati che mi manca.

Ciao ;)

andbin
28-02-2007, 09:27
Come si fa a dividerle in pagine dove ogni pagina ne contiene solo 50 e cosi via?Possibile lo è sicuramente.
Vorrei però capire meglio il tuo codice. Dici che in $c1 hai l'array dei dati ma poi $c1 lo compari con $i nel for. :confused: Poi comunque questo array di dati da dove ti arriva?? Da una query su un database?

kevindavidmitnick
28-02-2007, 13:34
Possibile lo è sicuramente.
Vorrei però capire meglio il tuo codice. Dici che in $c1 hai l'array dei dati ma poi $c1 lo compari con $i nel for. :confused: Poi comunque questo array di dati da dove ti arriva?? Da una query su un database?


l'array di dati?

si da questo:

$users = listall("./db/users");
$c1 = count($users);

il listall di db/users/ ottiene informazioni dal file users.dat e users.def dentro db/.

é un database di file di testo, alla fine non sta facendo una vera e propria query ma quasi.

:)

andbin
28-02-2007, 14:02
l'array di dati?

si da questo:

$users = listall("./db/users");
$c1 = count($users);
Ok, adesso è più chiaro.

La paginazione è facile da fare. La "query", chiamiamola così, la devi fare sempre ad ogni richiesta della pagina. Avendo in $c1 il numero totale di risultati, basta che calcoli il numero di pagine in base al numero fisso di risultati che vuoi mostrare a video.

Una volta che hai calcolato il numero di pagine, potrai generare una lista di link (visualizzati e posizionati come ti pare) in cui ogni link ha un parametro che indica la pagina.

Per la visualizzazione dei dati veri e propri, devi calcolare l'offset in base alla pagina richiesta con l'url (eventualmente 0 se non viene passata) e quindi prendere solo le righe che ti servono. Si potrebbe anche pensare di passare nell'url un offset piuttosto che una pagina. È solo questione di scelta.

Ovviamente i soliti controlli del caso: testare che non ti venga passata una pagina inesistente, visualizzare solo i risultati rimanenti se è l'ultima pagina, ecc...

kevindavidmitnick
02-03-2007, 12:59
Ho provato a fare cosi....


$users = listall("./db/users");
$c1 = count($users);
$posts_per_page = "1";

if(!isset($page)) {

$page = 1;

}

$start = $page * $posts_per_page - $posts_per_page;



if ($c1 <= $posts_per_page) {

$num_pages = 1;

} else if (($c1 % $posts_per_page) == 0) {

$num_pages = ($c1 / $posts_per_page);

} else {

$num_pages = ($c1 / $posts_per_page) + 1;

}

$num_pages = (int) $num_pages;
$p = "";

$x = +1;



$y = 0;


for($i=$start;$i<$c1;$i++)

{

if($y >= $posts_per_page) {



break;

}

$each = def($users[$i], "./db/users");
echo "$each[id]-$each[email]";

}

E adesso se sto su pagina.php?page=1

Me li visualizza sempre tutti

Se sto su page=2

Me ne visualizza 2

E se mi trovo su 3

Me ne visualizza 1

Secondo quanto ho scritto dovrebbe visualizzare un risultato ogni pagina :???:

Ho inoltre cercato di adattarmi il più possibile con un altra gestione pagine sempre dello stesso script, che sbaglio? :crycry:

andbin
02-03-2007, 13:40
Ecco un esempietto semplice semplice (non ho messo la generazione dei link alle pagine, però):
<html>
<body>

<?php
$arr = array ("uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto");

$count_arr = count ($arr);
$items_per_page = 3;

$count_pages = floor (($count_arr + $items_per_page - 1) / $items_per_page);

if (isset ($_GET['page']) && is_numeric ($_GET['page']))
{
$page = (int) $_GET['page'] - 1;

if ($page < 0 || $page >= $count_pages)
$page = 0;
}
else
$page = 0;

$offset = $page * $items_per_page;

for ($i = 0; $i < $items_per_page && $offset < $count_arr; $i++, $offset++)
echo $arr[$offset] . "<br>";
?>

</body>
</html>

kevindavidmitnick
02-03-2007, 15:30
Ecco un esempietto semplice semplice (non ho messo la generazione dei link alle pagine, però):
<html>
<body>

<?php
$arr = array ("uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto");

$count_arr = count ($arr);
$items_per_page = 3;

$count_pages = floor (($count_arr + $items_per_page - 1) / $items_per_page);

if (isset ($_GET['page']) && is_numeric ($_GET['page']))
{
$page = (int) $_GET['page'] - 1;

if ($page < 0 || $page >= $count_pages)
$page = 0;
}
else
$page = 0;

$offset = $page * $items_per_page;

for ($i = 0; $i < $items_per_page && $offset < $count_arr; $i++, $offset++)
echo $arr[$offset] . "<br>";
?>

</body>
</html>


Funziona alla perfezione! :eek:

, sei bravo in php :D

grazie

kevindavidmitnick
20-03-2007, 17:52
Andrea ti chiedo un'altra cosa sempre riguardante questo argomento d'impaginazione dei contenuti.

Circa qualche mese fa chiesi su giorgiotave.it (http://www.giorgiotave.it/forum/php-mysql/19356-lettura-database-di-testo.html) come poter realizzare un database di testo.

e ottenni:

dentro db.dat tutti i dati:
(es:)
marco</>marco@marco.it</>www.marco.it</>523;
luca</>luca@luca.it</>www.luca.it</>652;
andrea</>andrea@andrea.it</i>www.andrea.it</i>689;

dentro db.def tutte le definizioni dei dati
(es:)
Username</>e-mail</>website</>topic

dentro il file php la funzione

$record = file("db.def");
$record2 = file("db.dat");
foreach ($record2 as $riga)
{
$nomeCampi = explode("</>", $record[0]);
$campo = explode("</>", $riga);
if ($campo[0] == "nome2")
{
//echo "$campo[0]<br>";
echo "$campo[1] (dato di luca, in questo caso ottengo luca@luca.it cioè l'e-mail di luca...se avessi messo $campo[0] ottenevo www.luca.it ecc..)";
}
}

I dati sono divisi da </> e da \n per ogni record.

Ora il punto dove voglio arrivare è questo:

$campo[0]-[1]-[2]-ecc.. stampano a codice tutto quello che gli viene dato.

Se io qui volessi inserire il tuo codice come potrei fare?

$arr = array ("uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto");
$count_arr = count ($arr);

Cioè qui l'array di tutti i dati su quale constante dell'esempio che ho postato la trovo? :D

ciao :fagiano:

andbin
20-03-2007, 19:37
Se io qui volessi inserire il tuo codice come potrei fare?Beh, in $record2 hai un array di record, che è poi come l'array $arr del mio esempio che ho postato. Quindi ti basta fare praticamente come ho fatto nell'esempio, cioè ottenere il numero di record, calcolare il numero di pagine, ecc...
Poi in ogni elemento del tuo array hai una riga che dovrai suddividere (con explode, come hai già scritto tu), ma questo ha importanza solo quando andrai a stampare in output i dati, non per il calcolo dell'offset o del numero di pagine.

kevindavidmitnick
21-03-2007, 16:13
Beh, in $record2 hai un array di record, che è poi come l'array $arr del mio esempio che ho postato. Quindi ti basta fare praticamente come ho fatto nell'esempio, cioè ottenere il numero di record, calcolare il numero di pagine, ecc...
Poi in ogni elemento del tuo array hai una riga che dovrai suddividere (con explode, come hai già scritto tu), ma questo ha importanza solo quando andrai a stampare in output i dati, non per il calcolo dell'offset o del numero di pagine.


Grazie... ho visto che però restituisce tutti i dati e non quelli analizzati con il criterio IF all'interno.

Cosi ho pensato di cambiare array mettendo $campo cosi:

$record = file("db.def");
$record2 = file("db.dat");
foreach ($record2 as $riga)
{
$nomeCampi = explode("</>", $record[0]);
$campo = explode("</>", $riga);
if ($campo[0] == "nome2")
{
//echo "$campo[0]<br>";
echo "$campo[1] (dato di luca, in questo caso ottengo luca@luca.it cioè l'e-mail di luca...se avessi messo $campo[0] ottenevo www.luca.it ecc..)";

//mod
$count_arr = count ($campo);
echo "count $count_arr";
$items_per_page = 3;

$count_pages = floor (($count_arr + $items_per_page - 1) / $items_per_page);

if (isset ($_GET['page']) && is_numeric ($_GET['page']))
{
$page = (int) $_GET['page'] - 1;

if ($page < 0 || $page >= $count_pages)
$page = 0;
}
else
$page = 0;

$offset = $page * $items_per_page;

for ($i = 0; $i < $items_per_page && $offset < $count_arr; $i++, $offset++)
echo $campo[$offset] . "<br>";
//fine mod
}
}

ciao :D

andbin
21-03-2007, 16:29
Grazie... ho visto che però restituisce tutti i dati e non quelli analizzati con il criterio IF all'interno.

Cosi ho pensato di cambiare array mettendo $campono no, allora vediamo di chiarire meglio: tu ottieni dal file un array $record2, che contiene N righe di testo. Tra tutte queste righe devi "filtrare" (e quindi poi visualizzare) solo quelle in cui il primo campo contiene "nome2" (o quello che è ...), giusto?

Allora devi creare un nuovo array che conterrà solo i record che a te interessano. Poi puoi decidere tu se questo array deve contenere la riga originale o già "spezzata" in campi (credo che convenga quest'ultima soluzione)

Una cosa del tipo (non testato ;) ):
$record2 = file("db.dat");

$records_filt = array ();

foreach ($record2 as $riga)
{
$rec = explode("</>", $riga);

if ($rec[0] == "nome2")
array_push ($records_filt, $rec);
}
Alla fine, in $records_filt hai un array di array, cioè ogni elemento contiene un altro array con i campi.
Ed è su questo array $records_filt che dovrai contare gli elementi, calcolare il numero di pagine, calcolare l'offset e quindi mandare in output i campi.

kevindavidmitnick
21-03-2007, 17:37
no no, allora vediamo di chiarire meglio: tu ottieni dal file un array $record2, che contiene N righe di testo. Tra tutte queste righe devi "filtrare" (e quindi poi visualizzare) solo quelle in cui il primo campo contiene "nome2" (o quello che è ...), giusto?

Allora devi creare un nuovo array che conterrà solo i record che a te interessano. Poi puoi decidere tu se questo array deve contenere la riga originale o già "spezzata" in campi (credo che convenga quest'ultima soluzione)

Una cosa del tipo (non testato ;) ):
$record2 = file("db.dat");

$records_filt = array ();

foreach ($record2 as $riga)
{
$rec = explode("</>", $riga);

if ($rec[0] == "nome2")
array_push ($records_filt, $rec);
}
Alla fine, in $records_filt hai un array di array, cioè ogni elemento contiene un altro array con i campi.
Ed è su questo array $records_filt che dovrai contare gli elementi, calcolare il numero di pagine, calcolare l'offset e quindi mandare in output i campi.

Ottimo grazie :D