• Super User

    Domanda impaginazione PHP

    Salve,
    sto lavorando a uno script di impaginazione in PHP. Il suo scopo è dividere gli elementi in un database MySQL in modo che ne vengano visualizzati solo un certo numero per pagine (definito dalla variabile $limit). Per fare questo si basa sugli ID degli elementi. Ovvero partendo da ID 1 farà vedere ID 1,2,3 (ipotizzando un limite di 3 a pagina). Cliccando su avanti passerà a 3,4,5 e indietro di nuovo a 1,2,3.

    Il codice:

    [php]
    if(!$_GET["lasid"])
    {
    $_GET["lasid"]=0;
    }
    $fid=$_GET["lasid"];
    //state == 1 vuol dire che deve tornare indietro
    if($_GET["state"] == 1)
    {
    for($fids=0; $fids < $limit; $fids++, $fid-1)
    {
    $ids = "id='" . $fid . "' or <br />" ;
    print $ids;

    }
    }
    //state==2 vuol dire che deve andare avanti
    if($_GET["state"] == 2)
    {
    for($fids=0; $fids < $limit; $fids++, $fid++)
    {
    if($fid == 0)
    {
    $fid++;
    }
    $ids = "id='" . $fid . "' or " ;
    print $ids;

    }[/php]appena caricata la pagina $ids ha il valore: "id='1' or id='2' or id='3' or"

    cliccando su avanti:

    id='4' or id='5' or id='6' or

    ma cliccando poi su indietro invece di tornare a 1,2,3 diventa:

    id='7' or id='8' or id='9' or

    continua a salire nonostante gli abbia detto di scendere!
    Qualcuno sa aiutarmi?
    Se vi servono altre parti del codice non esitate a chiedere 😉


  • User Attivo

    Ciao,
    intanto qui
    [PHP]
    for($fids=0; $fids < $limit; $fids++, $fid-1)
    [/PHP]
    non fai alcun decremento della variabile $fid
    dovrebbe essere
    [PHP]
    for($fids=0; $fids < $limit; $fids++, $fid--)
    [/PHP]

    Questo errore però non spiega il fatto che la variabile continui ad incrementare... sei sicuro che quando fai "indietro" gli passi
    state=1?


  • Super User

    Ho modificato un po' il codice...:

    [php]
    $fid=$_GET["lasid"];
    if(!$fid)
    {
    $fid=1;
    }
    $state=$_GET["state"];
    if(!$state)
    {
    $state = 2;
    }

    if($state == 1)
    {
    for($fids=0; $fids < $limit; $fids++, $fid--)
    {
    $ids = "id='" . $fid . "' or" ;
    print $ids;

    }
    }
    elseif($state == 2)
    {
    for($fids=0; $fids < $limit; $fids++, $fid++)
    {
    if($fid == 0)
    {
    $fid++;
    }
    $ids = "id='" . $fid . "' or " ;
    print $ids;

    }
    }[/php]$fid parte da avere valore:

    id='1' or id='2' or id='3' or

    cliccando su next ha valore

    id='4' or id='5' or id='6' or

    cliccando poi suo previous:

    id='7' orid='6' orid='5' or

    oltre che facendo impazzire tutto lo script 😕


  • User Attivo

    Forse è meglio che posti il resto del codice...


  • Super User

    [php]
    <?php
    session_start();
    require('config.php');
    require('title.php');
    include('header.php');
    ?>
    <body bgcolor="<?php print $background; ?>">

    <?php
    //defines number of pages needed
    $limit=3;
    $query=mysql_query("SELECT * FROM news") or die ("Query error: " . mysql_error());
    $num=mysql_num_rows($query);
    $nump=$num/$limit;

    if(isset($_GET["p"]))
    {
    $p=$_GET["p"];
    }
    else
    {
    $p=1;
    }
    if($p <= 0)
    {
    $p=1;
    }

    if($p == ceil($nump) and $p == 1)
    {
    print "One page for all articles?";
    }
    //end of defining 🙂
    $fid=$_GET["lasid"];
    if(!$fid)
    {
    $fid=1;
    }
    $state=$_GET["state"];
    if(!$state)
    {
    $state = 2;
    }

    if($state == 1)
    {
    for($fids=0; $fids < $limit; $fids++, $fid--)
    {
    $ids = "id='" . $fid . "' or" ;
    print $ids;

    }
    }
    elseif($state == 2)
    {
    for($fids=0; $fids < $limit; $fids++, $fid++)
    {
    if($fid == 0)
    {
    $fid++;
    }
    $ids = "id='" . $fid . "' or " ;
    print $ids;

    }
    }
    //prima di tutto aggiustare questa query!
    $sql=mysql_query("SELECT * FROM news WHERE " . $ids . " id='' ORDER BY time Desc LIMIT " . $limit . " ") or die ("Query error: " . mysql_error());

    print'
    <center>
    <table border="1">
    <tr>
    <td width="300">
    <center>
    <b>Title</b>
    </center>
    </td>
    <td width="300">
    <center>
    <b>Author</b>
    </center>
    </td>
    <td width="300">
    <center>
    <b>Date</b>
    </center>
    </td>
    </tr>
    </table>
    <table border="1">
    ';
    while($fetch=mysql_fetch_array($sql))
    {
    $id=$fetch['id'];
    $time=$fetch['time'];
    print '
    <tr>
    <td width="300">';
    print"<center><a href='comment.php?com=com&id=$id' STYLE='text-decoration: none'>" . $fetch['title'] . "</a></center>";
    print'</td>
    <td width="300">
    <center>' . $fetch['puser'] . '</center>
    </rd>
    <td width="300">
    <center>' . $fetch['time'] . '</center>
    </td>
    </tr>
    ';
    }
    print '</table>';
    $lasid=$fid;
    $np = $p+1;
    $op = $p-1;
    ?>
    <br />
    <a href="<?php $php_self ?>?p=<?php print $op; ?>&lasid=<?php print $lasid; ?>&state=1"><< Previous</a>

    <?php
    for($s=1; $s <= $nump; $s++)
    {
    if($s == $p)
    {
    print "<b>[</b>" . $s . "<b>]</b>";
    }
    else
    {
    print $s;
    }
    }
    ?>

    <a href="<?php $php_self ?>?p=<?php print $np; ?>&lasid=<?php print $lasid; ?>&state=2">Next >></a>
    <br />
    <br />
    <?
    include('footer.php');
    ?>[/php]


  • User Attivo

    Ciao,
    credo questa sia una delle peggiori paginazione che si possano realizzare e ti consiglio di cabiare decisamente strada perchè, oltre a dover far funzionare questo script che presenta alcuni problemi nei due cicli for che usi per andare "avanti" e "indietro", ti creerà problemi ben maggiori quando, per un qualsiasi motivo, dovrai cancellare un record dal database e non avrai più ID sequenziali, ma ti ritroverai uno o più "buchi".

    Riguardo al tuo script, come ho scritto prima, il problema è causato dalla gestione dei cicli for.
    Questo ad esempio
    [PHP]
    for($fids=0; $fids < $limit; $fids++, $fid++)
    [/PHP]
    il ciclo termina quando $fids sarà uguale a $limit, ma quando ciò avverrà, $fid sarà stato anc'esso incrementato di un ulteriore valore.
    Lo stesso discorso vale per l'altro ciclo for in cui $fid viene decrementata.

    Oltre a questo, non vedo alcun controllo su $fid che gli impedisca di assumere valori negativi o di superare il numero massimo di elementi.

    Rinnovo il consiglio di abbandonare questa via e di seguirne un altra:
    MySql ti mette a disposizione una comoda opzione:
    LIMIT

    Ad esempio

    SELECT * FROM tabella LIMITI 10,3

    ti fornirà i risultati 10,11,12... che non significa qeulli di ID 10,11 o 12, ma esattamente il decimo, l'undicesimo e il dodicesimo. In questo modo non dovrai preoccuparti di avere "buchi" di ID dovuti a cancellazioni di record

    Alessandro


  • Super User

    Ciao, effettivamente è stato il mio primo tentativo di riuscire a fare qualcosa... conosci mica dei siti dove posso trovare dei tutorial? 😄


  • User Attivo

    Cercando con google "tutorial paginazione php" ne puoi trovare diversi.

    Ti posto il codice che solitamente utilizzo io.

    [PHP]
    <?php ### Funzione javascript per salto pagina ### ?>
    <script type="text/javascript">
    function vaiPag()
    {
    n=document.getElementById("pagN").value;
    window.location="nome_pagina.php?p="+parseInt(n);
    }
    </script>

    <?php

    Numero di elementi per pagina

    define("N_DATI_PAG",20);

    $query="SELECT count(*) FROM tabella";
    $num=mysql_fetch_row(mysql_query($query));

    Calcolo numero massimo pagine

    $maxPag=max(1,ceil($num[0]/N_DATI_PAG));

    Calcolo pagina corrente

    $pag=isset($_GET['p'])?intval($_GET['p']):1;
    $pag=max(1,min($pag,$maxPag));

    Pulsanti navigazione

    ?>

    <?php ### Vai alla prima pagina ### ?>
    <a href="nome_pagina.php?p=1">|&lt;</a> &nbsp; 
    
    <?php ### Pagina precedente ### ?>
    <a href="nome_pagina.php?p=<?php echo max(1,$pag-1) ?>">&lt;&lt;</a> &nbsp; 
    
    <?php ### Pagina corrente ### ?>
    Pag <?php echo $pag ?>/<?php echo $maxPag ?> &nbsp; 
    
    <?php ### Pagina successiva ### ?>
    <a href="nome_pagina.php?p=<?php echo min($maxPag,$pag+1) ?>">&gt;&gt;</a> &nbsp; 
    
    <?php ### Vai all'ultima pagina ### ?>
    <a href="nome_pagina.php?p=<?php echo $maxPag ?>">&gt;|</a> &nbsp;
    
    <?php ### Vai a pagina N ### ?>
    <input type="text" id="pagN" style="width:30px" /> <a href="javascript:vaiPag();">Vai a pag</a>
    

    <?php

    Selezione elementi della pagina

    $query="SELECT * FROM tabella LIMIT ".(($pag-1)*N_DATI_PAG).",".N_DATI_PAG;

    $result=mysql_query($query);
    while ($res=mysql_fetch_array($result))
    {
    ### Visualizzazione dati ###
    }
    ?>
    [/PHP]

    Alessandro


  • Super User

    OK proverò a fare qualcosa di simile 🙂 Grazie per l'aiuto 😄