Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di henry78
    Registrato dal
    May 2001
    Messaggi
    1,264

    [php] paginare i risultati con una sola query...

    ciao a tutti!


    esiste con php la possibilità di paginare i risultati senza dove effettuare 2 query diverse?



    (se si... mi sapete indicare un esempio?)


  2. #2
    Utente di HTML.it L'avatar di henry78
    Registrato dal
    May 2001
    Messaggi
    1,264
    nessuno che mi sappia rispondere?

  3. #3
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,591
    che intendi per "2 query diverse"?
    intendi che quando passi dalla pagina1 alla pagina2 scorrendo i risultati, devi riinviare la query?

    credo, ma non l'ho mai fatto, che se carichi TUTTO il resultset nella prima pagina poi c'è modo di recuperarlo senza riinviare la query.. forse con gli array... anzi quasi sicuro con gli array..
    ma la paginazione si usa proprio per non caricare il server.. boh? vedi te...

  4. #4
    Se intendi ottenere dalla query solo i dati relativi alla "pagina N"

    Codice PHP:
    <?php

    $page 
    = (isset($_GET['page'])) ? intval($_GET['page']) : ;

    $ofsppg 20//Items per page
    $ofsbgn = ($page*$ofsppg)-$ofsppg;

    $result mysql_query("SELECT field FROM table LIMIT $ofsbgn,$ofsppg");

    ?>

  5. #5
    Utente di HTML.it L'avatar di henry78
    Registrato dal
    May 2001
    Messaggi
    1,264
    mi spiego meglio:


    con il metodo "tradizionale" per paginare i risultati devo eseguire 2 query...

    - una conta i record totali

    - una con i limit estrae solo i records che voglio mostrare nella pagina


    vorrei fare la paginazione con una sola query utilizzando magari delle funzioni di php (come so fare con asp).

    mi sapete aiutare?

  6. #6
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,591
    credo tu possa sbagliarti, ma forse mi sbaglio io...
    LE query nella paginazione è una sola.. perdona il gioco di parole...
    l'esempio che ha postato mem ne è la prova..
    Ci sono vari modi per farlo, mala query è una sola... io avevo capito l'altra cosa che avevo scritto sopra...

  7. #7
    Utente di HTML.it L'avatar di henry78
    Registrato dal
    May 2001
    Messaggi
    1,264
    Trovo sempre tutorial sulla paginazione fatti così:

    <?
    // Creo una variabile dove imposto il numero di record
    // da mostrare in ogni pagina
    $x_pag = 5;

    // Recupero il numero di pagina corrente.
    // Generalmente si utilizza una querystring
    $pag = $_GET['pag'];

    // Controllo se $pag è valorizzato...
    // ...in caso contrario gli assegno valore 1
    if (!$pag) $pag = 1;

    // Mi connetto al database
    $conn = mysql_connect("localhost","utente","password");
    mysql_select_db("nome_db", $conn);

    // Uso mysql_num_rows per contare le righe presenti
    // all'interno della tabella agenda
    $all_rows = mysql_num_rows(mysql_query("SELECT id FROM agenda"));

    // Tramite una semplice operazione matematica definisco
    // il numero totale di pagine
    $all_pages = ceil($all_rows / $x_pag);

    // Calcolo da quale record iniziare
    $first = ($pag - 1) * $x_pag;

    // Recupero i record per la pagina corrente...
    // utilizzando LIMIT per partire da $first e contare fino a $x_pag
    $rs = mysql_query("SELECT * FROM agenda LIMIT $first, $x_pag");
    $nr = mysql_num_rows($rs);
    if ($nr != 0){
    for($x = 0; $x < $nr; $x++){
    $row = mysql_fetch_assoc($rs);
    echo "<table><tr>";
    echo "<td>" . $row['id'] . "</td>";
    echo "<td>" . $row['nome'] . "</td>";
    echo "<td>" . $row['telefono'] . "</td>";
    echo "</tr></table>";
    }
    }else{
    echo "Nessun record trovato!";
    }

    // Se le pagine totali sono più di 1...
    // stampo i link per andare avanti e indietro tra le diverse pagine!
    if ($all_pages > 1){
    if ($pag > 1){
    echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?pag=" . $pag - 1 . "\">";
    echo "Pagina Indietro</a>";
    }
    if ($all_pages > $pag){
    echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?pag=" . $pag + 1 . "\">";
    echo "Pagina Avanti</a>";
    }
    }

    // Chiudo la connessione ad DB
    mysql_close($conn);
    ?>



    anche in questo esempio, vengono eseguite sempre 2 query:

    - la prima conta i risultati
    - la seconda estrae con i limit solo i record da mostrare in una pagina..


    esiste un sistema valido che usi una sola query?

  8. #8
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,591
    prova così..
    questa la query, e annessi...
    Codice PHP:
    <?php

    $hostname 
    "localhost";
    $database "DB";
    $username "root";
    $password "";
    $conn mysql_pconnect($hostname$username$password) or trigger_error(mysql_error(),E_USER_ERROR); 

    $currentPage $_SERVER["PHP_SELF"];
    // questo lo cambi per visualizzare quanti record vuoi..
    $maxRows_Recordset1 10;
    $pageNum_Recordset1 0;
    if (isset(
    $_GET['pageNum_Recordset1'])) {
      
    $pageNum_Recordset1 $_GET['pageNum_Recordset1'];
    }
    $startRow_Recordset1 $pageNum_Recordset1 $maxRows_Recordset1;

    mysql_select_db($database$conn);
    $query_Recordset1 "SELECT * FROM tabella ORDER BY ID DESC";
    $query_limit_Recordset1 sprintf("%s LIMIT %d, %d"$query_Recordset1$startRow_Recordset1$maxRows_Recordset1);
    $Recordset1 mysql_query($query_limit_Recordset1$conn) or die(mysql_error());
    $row_Recordset1 mysql_fetch_assoc($Recordset1);

    if (isset(
    $_GET['totalRows_Recordset1'])) {
      
    $totalRows_Recordset1 $_GET['totalRows_Recordset1'];
    } else {
      
    $all_Recordset1 mysql_query($query_Recordset1);
      
    $totalRows_Recordset1 mysql_num_rows($all_Recordset1);
    }
    $totalPages_Recordset1 ceil($totalRows_Recordset1/$maxRows_Recordset1)-1;

    $queryString_Recordset1 "";
    if (!empty(
    $_SERVER['QUERY_STRING'])) {
      
    $params explode("&"$_SERVER['QUERY_STRING']);
      
    $newParams = array();
      foreach (
    $params as $param) {
        if (
    stristr($param"pageNum_Recordset1") == false && 
            
    stristr($param"totalRows_Recordset1") == false) {
          
    array_push($newParams$param);
        }
      }
      if (
    count($newParams) != 0) {
        
    $queryString_Recordset1 "&" htmlentities(implode("&"$newParams));
      }
    }
    $queryString_Recordset1 sprintf("&totalRows_Recordset1=%d%s"$totalRows_Recordset1$queryString_Recordset1);
    ?>
    questo per visualizzare i dati e la paginazione... forse è un po' complicata ma funziona una BOMBA...
    AH.. c'è anche il link ad una eventuale pagina di dettaglio...
    Codice PHP:
    <HTML>
    <table border="1" align="center">
      <?php do { ?>
      <tr>
        <td> [url="dettaglio.php?recordID=<?php echo $row_Recordset1['ID']; ?>"] <?php echo $row_Recordset1['uno']; ?> [/url] </td>
        <td> <?php echo $row_Recordset1['due']; ?> </td>
        <td> <?php echo $row_Recordset1['tre']; ?> </td>
      </tr>
      <?php } while ($row_Recordset1 mysql_fetch_assoc($Recordset1)); ?>
    </table>
    <table border="0" width="50%" align="center">
      <tr>
        <td width="23%" align="center">
          <?php if ($pageNum_Recordset1 0) { // Show if not first page ?>
          [url="<?php printf("]">Primo[/url]
          <?
    php // Show if not first page ?>
        </td>
        <td width="31%" align="center">
          <?php if ($pageNum_Recordset1 0) { // Show if not first page ?>
          [url="<?php printf("]">Indietro[/url]
          <?
    php // Show if not first page ?>
        </td>
        <td width="23%" align="center">
          <?php if ($pageNum_Recordset1 $totalPages_Recordset1) { // Show if not last page ?>
          [url="<?php printf("]">Avanti[/url]
          <?
    php // Show if not last page ?>
        </td>
        <td width="23%" align="center">
          <?php if ($pageNum_Recordset1 $totalPages_Recordset1) { // Show if not last page ?>
          [url="<?php printf("]">Ultimo[/url]
          <?
    php // Show if not last page ?>
        </td>
      </tr>
    </table>
    Record da <?php echo ($startRow_Recordset1 1?> a <?php echo min($startRow_Recordset1 $maxRows_Recordset1$totalRows_Recordset1?> su <?php echo $totalRows_Recordset1 ?>
    </body>
    </html>
    <?php
    mysql_free_result
    ($Recordset1);
    ?>

  9. #9
    Utente di HTML.it L'avatar di Graboid
    Registrato dal
    Oct 2004
    Messaggi
    619
    Nel tuo codice io ci vedo sempre 2 query.
    Cmq il modo c'è usando SQL_CALC_FOUND_ROWS.
    Cerca degli esempi

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    6
    Io ho questo codice (quello di telegio) e tutto funziona correttamente.
    Qualcuno sa dirmi come faccio nella scheda di dettaglio (<td> <?php echo $row_Recordset1['uno']; ?> </td> ) a creare un avanti ed indietro fra i record?
    Grazie 1000 sempre

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.