Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    343

    [PHP + MYSQL] Paginazione e cancellazione record

    Ciao a tutti, premetto che sto imparando gradualmente PHP e che non è da molto che ci "smanetto".
    Sto diventando matto per un problema.

    Ho un DB ("users") con una tabella ("utenti") con 3 campi: id, nome, cognome.

    Ho creato una pagina php che estrae i dati contenuti nel DB, li mette in tabella e, per ogni elemento, dà la possibilità di cancellare uno o più elementi selezionando la rispettiva checkbox.

    Fin qui tutto ok.

    Il problema è che il database contiene un numero veramente enorme di valori ed io vorrei suddividere questi record estratti facendo apparire il numero delle pagine con le freccine avanti e indietro

    es: << 1, 2 ... 5 >>

    Ora: in Internet, come pure su html.it ho trovato delle ottime guide che spiegano come ottenere questa cosa comunemente chiamata 'paginazione'...però non riesco ad integrarle nel mio codice. Credo che il problema sia dovuto al fatto che sia la cancellazione che la paginazione utilizzano le variabili _GET e che io non riesco correttamente a gestire, proprio perché sono ancora un po' imbranato...

    Mi potreste gentilmente aiutare?

    Questo è il codice della pagina mostra_nomi.php e che funziona bene


    Codice PHP:
    <?php
    $DB_host     
    'localhost';
    $DB_user     'root';
    $DB_password '';
    $DB_name     'users';

    //connessione al DB
    $link mysql_connect($DB_host$DB_user$DB_password);

    if (!
    $link) {

    die (
    'Non riesco a connettermi: ' mysql_error());

    }

    $db_selected mysql_select_db($DB_name$link);

    if (!
    $db_selected) {

    die (
    "Errore nella selezione del database: " mysql_error());

    }

    if(
    $_POST)

    {

    $ids = isset($_POST['id']) ? $_POST['id'] : array();

    elimina_record($ids);

    }

    elseif(isset(
    $_GET['id']))

    {

    elimina_record(array($_GET['id']));

    }

    else

    mostra_lista();

    function 
    mostra_lista()

    {

    // mostro un eventuale messaggio

    if(isset($_GET['msg']))

    echo 
    '[b]'.htmlentities($_GET['msg']).'[/b]

    '
    ;

    // preparo la query

    $query "SELECT id,nome,cognome FROM utenti";

    // invio la query
    $result mysql_query($query);


    // controllo l'esito

    if (!$result) {

    die(
    "Errore nella query $query: " mysql_error());

    }


    echo 
    '<form name="form1" method="post" action="">

    <table border="1">

    <tr>

    <th></th>

    <th>Nome</th>

    <th>Cognome</th>

    <th></th>

    </tr>'
    ;


    while (
    $row mysql_fetch_assoc($result))

    {

    $nome htmlentities($row['nome']);
    $cognome htmlentities($row['cognome']);

    // preparo il link per la modifica dei dati del record

    $link $_SERVER['PHP_SELF'].'?id=' $row['id'];

    echo 
    "<tr>

    <td><input name=\"id[]\" type=\"checkbox\" value=\"
    $row[id]\" /></td>

    <td>
    $nome</td>

    <td>
    $cognome</td>

    <td><a href=\"
    $link\">elimina</a></td>

    </tr>"
    ;

    }


    echo 
    '</table>




    <input type="submit" name="Submit" value="Elimina record selezionati" />

    </form>'
    ;

    // libero la memoria di PHP occupata dai record estratti con la SELECT

    mysql_free_result($result);


    // chiudo la connessione a MySQL

    mysql_close();

    }

    function 
    elimina_record($ids)

    {
    // verifico che almeno un id sia stato selezionato

    if(count($ids) < 1)

    {

    $messaggio urlencode("Nessun record selezionato!");

    header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);

    exit;

    }


    // per precauzione converto gli ID in interi

    $ids array_map('intval',$ids);

    // creo una lista di ID per la query

    $ids implode(',',$ids);

    // preparo la query

    $query "DELETE FROM utenti WHERE id IN ($ids)";

    // invio la query

    $result mysql_query($query);

    // controllo l'esito

    if (!$result) {

    die(
    "Errore nella query $query: " mysql_error());

    }


    // conto il numero di record cancellati

    $num_record mysql_affected_rows();


    // chiudo la connessione a MySQL

    mysql_close();

     

    $messaggio urlencode("Numero record cancellati: $num_record");

    header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);

    }

    ?>
    Questa è la pagina sorella di quella sopra che dovrebbe mostrare i risultati della query spalmandoli su più pagine (ma non funziona ):

    Codice PHP:
    <?php
    $DB_host     
    'localhost';
    $DB_user     'root';
    $DB_password '';
    $DB_name     'users';


    //Connetto al database


    $link mysql_connect($DB_host$DB_user$DB_password);

    if (!
    $link) {

    die (
    'Errore durante la connessione: ' mysql_error());

    }


    $db_selected mysql_select_db($DB_name$link);

    if (!
    $db_selected) {

    die (
    "Errore durante la selezione del database: " mysql_error());

    }


    if(
    $_POST)

    {

    $ids = isset($_POST['id']) ? $_POST['id'] : array();

    elimina_record($ids);

    }

    elseif(isset(
    $_GET['id']))

    {

    elimina_record(array($_GET['id']));

    }

    else

    mostra_lista();


    function 
    mostra_lista()

    {

    // mostro un eventuale messaggio

    if(isset($_GET['msg']))

    echo 
    '[b]'.htmlentities($_GET['msg']).'[/b]

    '
    ;

    //---------------------------codice per elenco pagine
    // esecuzione prima query
    $count mysql_query("SELECT COUNT(id) FROM utentii");
    $res_count mysql_fetch_row($count);

    // numero totale di records
    $tot_records $res_count[0];

    // risultati per pagina(secondo parametro di LIMIT)
    $per_page 2;

    // numero totale di pagine
    $tot_pages ceil($tot_records $per_page);

    // pagina corrente
    $current_page = (!$_GET['page']) ? : (int)$_GET['page'];

    // primo parametro di LIMIT
    $primo = ($current_page 1) * $per_page;

    //-------------------------------------------------

    // preparo la query

    $query "SELECT id,nome,cognome FROM utenti LIMIT $primo$per_page;";

     

    // invio la query
    $result mysql_query($query);


    // controllo l'esito

    if (!$result) {

    die(
    "Errore nella query $query: " mysql_error());

    }

     

    echo 
    '

    <form name="form1" method="post" action="">

    <table border="1">

    <tr>

    <th></th>

    <th>Nome</th>

    <th>Cognome</th>

    <th></th>

    </tr>'
    ;


    while (
    $row mysql_fetch_assoc($result))

    {

    $nome htmlentities($row['nome']);
    $cognome htmlentities($row['cognome']);

     

    // preparo il link per la modifica dei dati del record

    $link $_SERVER['PHP_SELF'].'?id=' $row['id'];

     

    echo 
    "<tr>

    <td><input name=\"id[]\" type=\"checkbox\" value=\"
    $row[id]\" /></td>

    <td>
    $nome</td>

    <td>
    $cognome</td>

    <td><a href=\"
    $link\">elimina</a></td>

    </tr>"
    ;

    }


    echo 
    '</table>




    <input type="submit" name="Submit" value="Elimina record selezionati" />

    </form>'
    ;

     

    // libero la memoria di PHP occupata dai record estratti con la SELECT

    mysql_free_result($result);


    // chiudo la connessione a MySQL

    mysql_close();

    }

     

    function 
    elimina_record($ids)

    {
    // verifico che almeno un id sia stato selezionato

    if(count($ids) < 1)

    {

    $messaggio urlencode("Nessun record selezionato!");

    header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);

    exit;

    }

     

    // per precauzione converto gli ID in interi

    $ids array_map('intval',$ids);

     

    // creo una lista di ID per la query

    $ids implode(',',$ids);

     

    // preparo la query

    $query "DELETE FROM utenti WHERE id IN ($ids)";

     

    // invio la query

    $result mysql_query($query);

     

    // controllo l'esito

    if (!$result) {

    die(
    "Errore nella query $query: " mysql_error());

    }

     

    // conto il numero di record cancellati

    $num_record mysql_affected_rows();

     

    // chiudo la connessione a MySQL

    mysql_close();

     

    $messaggio urlencode("Numero record cancellati: $num_record");

    header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);

    }

    // includiamo uno dei files contenenti la paginazione, commentate l'altro ovviamente
    include("paginazione_2.php");


    //inseriamo la paginazione
    echo $paginazione;

    ?>
    Mi potreste gentilmente aiutare?

    Grazie mille in anticipo.

  2. #2
    Diciamo che vuoi visualizzare 20 risultati per pagina.

    Per farlo devi solo creare dinamicamente la query di ricerca impostando un LIMIT alla fine

    Ad esempio

    pagina 1 sarà LIMIT 0,20
    pagina 2 sarà LIMIT 20,40
    pagina 3 sarà LIMIT 40,60
    ecc..

    Per fare questo puoi fare uno switch con dentro un for

    ovvero

    $tutti = array con tutti i record esempio l'array con gli id delle righe
    $lung = (count($tutti)%20)+1;

    $risultati = 0;

    switch ($_GET[pagina]) {

    for($cont=0;$cont<$lung;$cont++ {
    $risultati2 = $risultati + 20;

    case $cont:
    $limit = 'LIMIT '.$risultati.','.$risultati2.';
    break;

    $risultati = $risultati + 20;
    }
    }


    In teoria e dico in teoria il for ti dovrebbe creare lo switch per il numero di pagine

    Quindi nella query ti basta mettere $limit alla fine.


    Poi in fondo con un ciclo crei i link alle pagine passando per ogni pagina il numero relativo es. ?pagina=1


    L'ho creato al momento quindi non sono affatto sicuro che funzioni

    e se funziona
    Semplice, intuitivo, veloce e Gratuito!

    Trovare Affiliazioni in base alle tue esigenze?

    infoAffiliazioni.it - Provalo Ora!

  3. #3
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Beh la soluzione e' sempre il limit x,y .

    Io farei una cosa del genere :
    Codice PHP:

    $currPage 
    abs($_GET["page"]);

    $counts 20 //Righe per pagina

    $pageFrom = ($counts*$currPage) :
    $pageto $pageFrom+$counts ;

    // Incrementiamo di 1 se nn siamo sulla prima pagina per evitare la ripetizione 
    //dell'ultimo ris della pag prec
    if( $pageFrom!=0)
       
    $pageFrom++;

    $q "select * from users order by nome asc limit ".$pageFrom.",".$pageTo." " ;

    etc..... 

  4. #4
    $pageFrom = ($counts*$currPage)

    $pageFrom = ($counts*$currPage)
    basta un moltiplicazione per lasciar stare tutto il mio programma.. ghghgh
    Semplice, intuitivo, veloce e Gratuito!

    Trovare Affiliazioni in base alle tue esigenze?

    infoAffiliazioni.it - Provalo Ora!

  5. #5
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Se ci pensi

    $counts e' il numero di righe che stampi per pagina.

    $currPage e' la pagina selezionata.

    quindi il numero di righe moltiplicato per la pagina da visualizzare ti da il valore di partenza.

    poi calcoli il valore finale aggiungendo $counts
    e aumenti il valore inziale di 1 (se nn sei sulla prima pagina) per evitare di rivisualizzare l'ultimo record della pagina precedente.

    Attenzione che devi partire da 0 e non da 1.
    Se parti da 1 devi fare sempre
    $currPage = $_GET["page"] ? (abs($_GET["page"]) )-- : 0 ;
    if( $currPage<0 )
    $currPage = 0;

    Cmq se fai le prove numeriche viene fuori che

    con page = 0

    $currPage = 0;
    $counts = 20 ;
    $pageFrom = ($counts*$currPage) => 20*0 = 0
    $pageTo = $pageFrom+$counts => 0+20 = 20
    $q = "select * from users order by nome asc limit 0,20 " ;

    -------------------------------------------------------------------------

    con page = 1

    $currPage = 1;
    $counts = 20 ;
    $pageFrom = ($counts*$currPage) => 20*1 = 20
    $pageTo = $pageFrom+$counts => 20+20 = 40

    if( $pageFrom!=0)
    $pageFrom++; => 21

    $q = "select * from users order by nome asc limit 21,40 " ;

    -------------------------------------------------------------------------


    con page = 2

    $currPage = 2;
    $counts = 20 ;
    $pageFrom = ($counts*$currPage) => 20*2 = 40
    $pageTo = $pageFrom+$counts => 40+20 = 60

    if( $pageFrom!=0)
    $pageFrom++; => 41

    $q = "select * from users order by nome asc limit 41,60 " ;


    etc......

    Pensa che puoi cosi' anche far decidere all'utente quanti risultati visualizzare per pagina con una banale select.


    EDIT:

    AH poi per il numero di pagine dovrei inserire una piccola query :
    Codice PHP:
    $q "select count(*) from users" 

    $ris mysql_query($q $conn ) ;

    if(
    $ris)
    {
           
    $num =mysql_fetch_array($ris);
           
    $totRows $num[0] ;

           
    $totPages ceil$totRows/$counts ) ;


           for( 
    $i=$i<$totPages $i++ )
                echo 
    "<a href=\"miapagina.php?page=$i\">$i</a> " ;




  6. #6



    cmq la mia era una affermazione.. avevo già capito..
    Semplice, intuitivo, veloce e Gratuito!

    Trovare Affiliazioni in base alle tue esigenze?

    infoAffiliazioni.it - Provalo Ora!

  7. #7
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Ah ok scus

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.