• User Attivo

    problema inserimento dati su db con form dinamico

    Buongiorno a tutti,

    ho un form con dei campi creati dinamicamente:

    [PHP]
    <?php include '../config.php'; ?>
    <?php
    $sql = "SELECT * FROM piatti";
    $ret = mysqli_query( $db, $sql );
    ?>
    <form method="post" action="insert.php">
    <?php while ($row = mysqli_fetch_assoc($ret)){ ?>
    <label>
    <?php echo $row['nome'] ?>
    </label>
    <br />
    quantita':
    <input name="piatto" value="<?php echo $row['nome'] ?>" type="hidden">
    <input name="quantita" type="text">
    <br />
    <br />
    <?php } ?>
    <label>Tavolo</label>
    <br />
    <input name="tavolo" type="text">
    <br />
    <br />
    <input name="submit" type="submit" value="invia">
    </form>
    [/PHP]

    i campi dinamici vengono richiamati da una tabella sul db:

    [PHP]
    id nome prezzo
    3 Spaghetti col Pomodoro 6
    4 Spaghetti col Ragù 6.5
    5 Minestrone di verdure 6
    6 Pepata di cozze con crostini di pane croccante 8.5
    7 Porchetta trevisana D.O.P. con radicchio al forno 7.5
    [/PHP]

    il file che richiama è questo:

    [PHP]
    <?php include '../config.php'; ?>
    <?php
    $piatto = $_POST['piatto'];
    $quantita = $_POST['quantita'];
    $tavolo = $_POST['tavolo'];
    $sql = "INSERT INTO ordinazioni (piatto,quantita,tavolo) VALUES ('$piatto','$quantita','$tavolo')";
    $ret = mysqli_query( $db, $sql );
    header("location:form.php");
    ?>
    [/PHP]

    di fatto nel db mi inserisce solo l'ultimo piatto, perchè l'input piatto si chiama così per tutti,
    probabilmente dovrei chiamarli in modo diverso usando l'id univoco del piatto?

    è corretto?

    spero di essermi spiegato bene
    grazie mille in anticipo per le risposte


  • Moderatore

    Esattamente. Sparando un form in cui i name sono gli stessi verrà letto solo l'ultimo.
    Usa l'id univoco e funzionerà.


  • User Attivo

    Grazie per aver risposto Shad,

    per il form ho risolto semplicemente:

    [PHP]
    <?php include '../config.php'; ?>
    <?php $sql = "SELECT * FROM piatti"; $ret = mysqli_query( $db, $sql );?>
    <form method="post" action="insert.php">
    <?php while ($row = mysqli_fetch_assoc($ret)){ ?>
    <label><?php echo $row['nome'] ?></label>
    <br />
    quantita':
    <input name="piatto<?php echo $row['id'] ?>" value="<?php echo $row['nome'] ?>" type="hidden">
    <input name="quantita<?php echo $row['id'] ?>" type="text"><br /><br />
    <?php } ?>
    <label>Tavolo</label><br />
    <input name="tavolo" type="text">
    <br />
    <br />
    <input name="submit" type="submit" value="invia">
    </form>[/PHP]

    ma per eseguire la query d'inserimento come faccio?
    penso che dovrei ciclare in qualche modo i dati,
    pensavo con un ciclo for ma non riesco a capire come farlo smettere di ciclare il for.

    Spero di essere stato chiaro.

    grazie mille ancora
    buona giornata a tutti


  • Moderatore

    Per l'inserimento innanzitutto non puoi dare per scontato che gli id siano consecutivi. Escludi quindi il ciclo for.
    Hai bisogno di fare una prima query per recuperare gli id dei prodotti e poi ciclarli con un while che controlla se esiste il parametro con il relativo id, ed in quel caso fare l'insert.

    Non so se sono stato chiaro. Se hai bisogno provo ad esprimermi meglio.


  • User Attivo

    grazie shad,

    scusa ma sono un principiante, non ho capito bene come fare, o meglio non capisco come mettere giù il codice, il ciclo sul file che richiama il form perlomeno;

    non dico tutto perchè altrimenti non imparo, ma puoi scrivermi un codice di massima o un inizio per favore?

    scusa se disturbo è che ci sto provando da un po' ma non capisco

    grazie mille
    ciao!


  • User Attivo

    per dire, ho scritto questo codice ma non va:

    form.php
    [PHP]
    <?php include '../config.php'; ?>
    <?php $sql = "SELECT * FROM piatti"; $ret = mysqli_query( $db, $sql );?>
    <form method="post" action="insert.php">
    <?php while ($row = mysqli_fetch_assoc($ret)){ ?> <label><?php echo $row['nome'] ?></label><br />quantita':
    <input name="piatto<?php echo $row['id'] ?>" value="<?php echo $row['nome'] ?>" type="hidden"> <input name="quantita<?php echo $row['id'] ?>" type="text"><br /><br />
    <?php } ?> <label>Tavolo</label><br />
    <input name="tavolo" type="text">
    <br /><br />
    <input name="submit" type="submit" value="invia">
    </form>
    [/PHP]

    insert.php
    [PHP]
    <?php include '../config.php'; ?>
    <?php $sql = "SELECT * FROM piatti"; $ret = mysqli_query( $db, $sql );?>
    <?php while ($row = mysqli_fetch_assoc($ret)){ $piatto.$row['id'] = $_POST['piatto'].$row['id']; $quantita.$row['id'] = $_POST['quantita'].$row['id']; } $tavolo = $_POST['tavolo']; $sql = "INSERT INTO ordinazioni (piatto,quantita,tavolo) VALUES ("$piatto.$row['id']","$quantita.$row['id']","$tavolo")"; $ret = mysqli_query( $db, $sql ); //header("location:form.php");?>[/PHP]

    da quest'errore:
    **Parse error: syntax error, unexpected '$piatto' (T_VARIABLE) in C:\xampp\htdocs\TEST\pit\ordinazioni\insert.php on line 13

    **:x


  • Moderatore

    Innanzitutto qual'è la riga 13? Puoi riportarmela?

    Al momento non ho modo di prepararti uno scriptino ma grosso modo la prassi del file di insert dovrebbe essere la seguente:

    [PHP]
    $risultatoSelect = ..."SELECT * FROM piatti";

    while($risultatoSelect fetch in $rigaSelect)
    {
    if(isset($_POST[$rigaSelect['id']))
    {
    // Eseguo l'insert (INSERT INTO ECC.)
    }
    }
    [/PHP]


  • User Attivo

    la riga 13 è quella che fa l'inserimento:
    [PHP]
    $sql = "INSERT INTO ordinazioni (piatto,quantita,tavolo) VALUES ("$piatto.$row['id']","$quantita.$row['id']","$tavolo")";
    [/PHP]

    non ho ben capito quello che mi hai postato, cmq ci provo ancora e ti faccio sapere.

    grazie 1000 intanto


  • Moderatore

    $sql = "INSERT INTO ordinazioni (piatto,quantita,tavolo) VALUES ("$piatto.$row['id']","$quantita.$row['id']","$tavolo")";

    diventa

    $sql = "INSERT INTO ordinazioni (piatto,quantita,tavolo) VALUES (" . $piatto.$row['id'] . "," . $quantita.$row['id'] . "," . $tavolo . ")";

    Nel caso avessi campi di tipo stringa (ma questi mi sembrano interi) devi anche mettere i singoli apici intorno ai valori.


  • User Attivo

    ho inserito alla riga 13:
    [PHP]$sql = "INSERT INTO ordinazioni (piatto,quantita,tavolo) VALUES (' . $piatto.$row['id'] . ',' . $quantita.$row['id'] . ',' . $tavolo . ')";[/PHP]

    e da quest'errore:
    **Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\xampp\htdocs\TEST\pit\ordinazioni\insert.php on line 13

    **e non inserisc nulla nel db, ho provato anche con i doppi apici ma nulla...

    :arrabbiato:


  • Moderatore

    Prova così:

    $sql = "INSERT INTO ordinazioni (piatto,quantita,tavolo) VALUES ('" . $piatto.$row['id'] . "','" . $quantita.$row['id'] . "','" . $tavolo . "')";

    Altrimenti il problema è sui nomi di variabile costruiti al volo. Non so bene cosa devi fare quindi ho qualche difficoltà a consigliarti ma probabilmente qualcosa come il doppio dollaro $$ in questo caso è utile.


  • User Attivo

    no, nulla...
    continuo a indagare, se ti viene in mente qualcos'altro grazie 😄

    grazie mille intanto
    ciao!


  • User

    Ciao ! 🙂
    Non so se hai risolto ma io farei così:

    Visualizzazione piatti

    [PHP]
    <?php
    include '../config.php';

    $sql = "SELECT * FROM piatti";
    $ret = mysqli_query( $db, $sql );

    $html_form_piatti = '';
    $html_hidd_id_piatti = '';

    while ($row = mysqli_fetch_assoc($ret))
    {
    $html_hidd_id_piatti .= ( $html_hidd_id_piatti == '' ) ? $row['id'] : ',' . $row['id'];
    $html_form_piatti .= "\r\n <label>{$row['nome']}</label><br />quantita': <input type='text' name='form_qt_{$row['id']}' value='0' /><br /><br /> \r\n";
    }

    ?>

    <form method="post" action="insert.php">
    <input type="hidden" name="form_piatti_id_list" value="<?php echo $html_hidd_id_piatti; ?>" />
    <?php echo $html_form_piatti; ?>
    <label>Tavolo</label><br />
    <input name="form_tavolo" type="text"><br /><br />
    <input name="submit" type="submit" value="invia">
    </form>

    [/PHP]

    questo ti crea un html tipo questo (ovviamente da sistemare graficamente) (nel mio caso avevo due soli piatti di test ^_^)
    [HTML]
    <form method="post" action="insert.php">
    <input type="hidden" name="form_piatti_id_list" value="1,2" />

    <label>pasta ragu</label><br />quantita': <input type='text' name='form_qt_1' value='0' /><br /><br />

    <label>riso ragu</label><br />quantita': <input type='text' name='form_qt_2' value='0' /><br /><br />
    <label>Tavolo</label><br />
    <input name="form_tavolo" type="text"><br /><br />
    <input name="submit" type="submit" value="invia">
    </form>
    [/HTML]

    dove hai in pratica una variabile che contiene la lista di "id piatti" di nome "form_piatti_id_list" e le variabili con le quantita per piatto che hanno nome tipo "form_qt_1" dove quel "1" è l'ID del piatto.
    Lato salvataggio

    [PHP]
    <?php
    include '../config.php';

    if( isset($_POST['form_piatti_id_list']) )
    {
        $array_piatti = explode( ',' , $_POST['form_piatti_id_list'] );
    
        $tavolo = (int)$_POST['form_tavolo'];
    
        foreach( $array_piatti as $id_piatto )
        {
            // echo $id_piatto . ' - ';
    
            if( isset($_POST['form_qt_' . $id_piatto]) and (int)$_POST['form_qt_' . $id_piatto] > 0 )
            {
                $quantita = $_POST['form_qt_' . $id_piatto];
    
                $sql = "INSERT INTO ordinazioni (piatto,quantita,tavolo) VALUES ('$id_piatto','$quantita','$tavolo')";
                //echo $sql;
                $ret = mysqli_query( $db, $sql );
            }
    
        }
    }
    

    ?>
    [/PHP]

    praticamente ho prima verificato che ci fosse qualcosa in $_POST (per evitare che la pagina venga chiamata erroneamente senza dati dando errore). Poi prendo e creo un array dei piatti che erano presenti nella pagina precedente (quella con il form). lo faccio usando quella variabile "form_piatti_id_list". Ora che so che piatti erano presenti nella pagina prima, posso controllare se, per ogni piatto, la sua quantita' era stata settata ad un valore maggiore di 0 . SE è cosi', allora quel piatto è stato scelto dal cliente e quindi devo salvare il relativo record tramite la INSERT.

    Lo script puo' essere migliorabile in vari modi ovviamente pero' spero possa essere utile come idea di base 🙂