gestione select a scelta multipla
-
Buona sera,
vorrei sapere come gestire i dati provenienti da un form dove uno dei campi è una select a scelta multipla,
se faccio il var dump di $post assodato che Post è impostato nel tag <form> come attributo "method";
delle opzioni selezionate mi trovo solo l'ultimo valore nell'array $Post trasmesso.... quindi lo script di invio al database mi scrive solo l'ultimo valore selezionato nella select, mentre avrei necessita che scrivesse tanti records per quanti sono le opzioni selezionate.....
Il punto è che con il campo a scelta multipla ci si risparmierebbe un sacco di compilazioni e di invii ma cosi nn serve a nulla.....
Come dovrei fare quindi per sfruttare questo form con il campo select a scelta multipla ?Grazie in anticipo a tutti.
Filippo P. -
Secondo me se trovi solo l'ultimo valore vuol dire che non hai impostato bene la select oppure non lo tiri su correttamente nella pagina target.
Il form sarà una cosa tipo questa:<form action="file.php" method="POST"> <select name="categorie[]" id="categorie" multiple> <option value="sport">Sport</option> <option value="musica">Musica</option> <option value="tecnologia">Tecnologia</option> <option value="arte">Arte</option> </select> <button type="submit">Invia</button> </form>
Dall'altra parte puoi usare la sintassi nativa di Joomla per recuperare i dati:
<?php use Joomla\CMS\Factory; $input = Factory::getApplication()->input; $categorie = $input->get('categorie', [], 'array'); if (!empty($categorie)) { echo "<h3>Hai selezionato:</h3>"; echo "<ul>"; foreach ($categorie as $categoria) { echo "<li>" . htmlspecialchars($categoria) . "</li>"; } echo "</ul>"; } else { echo "<p>Nessuna categoria selezionata.</p>"; } ?>
Quindi dentro
$input
ci metti tutto quello che viene passato tramite POST, poi prendi il contenuto di "categorie" e lo metti dentro un array:$categorie
A questo punto hai un array e puoi giocartelo come preferisci: inserisci dentro un campo via database, lo stampi ecc... -
Francamente non capisco....
var dump ($Post), non mi dovrebbe mostrare il contenuto dei dati in un array associativo con le chiavi e i valori trasmessi dal form al file impostato nella action del relativo tag?
Io ho provato a lasciare vuoto la action per ottenere nella stessa pagina il var dump ma scopro che della select, appare nell'array solo l'ultimo valore selezionato, per cui anche se uso la sintassi nativa di joomla... cosa che vorrei evitare tra l'altro, preferirei usare sempre php nativo e inserirlo nell'articolo col modale del plugin sourcerer..... ma in ogni caso $Post non contiene tutti i valori selezionati nella select... non capisco questa dinamica....
Volevo capire appunto come gestire e mappare i dati per ottenere la scrittura dei relativi records nella tabella del db, quindi in file.php devo mettere una query dopo aver mappato i campi del form con le colonne della tabella, cosa che ho già fatto ma se uno dei campi del form è una select a scelta multipla che struttura di array in teoria viene trasmessa con la variabile $Post?Mi puoi spiegare in qualche modo il meccanismo?
Ti chiedo troppo se ti chiedessi un esempio senza la sintassi nativa di joomla ?
Provo a mandarti il codice del file.php che riceve i dati dal form cosi come è fatto ora, cioè col form senza la select a scelta multipla, considera che il campo "seleziona servizi" dovrebbe diventare a scelta multipla per limitare la quantità delle compilazioni da effettuare per ogni soggetto (autista nel caso ma ovviamente è solo un esempio)<html lang="it"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>insert into database</title> </head> <body> <?php /*$conn = new mysqli("localhost","matteo","spranga","gbgarage_servizi"); //controllo di connessione. if ($conn->connect_error) { die ("connessione fallita: " . $conn->connect_error); }*/ try{ $conn = new mysqli("localhost","matteo","spranga","gbgarage_servizi"); }catch(Exception $e){ $error = $e -> getMessage(); echo $error; echo "<br><a href=\"http://localhost/test-gbgarage/gestione-servizi/form-serv.php\">torna alla maschera di inserimento</a>"; }?> <?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 */ $risultato = $conn->query($insert_sql); if ($risultato == TRUE) { echo "inserimento servizio riuscito"; } else { echo "inserimento servizio fallito: $insert_sql"; } $conn->close(); ?> <br> <a href="http://localhost/test-gbgarage/gestione-servizi/form-serv.php">torna alla maschera di inserimento</a> </body> </html>
Grazie mille in ogni caso,
Filippo P. -
ok presto fatto e.... grazie di nuovo
<!DOCTYPE html> <html lang="it"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>invia servizio</title> <link rel="stylesheet" href="../css/form.css"> </head> <body> <div class="form"> <!-- contenitore del form con relativa classe css da richiamare nel file css del template front cassiopeia --> <form action="insert-serv.php" method="post"> <table class="tab-form"> <tr> <td><label for="autista">Autista</label></td> <td> <?php //connessione al database try { $Conn = new mysqli("localhost","matteo","spranga","gbgarage_servizi"); } catch(Exception $e){ //controllo connessione al db. $error = $e ->getMessage(); echo $error; }; //impostazione della query al db con esclusione di 3 records $query_sql = "SELECT username FROM gbgar_users where id not in (188,192,193);"; //esecuzione della query e memorizzazione dei dati ottenuti nella var $lista_autisti $lista_autisti = $Conn->query($query_sql); //controllo sull'esecuzione della query if ($lista_autisti == FALSE){ die("Errore nell'esecuzione della query:" . $query_sql); } //apertura della select echo "<select name='seleziona_autista' required>"; //inserisco una option introduttiva che invita a selezionare un'opzione. echo "<option value=\"\">Seleziona l'autista</option>"; //ciclo per prendere i record uno alla volta con fetc_assoc while ($riga = $lista_autisti -> fetch_assoc()) { $autista = $riga["username"]; //otteniamo le option della select con il contenuto del campo username stando ancora dentro il ciclo while per prelevare tutte le option corrispondenti a tuttti gli autisti. echo "<option value='$autista'> $autista </option>"; } //chiusura select echo"</select>"; ?> </td> </tr> <tr> <td><label for="stato">Stato di Servizio</label></td> <td><select name="stato" id="" required> <option value="">Imposta stato di servizio</option> <option value="operativo">OPERATIVO</option> <option value="riposo">RIPOSO</option> <option value="ferie">FERIE</option> <option value="indisponibile">INDISPONIBILE</option> </select> </td> </tr> <tr> <td><label for="data_servizio">Data Servizio</label></td> <td><input type="date" name="data_servizio" id="" required></td> </tr> <tr> <td><label for="tipologia">Tipo servizio</label></td> <td><select name="tipologia" id=""> <!--placeholder--> <option value="">Scegli la Tipogia</option> <!--opzioni a disposizione--> <option value="tpl">TPL</option> <option value="noleggio">NOLEGGIO</option> <option value="misto">MISTO</option> <option value="officina">OFFICINA</option> </select> </td> </tr> <tr> <td><label for="macchina">Macchina</label></td> <td><input type="text" placeholder="inserisci la macchina da utilizzare" name="macchina" id=""></td> </tr> <tr> <td> <label for="servizi_da_svolgere">Servizi da <br> svolgere</label> </td> <td> <?php //analogamente a quanto fatto per la select "seleziona_autista" si applica lo stesso metodo per avere una select sui campi servizio,partenza, orario_corsa della tabella lista_servizi $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'>"; echo "<option value=\"\">Seleziona il servizio</option>"; while ($riga = $servizi_da_svolgere -> fetch_assoc()) { $servizio_inserito = $riga['servizio'].'--'.$riga['partenza'].'--'.$riga['orario_corsa']; echo "<option value='$servizio_inserito'> $servizio_inserito </option>"; } echo"</select>"; $Conn->close(); ?> </td> </tr> </table> <input class="invio" type="submit" name="invia" value="INVIA"></td> </form> </div> </body> </html>
Filippo P.
-
Un lampo!!
Ma ho spento il PC nn pensando che avresti risposto subito.
Domani provo il tuo suggerimento.
In pratica avrò un Array dalla select annidiato dentro l'array $Post del form.... Immagino....
Domani provo var Dump cosa mi tira fuori.
Buona notte e grazie . -
Gentilissimo Jabba,
Ok,
stamattina ho provato a correggere il codice aggiungendo le parentesi come suggerito e facendo vardump di $_Post ottengo infatti un array contenente i dati arrivati dal form e in particolare, nella chiave corrispondente alla select in questione, invece di un singolo valore mi arriva un array a sua volta, non associativo ma con chiavi numeriche [0] e [1]... se avessi fatto tre selezioni avrei avuto immagino anche la chiave [3] e cosi via....
Ora; andando a controllare il contenuto della tabella nel database, nella colonna associata alla chiave associativa ["servizi_da_svolgere"] non ottengo i valori contenuti dalle chiavi numeriche dell'array annidiato diciamo, ma solo la parola array.
Ovviamente la pagina insert-serv.php non sa quale valore mettere se non glielo si dice, e fin qui... diciamo... che comprendo.
Immagino occorra un ciclo?
Saresti cosi gentile da illuminarmi?
A dire il vero sto cercando da tempo qualcuno che mi potesse dare qualche lezioncina su queste cose....
ma facendo tutt'altro mestiere fatico a trovare compatibilità di orari....
In ogni caso, grazie mille per le tue risposte, per giunta spesso anche molto rapide.
Ora devo tornare ai "miei" autobus.
Buona giornata.
Filippo P. -
Aloura, per darti la risposta esatta dovrei mettermi lì a studiare il tuo codice
Dipende tutto da come hai salvato i servizi all'interno del database, è un json? Sono salvati come testo delimitato da virgole?
In generale tu dovresti ricever un array di servizi dove hai una cosa tipo:0->servizio1
1->servizio2
2->servizio3e così via, dove "servizio1", "servizio2", ecc... sono i "value" della select. Se hai creato bene la tua select i value dovrebbero essere i valori esatti che devono essere inseriti nel database.
A questo punto nella pagina di atterraggio (che direi si chiama insert-serv.php) devi prendere quell'array, girartelo, crearti la tua stringa da inserire (tipo li concateni in questo modo "servizio1,servizio2,servizio3") poi fai la query e gli dici: inserisci una nuova riga con ID utente (dico, per esempio) e la stringa "servizio1,servizio2,servizio3" nella colonna servizi.Spero di essere stato chiaro, ma non avendo idea di come è costruito il database si fa un po' fatica.
Ciao