[PHP] Memorizzare scelte select in db e leggerle

VAik

Utente Attivo
16 Apr 2016
117
3
18
Ciao a tutti ragazzi
ho un ulteriore esercizio sempre sui campi form da riempire dall'utente, ma non so se sono riuscito nell'impresa

Ho realizzato nel db fornitomi da EasyPHP, una tabella "campi", con i campi colonna "id" (INT), "textarea", "checkbox", "radio", "sel" (tutti e quattro VARCHAR).

Ho creato una pagina con il form da completare, che richiama l'applicazione di inserimento nel db (memorizzo-select.php), e poi ho sviluppato un programma di lettura (leggere-select.php).

Riesco a memorizzare tutto alla perfezione, però non so se la lettura avviene in maniera corretta. cioè non escono errori , però è strana:

Molte righe della tabella "campi" , hanno memorizzato nel campo colonna "sel" un "-", proprio perchè per la memorizzazione degli altri form altri avevo impostato di inserire questo trattino.
Quando vado a leggere con questo codice

PHP:
<?php

require_once('configurazione_credenziali_esterno.php');
$link = mysqli_connect(DB_HOST, DB_USERN, DB_PSW) or die("Errore connessione: ". mysqli_connect_error());
$dbw = mysqli_select_db($link, DB_PROVA) or die("Errore apertura database: " . mysqli_error($link));

$strsql = "SELECT sel FROM campi";

$rs = mysqli_query($link, $strsql) or die("Errore query database: " . mysqli_error($link));
while ($riga = mysqli_fetch_array($rs)) {
    //echo $riga['sel'];   //sel nome del campo colonna
    $pv=$riga['sel'];
    echo $pv;

$province=array('BO'=>'Bologna','MI'=>'Milano');
//definisco array associativo

$option_pv='';


if(isset($pv)){
    foreach ($province as $chiave=>$valore){
      
        //$chiave conterrà MI, BO
        //$valore conterrà il campo Bologna,Milano
         
        if($pv==$chiave){
        $option_pv= $option_pv."<option value='$chiave'selected>$valore</option>"; 
        //equivalente a
        //$option_pv.= "<option value='$chiave'selected>$valore</option>";
     
            }
            if(($pv<>'-')or($pv<>'vuoto')){
         
                echo "non c'è nessuna selezione<br>";
 
                $option_pv.= "<option value='vuoto'></option>";
 
            }
         
                
 
        
        }//chiusura if
}//chiusura foreach
 


 


    ?>
            <form>
            Città: <select name = "pv" >
            <?php echo "vedi non vedo nulla $option_pv;"?>
            </select>
            </form>
         
         
            <?php
         




}//chiusura while

?>
noto che per i campi dove c'è il trattino memorizzato esce due volte questa frase "non c'è nessuna selezione" e un solo campo sel vuoto .
Invece per i campi dove è salvata la provincia Milano o Bologna compare cmq il messaggio "non c'è nessuna selezione" e sotto il form select con la città Milano e Bologna.

Perchè per i tutti i campi (sia che sia memorizzata la città sia che ci sia il trattino) esce 2 volte la scritta "non c'è nessuna selezione".

E poi il form messo al di fuori del codice php non si vede proprio
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
27
Ciao.

Vuoi memorizzare e leggere le scelte della select in maniera analoga a quanto discusso nel tuo precedente post, in cui facevi la stessa cosa con i radio?
 
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
18
Ciao Ade
no, la memorizzazione l'ho fatta e viene proprio bene eheheh......il problema è la lettura. che mi determina qualcosa di strano come ho scritto su.
Per capire: per quanto riguarda mostrare il menù a tendina con la scelta selezionata viene bene, però il problema è quando il db non ce l'ha la città selezionata.

se elimino
PHP:
echo "non c'è nessuna selezione";
non sembra che ci sia il problema, però c'è, in quando mi esce due volte questa scritta, per una sola riga
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
27
Ricapitolando, tu vuoi ottenere una select in cui, se in tabella vi è la sigla di una provincia, allora avrai la select con il nome della città associata. Invece, se in tabella è presente il trattino, allora vuoi che ti compaia la select con l'opzione 'Non c'è nessuna selezione'. Ho capito bene?

PHP:
<?php

$conn = mysqli_connect("127.0.0.1", "root", "", "test");

//definisco array associativo
$province=array('BO'=>'Bologna','MI'=>'Milano');

$option_pv='';
$strsql = "SELECT sel FROM campi";
$rs = mysqli_query($conn, $strsql) or die("Errore query database: " . mysqli_error($conn));

while ($riga = mysqli_fetch_array($rs)) {
    $pv=trim(strtoupper($riga['sel']));

    if(isset($pv)){
       if(array_key_exists($pv, $province)) {
            $option_pv .= "<option value='".$pv."'>".$province[$pv]."</option>\n";
       } elseif ($pv == '-') {
            $option_pv .= "<option value='vuoto'>Nessuna selezione</option>\n";
       }
    }
}

?>

  
<form>
    Città:
        <select name = "pv" >
            <?php echo $option_pv;?>
        </select>
</form>
Vedi se questo codice corrisponde alle tue esigenze.
 
Ultima modifica:
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
18
si hai centrato l'obiettivo, però non riesco a capire perchè esce quel che esce


mi spiego: ho creato un altro file con il tuo while.
Va bene, vedo nel menù a tendina la sola scelta che è stata memorizzata nell'array.

Non capisco però per il mio codice cosa c'è che non va, visto mi sembra molto simile al tuo.


Se vado a modificare il mio codice, eliminando echo "nessuna selezione" , e mettendo nel menù a tendina "nessuna selezione" cioè così come nel tuo codice

PHP:
$option_pv.= "<option value='vuoto'>nessuna selezione</option>";
per ogni riga della colonna, mi mette nel menù a tendina (che io vado ad aprire) 2 "nessuna selezione", mentre invece dovrebbe essercene solo una (come nel tuo codice).
PEr la riga in cui invece c'è la scelta, per esempio MI, nel menù a tendina esce la scritta Milano, quindi è visualizzata bene, ma se vai ad estendere la tendina ci sono sempre le due "nessuna selezione"
 
Ultima modifica:

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
27
if($pv==$chiave)
[...]
if((
$pv<>'-')or($pv<>'vuoto'))
Guarda, ad esempio, le tue due condizioni.
Tutti i record che escono dalla query, diversi dal trattino, le rispettano entrambe e questo crea un qualche tipo di conflitto.

Prendiamo "MI".

Codice:
"MI" == $chiave => true
"MI" <> "-" or "MI" <> 'vuoto' =  true OR true => true
Se prendiamo il trattino ("-")

Codice:
"-" == $chiave => false
"-" <> "-" or "-" <> 'vuoto' -> false OR true => true
E ogni volta che il confronto risulta TRUE, allora il programma entra nella condizione ed esegue le istruzioni.
A questo va ad aggiungersi il fatto che tu hai utilizzato
PHP:
if () {
}
if () {
}
Ciò significa che il programma andrà a controllare entrambe le condizioni e non si ferma alla prima condizione vera, ignorando l'altra. Questo lo avresti ottenuto scrivendo questo
PHP:
if () {
} elseif () {
}
In questo modo se la prima condizione risulta vera, la seconda viene skippata.

Nel tuo caso la seconda viene eseguita lo stesso e, dato che la seconda condizione risulta vera sia per la sigla della provincia sia per il trattino, l'istruzione ivi contenuta sarà eseguita sempre.
 
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
18
Sai cosa è successo???

me lo so spiegare, ora che me l'hai fatto notare: quando ci ragioni troppo su uno stesso codice e fai aggiunte, modifiche etc etc, corri il rischio di far rimanere qualcosa che non vorresti.

Ho il risolto il problema così:
modificando la condizione in questo modo
PHP:
if(($pv=='-')or($pv=='vuoto')){


EDIT
EDIT


Ho trovato in internet il tag select con tutte le diverse province di Italia, l'ho inserite nel mio programma di inserimento, ora però ho un problema nella memorizzazione sul db:
se si scegli per esempio la provincia di Cagliari (ma anche le altre province), si memorizza nella tabella
”CA” e non semplicemente CA.
Cosa posso fare per farla memorizzare bene?

apparentemente il form è pari pari a quello che io avevo scirtto
 
Ultima modifica: