Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    lista province ordinate per regione

    Ciao a tutti.
    Ho creato uno script per visualizzare la lista delle province italiane, ordinate per regione.

    Codice PHP:
    <select name="provincia">
        <option value="0" disabled="disabled">Seleziona una provincia</option>
        <?php
            
    include "connessione.php";
            
    $sql="SELECT * FROM `regioni_province`";
            
            
    $risultato=@mysql_query($sql,$connessione);
            if (!
    $risultato) {
                die (
    "errore: lettura del db non riuscita.");
            }
            
            
    $rows_counter 0;
            
    $rows=@mysql_num_rows($risultato);

            
    $row1st mysql_fetch_row($risultato);
            
    $rows_counter++;
            
    $id=$row1st[0];
            
    $regione_precedente=$row1st[1];
            
    $provincia=$row1st[2];
            
    $sigla_auto=$row1st[3];
        
    ?>

        <optgroup label="<?php echo $regione_precedente?>">
            <option value="<?php echo $sigla_auto?>"><?php echo $provincia." (".$sigla_auto.")"?></option>

        <?php
            
            $j 
    0;
            
            while (
    $rows_counter $rows)
            {
                
    $row=mysql_fetch_row($risultato);
                
    $rows_counter++;
                
    $id=$row[$j++];
                
    $regione=$row[$j++];
                
    $provincia=$row[$j++];
                
    $sigla_auto=$row[$j++];
                
    $j 0;
                
                while (
    $regione_precedente == $regione)
                {
                    echo 
    "<option value=\"".$sigla_auto."\">".$provincia." (".$sigla_auto.")</option>\n";
                    
    $row=mysql_fetch_row($risultato);
                    
    $rows_counter++;
                    
    $id=$row[$j++];
                    
    $regione=$row[$j++];
                    
    $provincia=$row[$j++];
                    
    $sigla_auto=$row[$j++];
                    
    $j 0;
                }
                echo 
    "</optgroup>\n";
                if (
    $rows_counter $rows) { break; }
                echo 
    "<optgroup label=\"".$regione."\">\n";
                echo 
    "<option value=\"".$sigla_auto."\">".$provincia." (".$sigla_auto.")</option>\n";
                
    $regione_precedente $regione;
            }
            
    mysql_close($connessione);
        
    ?>
    </select>

    Alla fine l'output html è simile a questo:


    codice:
    <select name="provincia">
    <option value="0" disabled="disabled">Seleziona una provincia</option>
    <optgroup label="PIEMONTE">
    <option value="TO">Torino (TO)</option>
    <option value="VC">Vercelli (VC)</option>
    <option value="NO">Novara (NO)</option>
    <option value="CN">Cuneo (CN)</option>
    <option value="AT">Asti (AT)</option>
    <option value="AL">Alessandria (AL)</option>
    <option value="BI">Biella (BI)</option>
    <option value="VB">Verbano-Cusio-Ossola (VB)</option>
    </optgroup>
    <optgroup label="VALLE D'AOSTA">
    <option value="AO">Valle d'Aosta (AO)</option>
    </optgroup>
    <optgroup label="TRENTINO-ALTO ADIGE">
    <option value="BZ">Bolzano (BZ)</option>
    <option value="TN">Trento (TN)</option>
    </optgroup>
    </select>
    Ho risolto in modo un po' astruso, spiego un attimo il codice:
    in pratica una volta tirati giù i dati dal db, memorizzo il numero delle righe della query e mando in output la prima riga. Dopodiché faccio un ciclo che controlla ogni volta se la regione della riga che vado a inserire è la stessa della riga inserita prima: se è la stessa mando in output la riga, altrimenti significa che è iniziata una nuova regione, quindi chiudo la precedente e inizio quella nuova, continuando il ciclo esterno (fino alla fine delle righe).

    Lo script funziona, ma sono sicuro che si potrebbe riscrivere in modo molto più semplice... mi aiutate?

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    128
    sì c'è un modo, ora non ti scrivo il codice perchè non ho un db sottomano quindi rischierei di scriverlo male, ma il concetto è che:

    - ordini la query in modo da sapere sicuramente con che regione inizierà lo script
    - ti crei una variabile $nome_regione e la setti col nome della prima regione
    - apri il primo <optgroup label="nomeprima regione">
    - fai una query e cominci a far ciclare
    - ad ogni ciclo imposti la variabile $regione_confronto
    - con un if controlli se regione_confronto è diverso da $nome_regione; se sì, parti con l'option group, altrimenti è un option value normale
    - prima della fine del ciclio ti salvi il nome della regione in $nome_regione.

    Dovrà succedere così, supponendo di partire dal Piemonte
    $nome_regione = Piemonte
    parte il ciclo
    $regione_confronto = $row["regione"] (quindi sarà Piemonte)
    $regione_confronto è diverso da $nome_regione? in questo caso no, quindi crei un option value
    a fine ciclo ti salvi Piemonte in $nome_regione.
    Riparte il ciclo, troverà ad esempio Calabria
    $regione_confronto = $row["regione"] (quindi sarà Calabria)
    $regione_confronto è diverso da $nome_regione? sì, perchè Piemonte != Calabria -> quindi chiudi l'optiongroup e ne apri un altro.

    Quando esce dal ciclo, ricordati di chiudere l'optiongroup oltre alla select

    sembra lungo, ma è molto veloce come codice

  3. #3
    prova un po' così:

    $query=mysql_query("select regione from regioni_province group by regione",$c);
    while($a = mysql_fetch_array($query)or die(mysql_error())){
    echo $a[0]."

    ";
    $query2=mysql_query("select provincia from catalogo where regione=".$a[0],$c);
    $conta=0;
    while($conta < mysql_num_rows($query2)){
    $b = mysql_fetch_array($query2)or die(mysql_error());
    echo $b[0]."
    ";
    $conta++;}
    }

    dove $c è la connessione al db.

  4. #4
    Innanzitutto vi ringrazio per le risposte

    @diabolikk: non ho ancora provato ad applicare i concetti che mi hai detto perché fondamentalmente sono gli stessi che ho usato già... però effettivamente quello di confrontare le regioni pare l'unico metodo efficace... forse mi conviene rifletterci un attimo e pulire un po' il codice!

    @alfonso534791: grazie alfo, il tuo codice è sicuramente più comprensibile del mio! Però ho dei dubbi sulle prestazioni... ho fatto alcune prove riadattando lo script e ci sono un po' di problemi...

    questo è il tuo script leggermente modificato

    Codice PHP:
    <?php
        
    include "connessione.php";
        
        
    $contatore_query 0;
        
        
    $sql1=mysql_query("
        SELECT denominazione_regione
        FROM regioni_province
        GROUP BY denominazione_regione;"
    $connessione);
        if (!
    $sql1) {
            echo 
    "Query1 non riuscita";
        }
        else { 
    $contatore_query++; }
        
        while ( 
    $a mysql_fetch_array($sql1) )
        {
            echo 
    "
    "
    .$a[0]."
    "
    ;
            
            
    $sql2=mysql_query("
            SELECT denominazione_provincia
            FROM regioni_province
            WHERE denominazione_regione='
    $a[0]'"$connessione);
            if (!
    $sql2) {
                echo 
    "Query2 non riuscita";
            }
            else { 
    $contatore_query++; }        
            
            
    $counter 0;
            while ( 
    $counter mysql_num_rows($sql2) )
            {
                
    $b mysql_fetch_array($sql2);
                echo 
    $b[0]."
    "
    ;
                
    $counter++;
            }
        }
        
        echo 
    "

    Totale query eseguite: "
    .$contatore_query;
    ?>
    e questo è l'output:

    codice:
    ABRUZZO
    L'Aquila
    Teramo
    Pescara
    Chieti
    
    BASILICATA
    Potenza
    Matera
    
    CALABRIA
    Cosenza
    Catanzaro
    Reggio di Calabria
    Crotone
    Vibo Valentia
    
    CAMPANIA
    Caserta
    Benevento
    Napoli
    Avellino
    Salerno
    
    EMILIA-ROMAGNA
    Piacenza
    Parma
    Reggio nell'Emilia
    Modena
    Bologna
    Ferrara
    Ravenna
    Forlì-Cesena
    Rimini
    
    FRIULI-VENEZIA GIULIA
    Udine
    Gorizia
    Trieste
    Pordenone
    
    LAZIO
    Viterbo
    Rieti
    Roma
    Latina
    Frosinone
    
    LIGURIA
    Imperia
    Savona
    Genova
    La Spezia
    
    LOMBARDIA
    Varese
    Como
    Sondrio
    Milano
    Bergamo
    Brescia
    Pavia
    Cremona
    Mantova
    Lecco
    Lodi
    Monza e della Brianza
    
    MARCHE
    Pesaro e Urbino
    Ancona
    Macerata
    Ascoli Piceno
    Fermo
    
    MOLISE
    Campobasso
    Isernia
    
    PIEMONTE
    Torino
    Vercelli
    Novara
    Cuneo
    Asti
    Alessandria
    Biella
    Verbano-Cusio-Ossola
    
    PUGLIA
    Foggia
    Bari
    Taranto
    Brindisi
    Lecce
    Barletta-Andria-Trani
    
    SARDEGNA
    Sassari
    Nuoro
    Cagliari
    Oristano
    Olbia-Tempio
    Ogliastra
    Medio Campidano
    Carbonia-Iglesias
    
    SICILIA
    Trapani
    Palermo
    Messina
    Agrigento
    Caltanissetta
    Enna
    Catania
    Ragusa
    Siracusa
    
    TOSCANA
    Massa-Carrara
    Lucca
    Pistoia
    Firenze
    Livorno
    Pisa
    Arezzo
    Siena
    Grosseto
    Prato
    
    TRENTINO-ALTO ADIGE
    Bolzano
    Trento
    
    UMBRIA
    Perugia
    Terni
    
    VALLE D'AOSTA
    Query2 non riuscita
    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in *** on line 29
    
    VENETO
    Verona
    Vicenza
    Belluno
    Treviso
    Venezia
    Padova
    Rovigo
    
    
    Totale query eseguite: 20
    Tutto ok tranne per la Valle d'Aosta (la query fallisce perché c'è l'apice sulla regione). Se contiamo pure la query fallita in totale sarebbero 21, contro la mia che è 1 soltanto... insomma non mi sembra una buona idea inserire una seconda query nel ciclo.

    Ora provo a sistemare un po' lo script, più tardi casomai lo posto di nuovo... intanto se avete in mente altre soluzioni scrivetele pure

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    128
    intendevo così:

    Codice PHP:
    <?php
    // così la prima regione è l'Abruzzo
    $sql1=mysql_query("
        SELECT *
        FROM regioni_province    
      ORDER BY denominazione_regione ASC;"
    ); 
    $conf "Abruzzo";
    // apro la select ed il primo optgroup
    echo '<select name="provincia">';
    echo 
    '<option value="0" disabled="disabled">Seleziona una provincia</option>';
    echo 
    '<optgroup label="Abruzzo">';

    while (
    $rmysql_fetch_array($sql1)) {

    $regione $r["denominazione_regione"];
    // controllo che se regione è diverso al valore di confronto.
    if ($regione!=$conf) {
    echo 
    '</optgroup><optgroup label="'.$r["denominazione_regione"].'">';
         }
        echo 
    "<option value='" .$r["denominazione_provincia"] . "'>" .$r["denominazione_provincia"] . "</option>";
    // aggiorno il valore di confronto per il prossimo ciclo
    $conf $r["ripartizione_geografica"];
        }
        
    // a fine ciclo chiudo l'ultimo optgroup e la select
    echo "</optgroup></select>";
    ?>
    ho fatto una prova con una mia tabella e mi ha dato l'output giusto. Una sola query, codice veloce
    ho cercato di rimettere i tuoi nomi di variabili, colonne e tabelle, non so se mi è sfuggito qualcosa

  6. #6
    Gentilissimo!!
    Ho provato subito il tuo script e funziona, anche se con la mia tabella non ottengo proprio il risultato sperato

    ma ti ringrazio comunque perché i tuoi consigli mi sono serviti a risparmiare qualche riga di codice, ecco lo script finale

    Codice PHP:
    <select name="provincia">
        <option value="0" disabled="disabled">Seleziona una provincia</option>
        <?php
            
    include "connessione.php";
            
    $sql="SELECT *
            FROM `regioni_province`
            ORDER BY `denominazione_regione` ASC;"
    ;
            
    $risultato = @mysql_query($sql,$connessione);
            if (!
    $risultato) {
                die (
    "errore: lettura del db non riuscita.");
            }

            
    $rows mysql_num_rows($risultato);
            
    $rows_counter 0;
            
    $regione_precedente "ABRUZZO";
        
    ?>
        <optgroup label="<?php echo $regione_precedente?>">    
        <?php    
            
    while ($rows_counter $rows)
            {
                
    $row mysql_fetch_row($risultato);
                
    $rows_counter++;
                
                
    $id $row[0];
                
    $regione $row[1];
                
    $provincia $row[2];
                
    $sigla_auto $row[3];

                if (
    $regione != $regione_precedente)
                {
        
    ?>
        </optgroup>
        <optgroup label="<?php echo $regione?>">
            <option value="<?php echo $sigla_auto?>"><?php echo $provincia." (".$sigla_auto.")"?></option>
        <?php
                    $regione_precedente 
    $regione;    
                }
                else
                {
        
    ?>
            <option value="<?php echo $sigla_auto?>"><?php echo $provincia." (".$sigla_auto.")"?></option>
        <?php
                
    }
            }
            
    mysql_close($connessione);
        
    ?>
    </select>
    adesso è senz'altro più leggibile di prima
    ma tu come hai strutturato la tabella? La mia è strutturata così
    codice:
    CREATE TABLE `regioni_province` (
      `id_provincia` tinyint(4) NOT NULL auto_increment,
      `denominazione_regione` varchar(30) NOT NULL,
      `denominazione_provincia` varchar(30) NOT NULL,
      `sigla_automobilistica` varchar(2) NOT NULL,
      PRIMARY KEY  (`id_provincia`)
    );
    Mi sai dire perché non va con il tuo esempio? Sennò non importa, avrei risolto, mi bastava ottimizzare un po' il codice

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    128
    allora se ti fa così è perchè evidentemente entra sempre nell'if, e quindi chiude e riapre l'optgroup. Al 99% sarà un banalissimo errore, tipo una variabile che non ti salvi/inizializzi correttamente (ad esempio all'inizio tu hai Abruzzo ma la prima regione si chiama ABRUZZO, quindi lui trova la differenza). La mia tabella era simile alla tua.

    Se posti il codice che ti dava quell'output, probabilmente troviamo la magagna

  8. #8
    Il codice era il tuo con l'unica aggiunta di un include "connessione.php" per aprire il db.
    Comunque ho trovato subito l'errore: mi è bastato sostituire

    $conf = $r["ripartizione_geografica"];

    con

    $conf = $r["denominazione_regione"];

    e ha funzionato alla grande

    ciao e grazie di nuovo!!

  9. #9
    Sicuro! hai ragione! avevo posto l'accento solo alla semplicità del codice. Effettivamente è un po' pesante.

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.