Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139

    Problemi estrazione dati selezionando numero pagina

    Ciao a tutti,

    nel mio sito, ho in un database delle dispense, con chiave primaria idD che va da 1 a 24, aventi il campo idT=1.
    Adesso, vorrei mostrare le mie dispense 9 alla volta da quella con idD maggiore(la più recente) a quella con idD minore(la meno recente).
    Quindi in questo caso ho 3 pagine, dove nella prima mostro le dispense dalla 24 alla 16, nella pagina 2 dalla 15 alla 7 e nella pagina 3 dalla 6 alla 1.

    Il codice che uso è il seguente:
    codice:
    <html>
       <head>
             <img class="logosito" src="Logo.jpg" alt="Logo sito">
             <?php include "..\www.Test1.it\crea.php";
                   include "..\www.Test1.it\crea-tabelle.php";
                   //serve per aprire la connessione al database
                   include "..\www.Test1.it\Connetti.php";
                   include_once('C:\xampp\htdocs\www.Test1.it\FStile.css');
                   //include ('navbar.php');
             ?>
          <ul>
             <li><a class="active" href="..\index.php">Home</a></li>   
             <li><a href="..\Dispense.php">Dispense</a></li> 
             <li><a href="..\Esercizi.php">Esercizi</a></li> 
             <li><a href="..\Videolezioni.php">Videolezioni</a></li> 
             <li><a href="..\Tutorial.php">Tutorial</a></li>
         </ul>
       </head>
       <body>
           <div>
             <p class="large">Benvenuto su TuttoIngegneria.it, il portale dedicato agli studenti delle facoltà scientifiche.<br>
             Qui troverai tutto il materiale necessario allo studio, e non solo, sono presenti dispense, eserciziari, videolezioni,
             tutorial e molto altro.<br>
             La home contiene qui di seguito i caricamenti più recenti, che siano dispense, tutorial o contributi video.
             <br>Buona Navigazione!! Non dimenticare di seguirici anche su youtube.</p>
           </div>
             
             <?php
             
                //indica i limiti di selezione delle dispense
                $m=0;
                $M=9;
                
                $query="SELECT idD FROM dispensa";
                $risultato=mysqli_query($conn,$query);
                $righe=mysqli_num_rows($risultato);
                
                if(($righe% 9)==0)
                {
                   $pag=$righe/9;
                }else {
                   $pag=floor($righe/9)+1;
                }
                
                if($_GET['pages']!=NULL)
                {
                   $arrivata=$_GET['pages'];
                   if($arrivata==1)
                   {
                      $m=0;
                      $M=9;
                   }else if($arrivata>1)
                   {
                      $m=0;
                      $M=9;
                      for($i=0;$i<=($arrivata-1);$i++)
                      {
                         $m=$m+9;
                         $M=$M+9;
                      }
                   }
                }
                
                $query2="SELECT * FROM dispensa WHERE idT='1' AND idD>".$m." AND idD<=".$M." ORDER BY idD DESC";
                $risultato2=mysqli_query($conn,$query2);
               /* $query="SELECT COUNT 'idD' FROM dispensa ";
                $r=mysqli_query($conn,$query);
                $query1="SELECT * FROM dispensa WHERE idT='1' ORDER BY idD DESC LIMIT 9";
                $r1=mysqli_query($conn,$query1);*/
                
                if(mysqli_num_rows($risultato2)>0)
                {
                   $c=0;
                   //mandiamo i dati in output
                   while($row=mysqli_fetch_assoc($risultato2))
                   {
                      if($c==0)
                      {
                         echo "<ul class=\"result\">";
                         echo "<li class=\"result\"><a href=".$row['file']."><img src=".$row['immagine']."></a></li>";
                         $c++;
                      }else if($c==1)
                      {
                         echo "<li class=\"result\"><a href=".$row['file']."><img src=".$row['immagine']."></a></li>";
                         $c++;
                      }else if($c==2)
                      {
                         echo "<li class=\"result\"><a href=".$row['file']."><img src=".$row['immagine']."></a></li><br>";
                         $c=0;
                         echo "</ul>";
                      }
                   }
     
                }  
                
                
                echo "<form id=\"form-id\" method=\"get\" action=\"index.php\">";
                echo "<select name=\"pages\" onchange=\"this.form.submit()\">";
                $x=0;
                for($i=0; $i<$pag; $i++)
                {
                   $x=$i+1;
                   if($_GET['pages']==$x){
                   echo "<option value='$x' selected='selected'>$x</option>";
                   } else {
                   echo "<option value='$x'>$x</option>";
                   }
                }
                echo "</select>";
                echo "</form>";
             ?>
             
       </body>
    </html>
    ho il problema, che le dispense vengono visualizzate non nella maniera che ho descritto, prima, infatti nella pagina 1 sono mostrate le dispense con idD che va da 9 ad 1, nella pagina 2 quelle con idD che va da 24 a 19, e la pagina 3 è vuota.
    Non riesco a capire da dove derivi il problema, inoltre ho anche l'errore, appena caricata la pagina, ovvero prima di fare una qualsiasi delle pagine da visualizzare, sulla linea 45 del codice-> Undefined index: pages in C:\xampp\htdocs\www.Test1.it\index.php on line 45.

    Grazie a tutti per l'aiuto!!

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,359
    Già una cosa. Hai scritto : select idD from dispensa. Poi recuperi il numero delle righe con mysqli_num_rows.
    Come fai carichi in memoria tutti gli id che hai ed é uno sprecco di memoria.

    E' meglio fare un : select count(idD) as num_record from dispensa. Poi recuperi num_record con uno fetch e fai l'assegnazione a $righe.

    C'è anche un metodo che consente di ricavare il numero dei record di una tabella leggendo le proprietà della suddetta tabella ma non mi ricordo come (non ho il PC davanti a me).
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,359
    Un'altra cosa.

    Come fai è sbagliato. Non devi contare/sceglere gli id ma bensi i record. Devi usare la funzione LIMIT di mysql. Non c'è altra via di scampo per fare quello che vuoi.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Un'altra cosa.

    Come fai è sbagliato. Non devi contare/sceglere gli id ma bensi i record. Devi usare la funzione LIMIT di mysql. Non c'è altra via di scampo per fare quello che vuoi.
    Ciao Badaze,

    innanzitutto grazie per la risposta, se ho capito bene, dovrei quindi modificare in questo modo l'assegnazione delle righe?:
    codice:
    $query="SELECT COUNT(idD) AS num_record FROM dispensa";
                $num_record=mysqli_query($conn,$query);
                $righe=mysqli_fetch_assoc($num_record);
    così facendo, però ottengo l'errore: Unsupported operand types in C:\xampp\htdocs\www.Test1.it\index.php on line 42
    cosa ho sbagliato a modificare?
    Riguardo l'uso del LIMIT, devo fare un qualcosa del tipo: "SELECT * FROM dispensa WHERE idT='1' AND idD=".$M." LIMIT 9";
    dove faccio variare $M quale indice della prima dispensa di ogni pagina e con limit 9 indico di volere solo 9 elementi..??

    Grazie ancora per l'aiuto

  5. #5
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,359
    Prova

    Codice PHP:
    list($righe)=mysqli_fetch_array($num_record); 
    Per LIMIT.
    La clausola WHERE non deve contenere alcun riferimento ad un idD. Non stai lavorando con degli id ma con dei record.
    Non ho il tempo (per adesso) di fare un programmino.

    LIMIT ha 2 parametri : il numero (indice) del record nel l'insieme dei record estratti e il numero dei record da prendere a partire dal primo parametro. Nell'assoluto il primo record estratto ha sempre il numero 0.

    Nel tuo caso. Se hai 38 record : hai 38/9 = 4,2222 quindi 5 pagine. 4 complete + 1 parziale.

    Per la prima pagina : select blablabla from tabella limit 0, 9
    Per la seonda pagina : select blablabla from tabella limit 9, 9
    Per la terza pagina : select blablabla from tabella limit 18, 9
    Per la quarta pagina : select blablabla from tabella limit 27, 9
    Per la quinta pagina : select blablabla from tabella limit 36, 9

    Si può ridurre in :
    select blablabla from tabella limit (($numero_pagina -1)*9), 9

    $numero_pagina inizia da 1.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Prova

    Codice PHP:
    list($righe)=mysqli_fetch_array($num_record); 
    Per LIMIT.
    La clausola WHERE non deve contenere alcun riferimento ad un idD. Non stai lavorando con degli id ma con dei record.
    Non ho il tempo (per adesso) di fare un programmino.

    LIMIT ha 2 parametri : il numero (indice) del record nel l'insieme dei record estratti e il numero dei record da prendere a partire dal primo parametro. Nell'assoluto il primo record estratto ha sempre il numero 0.

    Nel tuo caso. Se hai 38 record : hai 38/9 = 4,2222 quindi 5 pagine. 4 complete + 1 parziale.

    Per la prima pagina : select blablabla from tabella limit 0, 9
    Per la seonda pagina : select blablabla from tabella limit 9, 9
    Per la terza pagina : select blablabla from tabella limit 18, 9
    Per la quarta pagina : select blablabla from tabella limit 27, 9
    Per la quinta pagina : select blablabla from tabella limit 36, 9

    Si può ridurre in :
    select blablabla from tabella limit (($numero_pagina -1)*9), 9

    $numero_pagina inizia da 1.
    Ciao Badaze,

    allora provando il codice che mi hai detto per contare il numero di righe, ho ancora errore, quindi per testare il funzionamento sono tornato al codice che ho usato nel primo messaggio.
    Adesso riesco anche ad estrarre le mie dispense così come voglio, ma sorge un nuovo problema, appena caricata la pagina index.php, ho le notizie volute, e se clicco sul selettore di pagina, correttamente mi fa scorrere tra 3 pagine, e selezionando la pagina, mi mostra in output le dispense corrette.
    Però adesso come inizio a navigare tra le 3 pagine, dal menù a tendina che uso per selezionare la pagina voluta, mi scompaiono le pagine, e mi resta solo una pagina, la 1 e non riesco a navigare più tra le pagine.
    Infine nel primo caricamento di index.php, cioè quando non ho selezionato alcuna pagina mi da errore sulla linea 44, questo perchè giustamente $_GET['pages'] è ancora senza valore, come posso eliminare questo errore??
    Il codice attuale della pagina è:
    codice:
    <html>
       <head>
             <img class="logosito" src="Logo.jpg" alt="Logo sito">
             <?php include "..\www.Test1.it\crea.php";
                   include "..\www.Test1.it\crea-tabelle.php";
                   //serve per aprire la connessione al database
                   include "..\www.Test1.it\Connetti.php";
                   include_once('C:\xampp\htdocs\www.Test1.it\FStile.css');
                   //include ('navbar.php');
             ?>
          <ul>
             <li><a class="active" href="..\index.php">Home</a></li>   
             <li><a href="..\Dispense.php">Dispense</a></li> 
             <li><a href="..\Esercizi.php">Esercizi</a></li> 
             <li><a href="..\Videolezioni.php">Videolezioni</a></li> 
             <li><a href="..\Tutorial.php">Tutorial</a></li>
         </ul>
       </head>
       <body>
           <div>
             <p class="large">Benvenuto su TuttoIngegneria.it, il portale dedicato agli studenti delle facoltà scientifiche.<br>
             Qui troverai tutto il materiale necessario allo studio, e non solo, sono presenti dispense, eserciziari, videolezioni,
             tutorial e molto altro.<br>
             La home contiene qui di seguito i caricamenti più recenti, che siano dispense, tutorial o contributi video.
             <br>Buona Navigazione!! Non dimenticare di seguirici anche su youtube.</p>
           </div>
             
             <?php
             
                //indica i limiti di selezione delle dispense
                $m=0;
                
                $query="SELECT * FROM dispensa WHERE idT='1'";
                $r=mysqli_query($conn,$query);
                $righe=mysqli_num_rows($r);
                
                if(($righe% 9)==0)
                {
                   $pag=$righe/9;
                }else {
                   $pag=floor($righe/9)+1;
                }
                
                if($_GET['pages'])
                {
                   $pag=$_GET['pages'];
                   $m=($pag-1)*9;
                }
                
                $query2="SELECT * FROM dispensa WHERE idT='1' ORDER BY idD DESC LIMIT ".$m.", 9 ";
                $risultato2=mysqli_query($conn,$query2);
               /* $query="SELECT COUNT 'idD' FROM dispensa ";
                $r=mysqli_query($conn,$query);
                $query1="SELECT * FROM dispensa WHERE idT='1' ORDER BY idD DESC LIMIT 9";
                $r1=mysqli_query($conn,$query1);*/
                
                if(mysqli_num_rows($risultato2)>0)
                {
                   $c=0;
                   //mandiamo i dati in output
                   while($row=mysqli_fetch_assoc($risultato2))
                   {
                      if($c==0)
                      {
                         echo "<ul class=\"result\">";
                         echo "<li class=\"result\"><a href=".$row['file']."><img src=".$row['immagine']."></a></li>";
                         $c++;
                      }else if($c==1)
                      {
                         echo "<li class=\"result\"><a href=".$row['file']."><img src=".$row['immagine']."></a></li>";
                         $c++;
                      }else if($c==2)
                      {
                         echo "<li class=\"result\"><a href=".$row['file']."><img src=".$row['immagine']."></a></li><br>";
                         $c=0;
                         echo "</ul>";
                      }
                   }
     
                }  
                
                
                echo "<form id=\"form-id\" method=\"get\" action=\"index.php\">";
                echo "<select name=\"pages\" onchange=\"this.form.submit()\">";
                $x=0;
                for($i=0; $i<$pag; $i++)
                {
                   $x=$i+1;
                   if($_GET['pages']==$x){
                   echo "<option value='$x' selected='selected'>$x</option>";
                   } else {
                   echo "<option value='$x'>$x</option>";
                   }
                }
                echo "</select>";
                echo "</form>";
             ?>
             
       </body>
    </html>
    Grazie ancora per l'aiuto!!

  7. #7
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,359
    Ti propongo di provare il codice qui sotto.
    Devi modificare i dati per la connessione al database.
    Devi importare la struttura e i dati usati nell'esempio. Provalo cosi com'è senza modificare nulla e studiane il funzionamento.

    File test9336.php
    Codice PHP:
    <?php
    //---- Connessione al DB
    $conn        = new mysqli("localhost","root","""tests"); 
    //---- N° dei record nella tabella
    $query       "SELECT count(*) as num_records FROM tabella1";            
    $r           mysqli_query($conn,$query);            
    list(
    $righe) = mysqli_fetch_array($r);
    //---- N° dei record per pagina
    $items_pagina 5;
    //---- N° di pagine
    $num_pagine   = ($righe $items_pagina) == $righe $items_pagina : (int) ($righe $items_pagina) + 1;
    //---- Di default = pagina 1
    $pagina      1;
    if (isset(
    $_GET ['pag']))
    {
     
    //---- Testa se numerico
     
    $temp $_GET ['pag'];
     if (
    is_numeric($temp))
     {
      if ((
    $temp >= 1) && ($temp <= $num_pagine))
      {
       
    //---- N° di pagina trasmesso dal parametro
       
    $pagina$temp;   
      }
     }
    }
    ?>
    <!--  --------------------- -->
    <!--  Prima pagina          -->
    <!--  --------------------- -->
    <a href="test9336.php?pag=1" title="Prima pagina">&lt;&lt;</a>&nbsp;
    <!--  --------------------- -->
    <!--  Pagina precedente     -->
    <!--  --------------------- --><?php
    if ($pagina 1
    {
     
    $pag_prec $pagina 1;
    }
    else
    {
     
    $pag_prec 1;
    }
    ?>
    <a href="test9336.php?pag=<?php print $pag_prec;?>" title="Pagina precedente">&lt;</a>&nbsp;
    <!--  --------------------- -->
    <!--  Pagine                -->
    <!--  --------------------- --><?php
    //---- Creazioni dei link
    for ($i=1;$i<=$num_pagine;$i++)
    {
    ?>
     <a href="test9336.php?pag=<?php print $i;?>"><?php print $i;?></a>&nbsp;<?php
    }?>
    <!--  --------------------- -->
    <!--  Pagina successiva     -->
    <!--  --------------------- --><?php
    if ($pagina $num_pagine) {
     
    $pag_succ $pagina 1;
    }
    else
    {
     
    $pag_succ $pagina;
    }
    ?>
    <a href="test9336.php?pag=<?php print $pag_succ;?>" title="Pagina successiva">&gt;</a>&nbsp;
    <!--  --------------------- -->
    <!--  Ultima pagina         -->
    <!--  --------------------- -->
    <a href="test9336.php?pag=<?php print $num_pagine;?>" title="Ultima pagina">&gt;&gt;</a>
    <br/>
    <table>
    <tr>
    <td>Padre</td><td>Figlio</td>
    </tr>
    <?php
    //---- Tabella con la pagina corrente
    $primo_record = ($pagina 1) * $items_pagina;
    $query        "SELECT * FROM tabella1 order by padre limit $primo_record$items_pagina";            
    $r            mysqli_query($conn,$query);  
    while (list(
    $padre,$figlio) = mysqli_fetch_array($r))
    {
    ?>
     <tr>
     <td><?php print $padre;?></td><td><?php print $figlio;?></td>
     </tr><?php
    }?>
    </table>
    Struttura e dati della tabella tabella1
    codice:
    -- phpMyAdmin SQL Dump
    -- version 4.7.0
    -- https://www.phpmyadmin.net/
    --
    -- Hôte : 127.0.0.1
    -- Généré le :  jeu. 17 août 2017 à 17:51
    -- Version du serveur :  5.7.17
    -- Version de PHP :  7.1.3
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
    SET time_zone = "+00:00";
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
    --
    -- Base de données :  `tests`
    --
    -- --------------------------------------------------------
    --
    -- Structure de la table `tabella1`
    --
    CREATE TABLE `tabella1` (
      `padre` int(11) NOT NULL,
      `figlio` int(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
    --
    -- Déchargement des données de la table `tabella1`
    --
    INSERT INTO `tabella1` (`padre`, `figlio`) VALUES
    (1, 2),
    (1, 3),
    (1, 4),
    (2, 21),
    (2, 22),
    (2, 23),
    (3, 31),
    (3, 32),
    (4, 41),
    (21, 220),
    (21, 221),
    (23, 230),
    (23, 231),
    (32, 320),
    (32, 322),
    (32, 323),
    (231, 2310);
    --
    -- Index pour les tables déchargées
    --
    --
    -- Index pour la table `tabella1`
    --
    ALTER TABLE `tabella1`
      ADD UNIQUE KEY `padre` (`padre`,`figlio`);
    COMMIT;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  8. #8
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,359
    Non si vede che ho postato un messaggio.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139
    Ciao Badaze,

    scusami ma questi giorni non ho avuto modo di risponderti, ho testato il tuo codice e l'ho usato per capire dove non funzionava il mio, l'ho trovato utilissimo.
    Alla fine perdevo le pagine, dato che dalla dichiarazione al punto dove mi servivano, mi venivano modificate, avevo fatto la svista di non notare che riutilizzavo la medesima variabile per una diversa operazione, modificato quello funziona tutto ottimamente.

    Adesso vorrei chiederti, ho una pagina Ricerca.php, che dovrei farla usare da due pagine Dispense.php ed Esercizi.php, praticamente mi funziona tutto alla perfezione, ma ho un problema banale che non riesco a risolvere.
    In pratica ho la mia barra di navigazione, dove la pagina corrente ha un colore diverso dal resto della barra.
    Se mi trovo su Dispense.php e faccio l'operazione di ricerca, riottengo i risultati sulla pagina Dispensa.php, mentre se sulla pagina Esercizi.php ed effettuo la ricerca, i risultati della ricerca mi vengono dati in modo corretto, ma ho "attiva" la pagina Dispense.php, mentre dovrebbe restarmi attiva Esercizi.php.
    Cosa potrebbe essere??

    Grazie mille per l'aiuto!!

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.