• User Newbie

    PHP e form di invio dati

    Buongiorno, avrei un paio di problemini e ho bisogno di un vostro consiglio tecnico.
    Ho un form formato da 3 campi che si ripetono per 10 volte dove quotidianamente vengono inseriti dati che vanno a popolare un db. Esempio: nome - turno1 - turno2. Non è però detto che tutti i 10 campi vengano sempre compilati.
    Come conviene approntare la tabella che andrà a ricevere questi dati, premesso che l'unico dato comune è la data? una tabella con 31 campi mi sembra eccessivo ma sarebbe forse più semplice, mentre una con 4 non saprei come farci arrivare (e in questo caso nemmeno partire dal form) tutti e 30 i dati correttamente creando quindi 10 (o meno eventualmente) distinti record.
    Come mi consigliate di approntare la relativa query di INSERT sulla pagina di input che riceve i dati (con $_POST) nel caso fosse plausibile la tabella con soli 4 campi?
    Fatto questo dovrei visualizzare su una tabella riepilogativa (in php) i dati inseriti visualizzando solo i record presenti e analogamente creare un pdf con fpdf. Forse potrei creare un'infinità di IF ma sono sicuro esiste una soluzione più rapida.
    Spero di essere stato chiaro nell'esporre il problema e se ho scritto castronerie siate clementi. Chiedo solo di evitare commenti del tipo "mancano le basi" o cose così, lo so già. Ne ho bisogno per un piccolo lavoro mio ma non posso permettermi un tecnico.

    Ringrazio anticipatamente.


    D 1 Risposta
  • User

    @paolopatty
    ciao io costruirei una tabella di 4 campi
    giorno - nome - turno1 - turno 2

    a meno che il campo nome non indichi sempre una persona divera, usa una tabella anagrafica dove inserisci i nomi ed eventuali altre info e in questa tabella metti la chiave esterna al posto del campo nome.

    questa soluzione è flessibile in quanto ti permette di gestire un numero dinamico di record per giorno
    ma soprattutto ti permette di interrogarla in modo semplice ad esempio su query raggruppate per la colonna giorno es, per sapere le ore medie lavorate, o il totale delle ore.... ed è più compatta di una con 30 colonna in cui molte potrebbero essere vuote


    P 1 Risposta
  • User Newbie

    @daniele1974
    Si, direi che è la soluzione migliore. Premesso ciò come imposto il form partendo quindi dal presupposto che devo far passare i dati come array? E la pagina di input da esso richiamata?

    Avevo pensato a qualcosa del genere, premesso che ogni campo si ripete 10 volte:
    <input type="hidden" name="ufficio" id="ufficio" value="ufficio1">
    <input type="textarea" name="nome[]">
    <input type="checkbox" name="pranzo[]" value="SI">
    <input type="checkbox" name="cena[]" value="SI">

    mentre per la pagina di input una bozza che avevo in mente è qualcosa di simile:

    $ufficio=$_POST['ufficio'];
    $b = strtotime("+1 Days");
    $domani = date("Y-d-m", $b);
    $nome = array($_POST['nome']);
    $pranzo = array($_POST['pranzo']);
    $cena = array($_POST['cena']);

    for ($a, $a<count($_POST['nome'], $a++ ) {
    mysqli_query("INSERT INTO mensa (calendario, ufficio, nominativo, pranzo, cena) VALUES ('$domani', '$ufficio', '$nome', '$pranzo','$cena')")
    }

    ma qualcosa non funziona.


    romeoausoni 1 Risposta
  • User

    @paolopatty Ciao Paolo,

    Ci sono diversi errori in realtà andiamo per step.

    Immagino che l’input hidden ufficio è presente solo una volta e non lo ripeti n volte anche perché non ha senso.

    Per quanto riguarda il resto invece, se non ricordo male, non va bene l’utilizzo del checkbox perché se non viene selezionato non passa proprio nessun valore di conseguenza se compili il form in questo modo:

    Romeo Pranzo (Non selezionato) Cena Si
    Mario Pranzo Si Cena Si

    Ti vengono fuori 3 array così:
    Nomi
    0 Romeo
    1 Mario

    Pranzo
    0 Si

    Cena
    0 Si
    1 Si

    Ma te il pranzo lo hai selezionato per Mario non per Romeo. Valuta se usare una select oppure radio button dove una delle due opzioni deve essere necessariamente selezionata.

    In merito al codice PHP, invece:

    1. puoi evitare array() sulle variabili
    2. il for è sbagliato, la sintassi corretta è questa: for($a=0;$a<count($nomi);$a++) {} // ho usato $nome invece di $_POST perché più corretto, gli errori erano 1. non inizializzavi il contatore e 2. mancava una parentesi per chiudere il count.

    Se fai queste correzioni dovrebbe funzionare tutto correttamente.

    Spero di esserti stato utile
    Saluti
    Romeo


  • Moderatore

    @romeoausoni ha detto in PHP e form di invio dati:

    for($a=0;$a<count($nomi);$a++) {}

    non entro nel merito della problematica, ma vi segnalo qualcosa come aggiunte e/o correzioni per migliorare lo stile di programmazione:

    1. le variabili vanno sempre verificate (vuote? valori che ti aspetti? etc)
    2. il count va sempre fatto fuori dal for, per evitare di farlo eseguire ad ogni giro alla macchina
    3. è più consono fare ++a ( terzo parametro ciclo for ) rispetto ad a++, questo perchè non usi il valore di a, e quindi una assegnazione implicita non ti occorre e la macchina alloca meno spazio in memoria.
    4. stai eseguendo una query di insert, a parte che una transazione sarebbe "d'obbligo" ma se non la si vuole fare, almeno eseguire una unica query piuttosto che X dipendente dal for, quindi magari allocare un'array co n la stringa dei valori e poi imploderla prima dell'esecuzione della query.
    5. è consigliabile sempre, escapare le stringhe che stai inserendo nel database per evitare injection.

    In bocca al lupo, e magari ri-postaci il tuo codice, migliorato e funzionante. 🙂