Gestione select con scelta multipla

di il
5 risposte

Gestione select con scelta multipla

Ciao a tutti.

ho  realizzato un form in un file form.php. 
Questo perché uno degli elementi del form è una select in cui le option con scelta multipla  sono determinate da una query che preleva i dati da una  tabella del database mysql.

Questo l'estratto del codice ....

...
<tr>
            <td>
               <label for="servizi_da_svolgere">Servizi da <br> svolgere</label>
            </td>
            <td>
                 <?php
                 //eseguo query al database per avere la lista delle option della select prese dalla tabella del database
                 $query_sql = "SELECT servizio,partenza,orario_corsa FROM gbgar_lista_servizi;";

                 $servizi_da_svolgere = $Conn->query($query_sql);

                 if ($servizi_da_svolgere == FALSE){
                  die("Errore nell'esecuzione della query:" . $query_sql);
                  }
                  echo "<select name='servizi_da_svolgere' multiple='multiple' required>"; //scelta multipla abilitata
                  echo "<option value=\"\">Seleziona il servizio</option>";

                  while ($riga = $servizi_da_svolgere -> fetch_assoc()) {
                     $servizio_inserito = $riga['servizio'].'--'.$riga['partenza'].'--'.$riga['orario_corsa']; 
                     //valori concatenati perché ogni servizio è caratterizzato da tre valori che nella tabella "servizi_assegnati"
                     devono essere scritti nello stesso record e nello stesso campo											
                      
                  echo "<option value='$servizio_inserito'> $servizio_inserito </option>";
                  }
                  echo"</select>";
                  
                  $Conn->close();
                ?>
              </td>
</tr>
...                

Il punto è che questa select, all'interno dello script intero viene dopo la select in cui viene selezionato l' username (autista).

L'idea è che a ogni autista nella giornata  vengono assegnati vari servizi da svolgere.

La domanda quindi è : volendo sfruttare il fatto che la select mi da modo di compiere scelte multiple tra le option che comprende, in teoria posso assegnare per ogni opzione effettuata nel campo "autista",  varie opzioni contemporaneamente  nel campo servizi da svolgere 

Come posso fare che quindi affinché il file "inserimento_servizi.php"  scriva nel database tutti i record? 

Mi aspettavo che scegliendo due option ad esempio, di trovarmi due record con gli stessi valori tranne che nella colonna "servizi_assegnati" in cui avrei trovato nel primo record la prima option e nel secondo record la seconda option mentre mi trovo solo il record con la seconda option. :-\

Questo è il codice del file "inserimento_servizi.php" con le associazioni dei campi tra form e tabella del db e la query INSERT INTO.....

<?php
        //creazione variabili che ricevono i dati dai campi del form.
        $autista = $_POST["seleziona_autista"];
        $stato = $_POST["stato"];
        $data_servizio = $_POST["data_servizio"];
        $tipologia = $_POST["tipologia"];
        $macchina = $_POST["macchina"];
        $servizi_da_svolgere = $_POST["servizi_da_svolgere"];
    
        //inizializzo e riempio la variabile con la query al database.
        $insert_sql = "INSERT INTO gbgar_servizi (
                    autista,
                    stato,
                    data_servizio,
                    tipologia,
                    macchina,
                    servizi_da_svolgere)
                    VALUES(
                    '$autista',
                    '$stato',
                    '$data_servizio',
                    '$tipologia',
                    '$macchina',
                    '$servizi_da_svolgere');"; 
        
        /*ora si esegue la query contenuta nella viriabile chiamata $insert_sql per ottenere il risultato di scrittura del record e un output nella pagina page.php */
        
        $risultato = $conn->query($insert_sql);
        if ($risultato == TRUE) {
            echo "inserimento servizio riuscito";
        } else {
            echo "inserimento servizio fallito: $insert_sql";
        }
        
    ?>
    <br>
    <a href="http://localhost/test-gbgarage/gestione-servizi/form-serv.php">torna alla maschera di inserimento</a>
</body>
</html>

Penso da profano autididatta che la variabile $insert_sql viene riversata in $risultato e sostanzialmente è un array associativo, ma in esso la chiave ["servizi_da_svolgere"] quindi, porta solo il secondo valore selezionato nella select come se il secondo sovrascrivesse il primo....... è così ?  

quindi .... come devo fare per ottenere la scrittura dei due valori selezionati contemporanemente nella select, in modo che chi deve compilare il form per assegnare i servizi  non deve compilare il form tre o quattro volte per ogni autista, compiendo invece almeno una sola compilazione per ognuno....?

con la speranza di esser riuscito a farmi capire ringrazio tutti per le eventuali illuminazioni .

Grazie e buona Epifania !!!!

5 Risposte

  • Re: Gestione select con scelta multipla

    Non è chiaro cosa vuoi fare 

    Da quello che ho colto, vuoi scorrere un elenco di soggetti e inserire dei compiti da svolgere?

    Se si, una selezione degli operatori e in base al selezionato fai inserisci>nuovo compito

    L'operatore sarà quello che hai selezionato, la data sarà quella che hai impostato.

    Al ritorno sulla pagina di scelta dell'operatore avrai quelli che a quella data non hanno compiti ancora assegnati, ergo la selezione la fai legando la tabella operatori con la tabella compiti where data xy and idoperatore is null cioè tutti gli operatori non ancora assegnati.

    Se un compito lo svolge una squadra fai una multiselect ma in questo caso devi legare tre tabelle (una per la molti a molti) la logica è la stessa.

  • Re: Gestione select con scelta multipla

    Ciao e grazie per la risposta.

    Provo a spiegarmi meglio... 

    il form è impostato con i campi

    -Operatore:  select in cui le option son prelevate dalla tabella users (coloro che hanno un account di accesso al sito)
    -Stato di Servizio:  select in cui le otions sono 4 (operativo, riposo, ferie, malattia, altra indisposizione)
    -Data servizio: campo DATE
    -tipo di servizio: select con 4 voci (tpl, noleggio, misto , officina)
    -macchina: campo aperto (poi in futuro anche qua metterò una select che prelevera le option dalla tabella macchine che devo ancora impostare)
    -servizi da svolgere: select (option prelevate dalla tabella lista_servizi).

    Ho pensato che per ogni compilazione viene scelto un operatore e una data,  a cui vengono assegnati 3 servizi  da svolgere, cliccati dalle option della select "servizi da svolgere" che ha infatti l'attributo multiple='multiple'.

    Poi però l'array che viene inviato alla pagina.php che esegue la query INSERT INTO tabella etc... scrive il record ma nella colonna servizi da svolgere inserisce solo l'ultima selezione delle tre effettuate tre le options della select .

    Ovviamente immaginerai che ho bisogno che vengano scritti tutti e tre .... 

    Come devo modificare pagina.php per ottenere la scrittura di tutte e tre le options selezionate riguardo i servizi da svolgere? 

    Da ciò che mi scrivi sembra che io debba avere due form in cui uno seleziono solo l'operatore, e poi da li vengo mandato al secondo form dove inserisco gli altri dati?

    Ti chiedo scusa ma non è che mi puoi spiegare meglio i passaggi che mi hai proposto? 

    E' molto interessante anche la possibilità di avere nel contempo le voci selezionate che non possono essere riselezionate per lo stesso giorno..... cosi ho già una sorta di controllo per evitare assgnazioni ripetute erroneamente.... ma bisogna che faccio un passettino alla volta visto che non sono un informatico professionista.

    Grazie ancora e in anticipo per avermi letto.

    Filippo P.

  • Re: Gestione select con scelta multipla

    07/01/2025 - Pierpippo73 ha scritto:

    -Operatore:  select in cui le option son prelevate dalla tabella users (coloro che hanno un account di accesso al sito)
    -Stato di Servizio:  select in cui le otions sono 4 (operativo, riposo, ferie, malattia, altra indisposizione)

    select * from operatore
    inner join statodiservizio on operatore.idoperatore=statodiservizio.idoperatore
    where 
    operatore.accessosito=true
    and (statodiservizio.stato='operativo' and statodiservizio.data='AAAA-MM-GG')

    manca la tabella servizi/operatori e l'idoperatore collegata.

    07/01/2025 - Pierpippo73 ha scritto:

    -tipo di servizio: select con 4 voci (tpl, noleggio, misto , officina)

    -servizi da svolgere: select (option prelevate dalla tabella lista_servizi).

    tra queste che differenza c'e'? che dati memorizzano?

    a spanne le tabelle dovrebbero essere:

    operatori {idoperatore; nominativo; ...; accessoweb[si/no]}
    assenze{idoperatoreassente; DataAssenza; idOperatore; ...; Descrizione}
    servizi{idservizio; dataservizio; tiposervizio(link 1 a m tipiservizi); macchinari(link m a m macchine); operatori(link m a m operatori); ecc...}
    tipiservizi{idtiposervizio; descrizionetiposervizio;}
    MacchineServizi{idservizioM_S; idMacchinaM_S}  //m a m macchine/servizi
    macchine{idMacchina; descrizione; ecc..}
    OperatoriServizi{IdServizioS_O; idOperatoreS_O;}   // m a m operatori/servizi

    questa

    07/01/2025 - Pierpippo73 ha scritto:

    -Data servizio: campo DATE

    penso non abbia alcun senso a meno che non vi siano altri campi.  Tuttavia, per non caricare 365 record per ogni operatore, dove la maggioranza sarebbe un record con scritto "disponibile" ti suggerisco di inserire le indisponibilità come da tabella "assenze" che ho scritto, dove metti l'assenza e il motivo (ferie, permesso, ecc...) ovviamente se per quella data quell'operatore non c'e' (se nella where metti assenze.idoperatoreassente=operatori.idoperatore and assenze.DataAssenza='gg-mm-aaaa') non lo vedi in elenco.

    non conoscendo la materia che stai informatizzando non posso fare altre supposizioni e quelle fatte potrebbero anche essere errate.

    in soldoni, se hai un turno di presenze o disponibilità del personale, un foglio di marcia del lavoro da svolgere, anche cartaceo, e' un buon punto di partenza per capire quali sono i dati da inserire e come normalizzare il database.

  • Re: Gestione select con scelta multipla

    Scusa, in tutto questo mi sono perso la domanda cardine: posso vedere la insert e l'array?

  • Re: Gestione select con scelta multipla

    Ciao.

    Ora sono in servizio e sto approfittando di una pausa per risponderti brevemente.  Appena riesco ti mando il vardump di $POST e la query.

    Al momento le tabelle Mysql sono tre 

    Users

    Lista_servizi 

    Servizi_assegnati

    Da users prendo gli autisti (colonna username); 

    Da lista_servizi prendo i servizi da tre colonne(linea capolinea e orario_corsa) e concatenando i dati nel ciclo while ottengo che vengono messi nella tabella servizi_assegnati colonna servizi_da_svolgere.

    Questa terza  tabella deve ricevere i dati ed essere popolata quindi nelle colonne autista, stato servizio, data, macchina, servizi_da_svolgere debitamente associate ai relativi campi del form.

    Appena riesco, forse in serata, o domani pomeriggio, ti posso mandare l'array che il form invia così come è fatto ora, il codice del form  e volendo pure gli screenshot delle tabelle. (O preferisci il file.sql del database che uso per i test?)

    La tabella users viene compilata da Joomla con la registrazione al sito degli addetti ai lavori effettuata dall'amministratore del sito. Tale tabella l'ho dumpata in un database diverso per fare dei test.

    La tabella lista_servizi l'ho creata e popolata parzialmente, a mano, tramite console Mysql. (la lista sarebbe più lunga ma per ora mi serve sempre per fare test). A lavoro ultimato questa tabella una volta fatta avrebbe poche variazioni nel tempo ed è gestibilissima direttamente da console appunto. 

    La tabella servizi assegnati invece deve venire popola attraverso il form.

    Chiaro che se per un autista viene selezionato riposo nel campo stato di servizio, per quella  stessa data il campo servizi assegnati resterà vuota. Magari aggiungo il campo note dove mettere la data prevista di rientro in caso di ferie malattia.

    Nn volevo dover fare una tabella a parte per lo stato di servizio... Pensavo che tabella servizi assegnati possa contenere tutto.... In fondo son solo 5 campi... 

    Solo che se la select  "servizi assegnati"  nel form è a scelta multipla ... Come sfrutto questa cosa per limitare il numero di compilazioni giornaliere?

    Ora la mia pausa è finita ... Grazie ancora.

    Filippo P.

Devi accedere o registrarti per scrivere nel forum
5 risposte