Paginazione record su più pagine

  • Creatore Discussione Creatore Discussione lughino
  • Data di inizio Data di inizio

lughino

Nuovo Utente
23 Mar 2010
24
0
0
Ciao a tutti,
sono nuovo del forum.
Per questo vi chiedo venia per la mia ignoranza in fattore di programmazione, ma sto cercando di imparare da autodidatta..
Come da titolo ho creato una pagina di risultati da una semplice form, e dato che i risultati sono diventati tanti, ho pensato di suddividerli su più pagine...
Ho letto molte guide e molti post in merito ed fatto questo:
PHP:
if (get_magic_quotes_gpc()) 
{ 
    $tipo = stripslaches($tipo); 
} 
$tipo = mysql_real_escape_string($tipo); 
//inizio parte inerente la paginazione
$ris_conteggio = mysql_query("SELECT count(*) as tot FROM Immobili WHERE Tipo LIKE '%$tipo%'") or die( mysql_error() );
$righe = mysql_fetch_array( $ris_conteggio );
$messaggi = 20;
$current_page = (!$_GET['pag']) ? 1 : (int)$_GET['pag'];
$pagine = ceil ( $righe['tot'] / $messaggi );
echo "Pagine: ";
for ( $i = 1; $i <= $pagine; $i++ ) {
  if($i == $current_page) {
$paginazione .= $i . " ";
} else {
$paginazione .= "<a href=\"risultato.php?tipo=" . $tipo . " &amp;pagina=" . $i . "&amp;Invia=true\">" . $i . "</a>";
}
}
echo $paginazione;
// estraggo i record
if (! isset ($_GET['pag']) || (int)$_GET['pag'] < 1) {
  $_GET['pag'] = 1;
}

if (isset ($_GET['pag']) && (int)$_GET['pag'] > $pagine) {
  $_GET['pag'] = $pagine;
}
if(isset ($_GET['Invia']) && $_GET['Invia'] == "true") {
$query = "SELECT Immobili.Tipo, Immobili.Comune, Immobili.Acquisto, Immobili.Prezzo, Immobili.Descrizione, Immobili.ID, Immagini.Id_Immobili, Immagini.Percorso, Immagini.Flag FROM Immobili JOIN Immagini ON Immobili.ID = Immagini.Id_Immobili  WHERE Immobili.Tipo LIKE '%$tipo%' LIMIT " . ( ( (int)$_GET['pag'] - 1 ) * $messaggi ) . "," . $messaggi or die( mysql_error() );
$risultato = mysql_query($query);
// qui il codice che stampa i messaggi 

if(mysql_num_rows($ris_conteggio) == 0) {
echo ("<div id=\"contenutoimmobile\">Non ci sono immobili al momento per questa sezione.</div>");
}else{ 
while ($ris_array = mysql_fetch_assoc($risultato)) {
	echo "<div id=\"contenutorecord\">";
	echo "<div id=\"sfondoimgsmall\"><img src=\"" . $ris_array['Percorso'] . "\" height=\"99\" width=\"150\" /></div>";
	echo "<div id=\"contenutoimmobile\">";
	$Acquisto = strtoupper($ris_array['Acquisto']);
	$Tipo = strtoupper($ris_array['Tipo']);
	$Comune = strtoupper($ris_array['Comune']);
	$Descrizione = tagliastringa($ris_array['Descrizione'],150);
	$Prezzo = "€ " . $ris_array['Prezzo'];
	echo "<h2>" . $Acquisto . " - " . $Tipo . " - " . $Comune . "   -   " . $Prezzo . "</h2>";
	echo "<p>" . $Descrizione . "</p></div></div>";

}
} 
}
solo che ho un problema...ora i record non si visualizzano più!
Nonostante mi si vedano correttamente i numeri delle pagine (ho 35 record e ne deve visualizzare 20 per pagina, quindi due pagine).
La cosa strana è che prima avevo lo script senza la parte inerente alla paginazione e funzionava tutto benissimo..
Dove sto sbagliando?
Non ci sarebbe anche un modo per visualizzare anche avanti e indietro?
anche su questo non sono riuscito...
Grazie a tutti quanti
ciao
 
Guarda, non so dirti dove sia l'errore... ma posso consigliarti una diversa modalità di ottenere un multipage?
Crea una funzione, così che i parametri sono più chiari e il codice del multipage non si mescola troppo con il codice su cui lavori..
Io per fare questo tipo di cose mi sono basata su questa pagina: CLICCA QUI

In fondo trovi molti esempi di funzioni con le relative differenze e spiegazioni.
 
Guarda, non so dirti dove sia l'errore... ma posso consigliarti una diversa modalità di ottenere un multipage?
Crea una funzione, così che i parametri sono più chiari e il codice del multipage non si mescola troppo con il codice su cui lavori..
Io per fare questo tipo di cose mi sono basata su questa pagina: CLICCA QUI

In fondo trovi molti esempi di funzioni con le relative differenze e spiegazioni.

Sei stata gentilissima...
però, so che faccio una domanda stupida, come faccio ad inserire nel mio contesto questa funzione?
Codice:
function pagination_4($total_pages,$page){

    global $webpage;
    $pagination="";

        if($total_pages!=1){

       /*Impostiamo il numero massimo di elementi visualizzabili all'apertura della patina, in questo caso 10;*/

        $max = 10;

        //Usiamo questa variabile nel cilco for piu sotto;

        $max_links = $max+1;
        $h=1;

            //Se la pagina è > di $max_links

        if($page>$max_links){

            //Facciamo partire il nostro loop

            $h=(($h+$page)-$max_links);
        }

          //Se la pagina non è l'unica

        if($page>=1){

                //estendiamo il nosto range di link visualizzabili

            $max_links = $max_links+($page-1);
        }

            //Se il numero massimo di link visualizzabili, supera il numero totale delle pagine, allora il numero di links è =numero totale di pagine

        if($max_links>$total_pages){
            $max_links=$total_pages+1;
        }

            //Creiamo i link prima e prev

        if($page>1){
            $pagination.="<a href=".$webpage."?page=1><small>prima</small></a>
                                       <a href=".$webpage."?page=".($page-1).">Prev</a>";
        }

            //Creiamo le pagine linkate

        for ($i=$h;$i<$max_links;$i++){
            if($i==$page){
                $pagination.="<a>".$i."</a>";
            }
            else{
                $pagination.="<a href=".$webpage."?page=".$i.">".$i."</a>";
            }
        }

            //Creiamo i link Next  last buttons

        if(($page >="1")&&($page!=$total_pages)){
            $pagination.="<a href=".$webpage."?page=".($page+1).">Next</a>
                                       <a href=".$webpage."?page=".$total_pages."><small>Last</small></a>";
        }
    }

    //if one page of results

    else{
        $pagination.="";
    }
    
    return($pagination);
}
echo  pagination_4($total_pages,$page);

Come faccio a collegare la pagina corrente e il numero totali di record presenti nel mio db?
Grazie
 
Crea una pagina es: funzioni.php ed inserisci all'interno la funzione pagination_4.

Salva la pag sul server e nella pagina dove fai la query inserisci:
PHP:
 include "funzioni.php";
$page = $_GET['page'];
/*Setto il numero massimo di record per pagina */
$max_results = 10;
//query di ricerca
$query_ricerca= "SELECT Immobili.Tipo, Immobili.Comune, Immobili.Acquisto, Immobili.Prezzo, Immobili.Descrizione, Immobili.ID, Immagini.Id_Immobili, Immagini.Percorso, Immagini.Flag FROM Immobili JOIN Immagini ON Immobili.ID = Immagini.Id_Immobili  WHERE Immobili.Tipo LIKE '%$tipo%'";
$result=mysql_query($query_ricerca, $conn) or die(mysql_error());
$total_results = mysql_num_rows($result);
$total_pages = ceil($total_results / $max_results);
$webpage = basename($_SERVER['PHP_SELF']);
$pagination=pagination_4($total_pages,$page);
/* Mi calcolo l'offset */
$from = (($page * $max_results) - $max_results); 
$query_ricerca .= " LIMIT $from, $max_results ";
$result2 = mysql_query($query_ricerca, $conn) or die(mysql_error());
while ($ris_array = mysql_fetch_assoc($result2)) {
...
 
Ti ringrazio molto per la risposta.
Mi da però come rislutato questo errore:
Codice:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-20, 20' at line 1
C'è solo un dubbio che mi affligge, come faccio a modificare i collegamenti delle pagine per fare in modo che funzioni il tutto?
Per spiegarmi meglio:
Codice:
<a href=".$webpage."?page=".($page-1).">Prev</a>
questi collegamenti, considerando che mi passo il tipo, e in futuro anche altri parametri, via get?
Grazie ancora per la tua disponibilità
 
Ultima modifica:
ciao
per capire l'errore della query metti tra le due righe

$query_ricerca= "SELECT Immobili.Tipo, Immobili.Comune, Immobili.Acquisto, Immobili.Prezzo, Immobili.Descrizione, Immobili.ID, Immagini.Id_Immobili, Immagini.Percorso, Immagini.Flag FROM Immobili JOIN Immagini ON Immobili.ID = Immagini.Id_Immobili WHERE Immobili.Tipo LIKE '%$tipo%'";

var_dump($query_ricerca);//che poi toglerai

$result=mysql_query($query_ricerca, $conn) or die(mysql_error());

dal vardump vedi come si compone la stringa e capire dove è l'errore
 
Chiedo scusa per l'immensa ignoranza, ma mi ha restituito questo:
Codice:
string(288) "SELECT Immobili.Tipo, Immobili.Comune, Immobili.Acquisto, Immobili.Prezzo, Immobili.Descrizione, Immobili.ID, Immagini.Id_Immobili, Immagini.Percorso, Immagini.Flag FROM Immobili JOIN Immagini ON Immobili.ID = Immagini.Id_Immobili WHERE Immobili.Tipo LIKE '%Appartamento%' LIMIT -20, 20 " You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-20, 20' at line 1
che in sostanza è come l'errore venuto fuori prima, penso di aver capito che l'errore sta nel calcolo del LIMIT da cui deve partire, ma non ho capito come fare per risolvere.
Scusate ancora per l'ignoranza
 
Ok,
piccolo passo avanti...
modificando il calcolo dell'offset da
Codice:
$from = (($page * $max_results) - $max_results);
a
Codice:
$from = ($page - 1) * $max_results;

ora i record si vedono, peccato che quando clicco su Next o pagina 2 non mi visualizza nulla...
mi rimane sempre il dubbio che sia giusto o sbagliato quello che ho fatto:
Codice:
 if($page>1){
            $pagination.="<div id=\"contenutorecord\"><a href=".$webpage."?tipo=" . $tipo . "?page=".($page-1).">Prev</a></div>";
        }

            //Creiamo le pagine linkate

        for ($i=$h;$i<$max_links;$i++){
            if($i==$page){
                $pagination.="<a>".$i."</a>";
            }
            else{
                $pagination.="<div id=\"contenutorecord\"><a href=".$webpage."?tipo=" . $tipo . "?page=".$i.">".$i."</a></div>";
            }
        }

            //Creiamo i link Next  last buttons

        if(($page >="1")&&($page!=$total_pages)){
            $pagination.="<div id=\"contenutorecord\"><a href=".$webpage."?tipo=" . $tipo . "?page=".($page+1).">Next</a></div>";
        }
in effetti la variabile $tipo la chiamo fuori dalla funzione, quindi penso che sia per questo...però alla funzione ho aggiunto:
Codice:
global $tipo;
come faccio ad integrarla dentro la funzione?
grazie
ciao
 
Ultima modifica:
Ce l'ho fatta finalmente!!
nel collegamento invece che questo:
Codice:
if($page>1){
            $pagination.="<div id=\"contenutorecord\"><a href=".$webpage."?tipo=" . $tipo . "?page=".($page-1).">Prev</a></div>";
        }

            //Creiamo le pagine linkate

        for ($i=$h;$i<$max_links;$i++){
            if($i==$page){
                $pagination.="<a>".$i."</a>";
            }
            else{
                $pagination.="<div id=\"contenutorecord\"><a href=".$webpage."?tipo=" . $tipo . "?page=".$i.">".$i."</a></div>";
            }
        }

            //Creiamo i link Next  last buttons

        if(($page >="1")&&($page!=$total_pages)){
            $pagination.="<div id=\"contenutorecord\"><a href=".$webpage."?tipo=" . $tipo . "?page=".($page+1).">Next</a></div>";
        }
ho inserito questo:
Codice:
if($page>1){
            $pagination.="<div id=\"footer\"><a href=".$webpage."?tipo=" . $tipo . "&amp;page=".($page-1).">Prev</a></div>";
        }

            //Creiamo le pagine linkate

        for ($i=$h;$i<$max_links;$i++){
            if($i==$page){
                $pagination.="<div id=\"footer\"><a>".$i."</a></div>";
            }
            else{
                $pagination.="<div id=\"footer\"><a href=".$webpage."?tipo=" . $tipo . "&amp;page=".$i.">".$i."</a></div>";
            }
        }

            //Creiamo i link Next  last buttons

        if(($page >="1")&&($page!=$total_pages)){
            $pagination.="<div id=\"footer\"><a href=".$webpage."?tipo=" . $tipo . "&amp;page=".($page+1).">Next</a></div>";
        }
L'ultima cosa che mi domando è:
come mai mi si vedono uno sotto l'altro invece che uno a fianco all'altro?
il div footer ha il text-align:center; ma non dovrebbe essere per quello.
Me lo sapete spiegare?
Grazie a tutti per la pazienza dimostrata
:)
 

Discussioni simili