- Home
- Categorie
- Coding e Sistemistica
- PHP
- problema inserimento dati su db con form dinamico
-
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
-
Esattamente. Sparando un form in cui i name sono gli stessi verrà letto solo l'ultimo.
Usa l'id univoco e funzionerà.
-
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
-
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.
-
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!
-
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
-
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]
-
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
-
$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.
-
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...
-
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.
-
no, nulla...
continuo a indagare, se ti viene in mente qualcos'altro graziegrazie mille intanto
ciao!
-
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