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. -
Inserisci anche il codice del form così diamo un'occhiata a tutto
-
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.
-
Il problema è il name della select, devi metterci le quadre per dirgli che è un array di elementi, altrimenti invierà sempre solo un valore:
<select name="servizi_da_svolgere[]" multiple="multiple">
-
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 -
Buona sera,
@jabba ha detto in gestione select a scelta multipla:Dipende tutto da come hai salvato i servizi all'interno del database, è un json? Sono salvati come testo delimitato da virgole?
Le tabelle del database che entrano in gioco sono tre e sono state create direttamente dalla console mysq in un database che ho fatto per fare dei test.
Tabella lista_servizi qua ci sono i servizi quotidiani che si ripetono sempre uguali o quasi.
Tabella servizi ed è quella che effettivamente viene popolata attraverso il form.
Tabella users dumpata dal database del sito joomla a quello citato per tirarmi su nella select "autisti" i nomi degli users in quanto sono sempre loro ovviamente .... gli users del sito sono in realtà gli autisti che vanno nella loro pagina a consultare i servizi che devono svolgere.
Questo è il risultato del vardump di $_Post che atterra in insert-serv.php
array(7) { ["seleziona_autista"]=> string(13) "Filippo_Pieri" ["stato"]=> string(9) "operativo" ["data_servizio"]=> string(10) "2025-02-06" ["tipologia"]=> string(3) "tpl" ["macchina"]=> string(7) "iveco47" ["servizi_da_svolgere"]=> array(2) { [0]=> string(33) "start L 157--Roncalceci--06:40:00" [1]=> string(42) "start L 157--Forlì Centro Studi--13:20:00" } ["invia"]=> string(5) "INVIA" } inserimento servizio riuscito torna alla maschera di inserimento
la tabella seguente è la tabella popolata coi dati del form.
Come vedi nella colonna SERVIZI_DA_SVOLGERE viene inserito "array" ma dovrei ottenere i value degli array con indice numerico inviati dalla select "servizi_da_svolgere" e provenienti ad ogni invio del form.
Ti allego lo screenshot anche della tabella Lista_serviziOvviamente lo screenshot riprende solo un estratto della tabella che contiene molti più records, per mostrati che le option della select prendono i dati di tre colonne e li concatena perchè ogni servizio viene cosi identificato in maniera inequivocabile.
Per ora vorrei ottenere quindi che venissero scritti i value delle chiavi numeriche e nn solo "array", cosi per ogni autista ogni giorno seleziono tutti i servizi che deve fare e quindi faccio una sola compilazione e invio del form per ogni autista.
Con la speranza di averti fatto capire meglio qual'è lo scopo di questo lavoretto, e quindi con la speranza che tu possa aiutarmi in questo ti ringrazio davvero tanto in ogni caso e ti auguro una buona serata.
Filippo P -
Ok stiamo andando molto sul dettaglio, faccio oggettivamente fatica a starti dietro senza poter studiare il codice. Se viene inserito "array" forse c'è qualche problema nella query che fa l'insert. Dipende tutto da come prendi i dati dal $_post, come li elabori e poi come effettivamente li inserisci nel database. Tieni conto che non devi fare l'insert di "servizi_da_svolgere" perchè in questo caso si che inserisci un array, devi estrapolare i dati dell'array e inserirli uno a uno (o concatenarli in qualche modo) nella query di INSERT
-
Stai sottovalutando il problema sicurezza, quel codice esterno è facilmente hacherabile. Segui il primo usa codice nativo e convalida i campi. Meglio ancora se costruisi un componente custom con JCB. Vedo che hai padronanza di php e puoi farlo senza grossi problemi.