[PHP] Paginazione dati estratti da una query con più condizioni

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Un saluto a tutti,
avrei la necessità di paginare i dati estratti da questa query,
avrei necessità di impostare un LIMIT di 10 righe per pagina, ma trattandosi di una query di tipo "WHERE 1" non saprei come fare, ho provato a seguire varie guide ma senza successo, mi dareste una mano ?

PHP:
// INCLUDO IL FILE PER LA CONNESSIONE AL DATABASE
include ("connessione.php");

if (trim($_POST['cliente']) == '' && trim($_POST['targa']) == '' && trim($_POST['data']) == '' && trim($_POST['veicolo']) == '' && trim($_POST['pagamento']) == '' && trim($_POST['allegato']) == '' && trim($_POST['n_tecnico']) == '')
{
    //REINDIRIZZO L'UTENTE AL MESSAGGIO DI ERRORE ATTENZIONE COMPILA ALMENO UN CAMPO
    echo "<center><h3><font color=\"red\">Attenzione non hai inserito nessun valore di ricerca</h3><a href=\"ricerca.php\"></br>Torna alla ricerca</a></center></br></br>";
}

else
   
{
$cliente = $_POST['cliente'];
$targa = $_POST['targa'];
$veicolo = $_POST['veicolo'];
$data = $_POST['data'];
$pagamento = $_POST['pagamento'];
$allegato = $_POST['allegato'];
$n_tecnico = $_POST['n_tecnico'];

$query = "SELECT *, DATE_FORMAT(CommesseOfficina.data,'%d/%m/%Y') as data_it FROM CommesseOfficina WHERE 1";

if (!empty($cliente)) {
    $query .= " AND `cliente` LIKE '%$cliente%'";
}
if (!empty($targa)) {
    $query .= " AND `targa` LIKE '%$targa%'";
}

if (!empty($veicolo)) {
    $query .= " AND `veicolo` LIKE '%$veicolo%'";
}

if (!empty($data)) {
    $query .= " AND `data` = STR_TO_DATE('$data', '%d/%m/%Y') ";
}

if (!empty($pagamento)) {
    $query .= " AND `pagamento` = '$pagamento'";
}

if (!empty($n_tecnico)) {
    $query .= " AND `n_tecnico` = '$n_tecnico'";
}

    $query .= " ORDER BY id DESC";
}

// ESEGUO LA QUERY
$cerca = mysql_query($query);

// STAMPO LA QUERY PER IL DEBUG
// echo $query;

echo "
    <center><table>
    <tr><th colspan='9'>RISULTATI RICERCA</th><th colspan='6'>OPERAZIONI</tr>
    <tr><th>Id<th>Targa<th>Cliente<th>Vettura<th>Data Intervento<th>Km<th>Importo<th>Stato Pagamento<th>Allegato<th>Nuova<th>Visualizza<th>Modifica<th>Pdf<th>Elimina</tr>
</center>";

while ($riga = mysql_fetch_assoc($cerca)){
echo "<tr><td>$riga[id]<td>$riga[targa]<td>$riga[cliente]<td>$riga[veicolo]<td>$riga[data_it]<td>$riga[km]<td>$riga[totale]</td><td>$riga[pagamento]<td>$riga[allegato]</td><td><center><a href=\"duplicacommessa.php?id=$riga[id]\"><img src= \"img/duplica_32_32.png\"></a></center></td><td><center><a href=\"visualizza.php?id=$riga[id]\"><img src= \"img/visualizza_32_32.png\"></a></center></td><td><center><a href=\"modifica.php?id=$riga[id]\"><img src= \"img/modifica_32_32.png\"></a></center></td><td><center><a href=\"pstampa.php?id=$riga[id]\" \" target=\"_blank\"><img src= \"img/stampa_32_32.png\"></a></center></td><td><center><a href=\"elimina.php?id=$riga[id]\" onclick=\"return confirm('Cancellare definitivamente?')\"><img src=\"img/elimina_32_32.png\"></a></center></td></tr>";
}

echo "</table>";

// E chiudiamo la connessione a MySQL
mysql_close();
 
Non capisco cosa vuoi intendere con "query di tipo WHERE 1"... Se vuoi paginare per 10 fai la query e in fine metti il "LIMIT 10" poi se sono più di 10 risultati fai comparire la paginazione e il numero due della paginazione fa la query con "LIMIT 20" e via così...
Ciao
 
Buongiorno Filomeni,
non riesco a capire come par comparire i numeri di pagina :oops:
 
ciao
intanto metterei
PHP:
<?php
$query = "SELECT *,.... WHERE 1=1 $altre_pozioni";
//...
?>
poi @filomeni quel 1=1 serve per non dover poi regolare gli AND in quanto se es
$altre_pozioni="";
il WHERE rimane sempre 1=1 e quindi sempre vero da cui tutti i recor
altrimenti se
$altre_pozioni="AND pinco='pallo'";
diventa WHERE 1=1 AND pinco='pallo' e quindi estrae solo quelli in cui pinco == pallo
poi per paginare dai un occhio a
https://www.mrw.it/php/gestire-paginazione-records-mysql-classe-php_7232.html
 
Buongiorno ragazzi, se scrivo la query cosi, non mi viene stampato nulla
Codice:
// limitiamo la SELECT al numero di risultati per pagina
$query = @mysql_query("SELECT *, DATE_FORMAT(xxx.data,'%d/%m/%Y') as data_it FROM xxx WHERE 1 LIMIT ".$inizio.",".$max) or die (mysql_error());
 
ciao
intanto correggi come detto quel WHERE 1 in WHERE 1=1
poi vista così dice poco quella query, hai usato la classe? da dove vengono quei $inizio e $max? e che valore hanno?
 
Ciao, si ho usato la classe, implementando il tutto cosi:

Codice:
<?php

@require("function/paginazione.php");

// INCLUDO IL FILE PER LA CONNESSIONE AL DATABASE GESTIONE OFFICINA 2
include ("connessione.php");

if (trim($_POST['cliente']) == '' && trim($_POST['gestore']) == '' && trim($_POST['data']) == '' && trim($_POST['ora']) == '' && trim($_POST['stato_pren']) == '' && trim($_POST['tipoprenotazione']) == '' && trim($_POST['targa']) == ''&& trim($_POST['note']) == '')
{
    //REINDIRIZZO L'UTENTE AL MESSAGGIO DI ERRORE ATTENZIONE COMPILA ALMENO UN CAMPO
    echo "<center><h3><font color=\"red\">Attenzione non hai inserito nessun valore di ricerca</h3><a href=\"ricapp.php\"></br>Torna alla ricerca</a></center></br></br>";
}

else
   
   
{
   
$cliente = $_POST['cliente'];
$gestore = $_POST['gestore'];
$data = $_POST['data'];
$ora = $_POST['ora'];
$stato_pren = $_POST['stato_pren'];
$tipoprenotazione = $_POST['tipoprenotazione'];
$targa = $_POST['targa'];
$note = $_POST['note'];

// istanziamo la classe per l'impaginazione
$p = new Paging;

// numero massimo di risultati per pagina
$max = 10;

// identifichiamo la pagina da cui iniziare la numerazione
$inizio = $p->paginaIniziale($max);

// contiamo i records nel database
$query_count = @mysql_query("SELECT * FROM appuntamenti") or die (mysql_error());
$count = @mysql_num_rows($query_count) or die (mysql_error());

// troviamo il numero delle pagine che dovrà essere contato
$pagine = $p->contaPagine($count, $max);

// limitiamo la SELECT al numero di risultati per pagina
$query = @mysql_query("SELECT *, DATE_FORMAT(appuntamenti.data,'%d/%m/%Y') as data_it FROM appuntamenti WHERE 1=1 LIMIT ".$inizio.",".$max) or die (mysql_error());


if (!empty($cliente)) {
    $query .= " AND `cliente` LIKE '%$cliente%'";
}

if (!empty($gestore)) {
    $query .= " AND `gestore` LIKE '%$gestore%'";
}

if (!empty($data)) {
    $query .= " AND `data` = STR_TO_DATE('$data', '%d/%m/%Y') ";
}

if (!empty($ora)) {
    $query .= " AND `ora` = '$ora'";
}

if (!empty($stato_pren)) {
    $query .= " AND `stato_pren` = '$stato_pren'";
}

if (!empty($tipoprenotazione)) {
    $query .= " AND `stato_pren` = '$tipoprenotazione'";
}

if (!empty($targa)) {
    $query .= " AND `targa` LIKE '%$targa%'";
}

if (!empty($note)) {
    $query .= " AND `note` LIKE '%$note%'";
}

    $query .= " ORDER BY ora ASC";
}

// ESEGUO LA QUERY
$cerca = mysql_query($query);

// STAMPO LA QUERY PER IL DEBUG
echo $query;

echo "
    <center><table>
    <tr><th colspan='9'>RISULTATI RICERCA</th><th colspan='6'>OPERAZIONI</tr>
    <tr><th>Id<th>Cliente<th>Gestore<th>Data<th>Ora<th>Targa<th>Note<th>Stato Prenotazione<th>Tipo Prenotazione<th>Nuova<th>Modifica<th>Elimina</tr>
    </center>";

// NEL CICLO WHILE PER LA DATA STAMPO LA RIGA [57] E NON LA [56], LA [103] VIENE CREATA DALLA QUERY , DATE_FORMAT(appuntamenti.data,'%d/%m/%Y') as data_it
while ($riga = mysql_fetch_assoc($cerca)){
echo "<tr><td>$riga[idappuntamento]<td>$riga[cliente]<td>$riga[gestore]<td>$riga[data_it]<td>$riga[ora]<td>$riga[targa]<td>$riga[note]<td>$riga[stato_pren]<td>$riga[tipo_pren]</td><td><center><a href=\"ins.php\"><img src= \"img/duplica_32_32.png\"></a></center></td><td><center><a href=\"modapp.php?idappuntamento=$riga[idappuntamento]\"><img src= \"img/modifica_32_32.png\"></a></center></td><td><center><a href=\"delappnoleggio.php?idappuntamento=$riga[idappuntamento]\" onclick=\"return confirm('Cancellare definitivamente?')\"><img src=\"img/elimina_32_32.png\"></a></center></td></tr>";
}

echo "</table>";


//mostriamo le pagine
$lista = $p->listaPagine($_GET['p'], $pagine);
echo $lista . "<br>";

//mostriamo il navigatore Precedente/Successiva
$navigatore = $p->precedenteSuccessiva($_GET['p'], $pagine);
echo $navigatore;

// E chiudiamo la connessione a MySQL
mysql_close();

?>
 
ciao
intanto metterei
PHP:
<?php
$query = "SELECT *,.... WHERE 1=1 $altre_pozioni";
//...
?>
poi @filomeni quel 1=1 serve per non dover poi regolare gli AND in quanto se es
$altre_pozioni="";
il WHERE rimane sempre 1=1 e quindi sempre vero da cui tutti i recor
altrimenti se
$altre_pozioni="AND pinco='pallo'";
diventa WHERE 1=1 AND pinco='pallo' e quindi estrae solo quelli in cui pinco == pallo
poi per paginare dai un occhio a
https://www.mrw.it/php/gestire-paginazione-records-mysql-classe-php_7232.html
Ma non capisco bene, se usi WHERE 1=1 e come se non mettessi la clausola WHERE, cioè ti restituisce il contenuto della tabella senza distinsione, essendo "WHERE 1=1" (sempre vero), la query viene eseguita per tutti i record ... O sbaglio?
 
ciao
se c'è solo WHERE 1=1 è come se tu non lo mettessi, se c'è un'altra condizione vale l'altra condizione
scrivere WHERE id=$id o WHERE 1=1 AND id=$id è la stessa cosa, detto questo è comodo quando devi costruirlo dinamicamente con più possibili condizioni es.
PHP:
<?php
//....
$wh="";
if(isset($_POST['pinco'])){ $wh.=" AND pinco='nero' ";}
if(isset($_POST['pallo'])){ $wh.=" AND pallo='rosso' ";}
if(isset($_POST['pallino'])){ $wh.=" AND pallino='bianco' ";}//ecc...
$query="SELECT * FROM sofonisba WHERE 1=1 $wh";
//...
?>
se non metti quel 1=1 vedi che devi toglier il primo AND perche altrimenti risulterebbe es,
... WHERE AND pinco='nero' AND pallo='rosso' da cui errore
dimenticavo, se c'è comunque sempre una condizione iniziale fissa quell' 1=1 non serve
PHP:
$query="SELECT * FROM sofonisba WHERE asdrubale='antipatico' $wh";
 
Ultima modifica:
  • Like
Reactions: filomeni
Buonasera raga,
io mi sono incartato, ho cercato di utilizzare una soluzione più semplice ma non riesco a venirne fuori.

In sostanza, se eseguo lo script in questo modo, compaiono correttamente 10 pagine con la relativa paginazione a fondo pagina, solo che se ad esempio clicco sul numero 2 o 3 o altro numero, anziche comparire altri 10 record compare la scritta "Attenzione non hai inserito nessun valore di ricerca".

:oops::oops::oops:

Codice:
<?php

// INCLUDO IL FILE PER LA CONNESSIONE AL DATABASE
include ("connessione2.php");

//TRIM ELIMINA TUTTI GLI SPAZI ALL'INIZIO E ALLA FINE DI UNA STRINGA

if (trim($_POST['cliente']) == '' && trim($_POST['targa']) == '' && trim($_POST['data']) == '' && trim($_POST['veicolo']) == '' && trim($_POST['pagamento']) == '' && trim($_POST['allegato']) == '' && trim($_POST['n_tecnico']) == '')
{
    //REINDIRIZZO L'UTENTE AL MESSAGGIO DI ERRORE ATTENZIONE COMPILA ALMENO UN CAMPO
    echo "<center><h3><font color=\"red\">Attenzione non hai inserito nessun valore di ricerca</h3><a href=\"ricerca.php\"></br>Torna alla ricerca</a></center></br></br>";
}

else
{
 
$cliente = $_POST['cliente'];
$targa = $_POST['targa'];
$veicolo = $_POST['veicolo'];
$data = $_POST['data'];
$pagamento = $_POST['pagamento'];
$allegato = $_POST['allegato'];
$n_tecnico = $_POST['n_tecnico'];

//la query è necessaria per trovare il numero totale di utenti da estrarre
$totrecord="SELECT *, DATE_FORMAT(Commesse.data,'%d/%m/%Y') as data_it FROM Commesse WHERE 1=1";
 
 
if (!empty($cliente)) {
    $totrecord .= " AND `cliente` LIKE '%$cliente%'";
}
if (!empty($targa)) {
    $totrecord .= " AND `targa` LIKE '%$targa%'";
}

if (!empty($veicolo)) {
    $totrecord .= " AND `veicolo` LIKE '%$veicolo%'";
}

if (!empty($data)) {
    $totrecord .= " AND `data` = STR_TO_DATE('$data', '%d/%m/%Y') ";
}

if (!empty($pagamento)) {
    $totrecord .= " AND `pagamento` = '$pagamento'";
}

if (!empty($n_tecnico)) {
    $totrecord .= " AND `n_tecnico` = '$n_tecnico'";
}

    $totrecord .= " ORDER BY id DESC";
}
 
    $resultrecord=mysql_query($totrecord); 
    $num=mysql_num_rows($resultrecord);
 
    $per_pagina=10;
    $tot_pagine=ceil($num/$per_pagina);
 
    if($num>0){
 
        //pagina corrente
        if(isset($_GET["idpag"])){
            $idpag=$_GET["idpag"];
        }else{
            $idpag='1';
        }
         
        //Calcolo i numeri iniziale e finale che andranno a limitare la query
        if($idpag==1){
            $inizio=0;
        }else{
            $inizio=($idpag*$per_pagina)- $per_pagina;
        }

$query = "SELECT *, DATE_FORMAT(Commesse.data,'%d/%m/%Y') as data_it FROM CommesseWHERE 1=1 LIMIT $inizio, $per_pagina";


// ESEGUO LA QUERY
$result=mysql_query($query);

// STAMPO LA QUERY PER IL DEBUG
// echo $query;

echo "
    <center><table>
    <tr><th colspan='9'>RISULTATI RICERCA</th><th colspan='6'>OPERAZIONI</tr>
    <tr><th>Id<th>Targa<th>Cliente<th>Vettura<th>Data Intervento<th>Km<th>Importo<th>Stato Pagamento<th>Allegato<th>Nuova<th>Visualizza<th>Modifica<th>Pdf<th>Elimina</tr>
</center>";

// EFFETTUO UN CICLO WHILE
while ($riga = mysql_fetch_assoc($result)){
echo "<tr><td>$riga[id]<td>$riga[targa]<td>$riga[cliente]<td>$riga[veicolo]<td>$riga[data_it]<td>$riga[km]<td>$riga[totale]</td><td>$riga[pagamento]<td>$riga[allegato]</td><td><center><a href=\"duplicacommessa.php?id=$riga[id]\"><img src= \"img/duplica_32_32.png\"></a></center></td><td><center><a href=\"visualizza.php?id=$riga[id]\" target=\”_blank\”><img src= \"img/visualizza_32_32.png\"></a></center></td><td><center><a href=\"modifica.php?id=$riga[id]\" target=\”_blank\”><img src= \"img/modifica_32_32.png\"></a></center></td><td><center><a href=\"pstampa.php?id=$riga[id]\" \" target=\"_blank\"><img src= \"img/stampa_32_32.png\"></a></center></td><td><center><a href=\"elimina.php?id=$riga[id]\" onclick=\"return confirm('Cancellare definitivamente?')\"><img src=\"img/elimina_32_32.png\"></a></center></td></tr>";
}

echo "</table>";

// CHIUDO CONNESSIONE CON IL DB
mysql_close();

?>

    <div id="paginazione">
        <div>
     
            <?php
            if($idpag>1){?>
                <!--<span><a href="?pag=<?php echo ($pag-1);?>"></a></span>-->
            <?php }else{?>
                <span></span>
            <?php }
         
            $i=1;
            do{
         
                //Link per scorrere le pagine: la pagina corrente ha un aspetto diverso
                if($i==$idpag){?>
                    <span id="corrente"><a href="?idpag=<?php echo $i;?>"><?php echo $i;?></a></span>
                <?php }else{?>
                    <span><a href="?idpag=<?php echo $i;?>"><?php echo $i;?></a></span>
                <?php }
                $i++;

            }while($i<=$tot_pagine);
         
            if(isset($pag) and $pag<$tot_pagine){?>
                <span><a href="?pag=<?php echo ($pag+1);?>"></a></span>
            <?php }else{?>
                <span></span>
            <?php }?>
     
        </div>
    </div>

     
     
    <?php 
    } //if($num>0) 
?>
 
ciao
quando clicchi sul link del cambio pagina perdi i dati dei $_POST, in questo periodo sono un po' impegnato, quindi posso solo darti in suggerimento: usa le sessioni, devi fare in modo che alla prima chiamata passare i valori alle sessioni e se le sessioni esistono non ripassare dalla valorizzazione tramite post
 
Sto strutturando la paginazione in modo che estragga 10 record alla volta, uno dei problemi che sto riscontrando e che se per esempio effettuo una ricerca e la ricerca estrae 100 record la paginazione si presenta cosi:

Indietro 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - Avanti

Se invece estrae 40 record la paginazione si presenta cosi :

Indietro 1 - 2 - 3 - 4 - Avanti

Io vorrei che qual'ora venissero estratti ad esempio anche 1000 record la paginazione mostrasse 5 pagine alla volta

Indietro 1 - 2 - 3 - 4 - 5 - Avanti cliccando poi su avanti Indietro 6 - 7 - 8 - 9 - 10 - Avanti
e cosi via

Questo è il codice per la paginazione,

PHP:
            <?php
            if($idpag>1){?>
                <span><a href="?pag=<?php echo ($pag-1);?>"></a>fffff</span>
            <?php }else{?>
                <span>Indietro</span>
            <?php }
          
            $i=1;
            do{
          
                //Link per scorrere le pagine: la pagina corrente ha un aspetto diverso
                if($i==$idpag){?>
                    <span id="corrente"><a href="?idpag=<?php echo $i;?>"><?php echo $i;?></a></span>
                <?php }else{?>
                    <span><a href="?idpag=<?php echo $i;?>"><?php echo $i;?></a></span>
                <?php }
                $i++;

            }while($i<=$tot_pagine);
          
            if(isset($pag) and $pag<$tot_pagine){?>
                <span><a href="?pag=<?php echo ($pag+1);?>"></a>sss</span>
            <?php }else{?>
                <span>Avanti</span>
            <?php }?>

j183eh.jpg


:oops:
 
Ultima modifica:
Ciao prova ad aggiungere questa stringa di codice e vedi cosa succede
PHP:
if (isset($pag) == false || is_numeric($pag) == false || $pag < 1) 
{ 
 $pag = 1; 
} 

$fine = 5; 
$inizio = ($pag - 1) * $fine;
 
ciao
se c'è solo WHERE 1=1 è come se tu non lo mettessi, se c'è un'altra condizione vale l'altra condizione
scrivere WHERE id=$id o WHERE 1=1 AND id=$id è la stessa cosa, detto questo è comodo quando devi costruirlo dinamicamente con più possibili condizioni es.
PHP:
<?php
//....
$wh="";
if(isset($_POST['pinco'])){ $wh.=" AND pinco='nero' ";}
if(isset($_POST['pallo'])){ $wh.=" AND pallo='rosso' ";}
if(isset($_POST['pallino'])){ $wh.=" AND pallino='bianco' ";}//ecc...
$query="SELECT * FROM sofonisba WHERE 1=1 $wh";
//...
?>
se non metti quel 1=1 vedi che devi toglier il primo AND perche altrimenti risulterebbe es,
... WHERE AND pinco='nero' AND pallo='rosso' da cui errore
dimenticavo, se c'è comunque sempre una condizione iniziale fissa quell' 1=1 non serve
PHP:
$query="SELECT * FROM sofonisba WHERE asdrubale='antipatico' $wh";
Vedi, ho imparato una cosa che non sapevo... Grazie Borgo
 
Ciao Cris8380,
grazie per il supporto,
non riesco ad implementare il codice ...


cosa vuoi dire con ...
probabilmente il problema lo puoi riscontrare qui $tot_pagine

tu come modificheresti tutto lo script ?

PHP:
            <?php
            if($idpag>1){?>
                <span><a href="?pag=<?php echo ($pag-1);?>"></a>fffff</span>
            <?php }else{?>
                <span>Indietro</span>
            <?php }
           
            $i=1;
            do{
           
                //Link per scorrere le pagine: la pagina corrente ha un aspetto diverso
                if($i==$idpag){?>
                    <span id="corrente"><a href="?idpag=<?php echo $i;?>"><?php echo $i;?></a></span>
                <?php }else{?>
                    <span><a href="?idpag=<?php echo $i;?>"><?php echo $i;?></a></span>
                <?php }
                $i++;

            }while($i<=$tot_pagine);
           
            if(isset($pag) and $pag<$tot_pagine){?>
                <span><a href="?pag=<?php echo ($pag+1);?>"></a>Avanti</span>
            <?php }else{?>
                <span>Avanti</span>
            <?php }?>
 

Discussioni simili