[MySQL] Inserimento multiplo da form multirighe

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
Buongiorno,
sto ristrutturando il db delle ricette della mia scuola di cucina.
Nella pagina di inserimento degli ingredienti (che naturalmente non posso sapere prima quanti sono) ho preparato un form con 25 righe fatte così:
HTML:
<tr>
    <td><input name="ingrediente1" type="text" size="50" /></td>
    <td><input name="quantita1" type="text" size="4" /></td>
    <td><select name="misura1" />
        <option value="" selected="selected">===</option>
        <option value="Kg.">Kg</option>
        <option value="Gr.">Gr.</option>
        <option value="Lt.">lt</option>
        <option value="ml">ml</option>
        <option value="N.">N.</option>
        <option value="Bicchiere/i">Bicchiere/i</option>
        <option value="QB">QB</option>
      </select>
    </td>
  </tr>
naturalmente gli indici numerici sono in sequenza (ingrediente1, ingrediente2 ecc...)

Mi viene il dubbio che non sia il modo più intelligente di procedere.
Anche perchè ora mi trovo davanti il problema dell'inserimento nel db, al di là di testare se i diversi campi siano vuoti o meno:
devo ripetere x volte (massimo 25) l'inserimento?
O magari è meglio trattare le variabili come array, cioè (credo) anzichè ingredienti1, 2, 3... fare un array ingredienti[], uno quantita[] e uno misura[], poi esploderli e con un ciclo inserire i dati nelle rispettive colonne?
Scusate, ma è veramente troppo tempo che non programmo più, a parte le cene dei clienti... :)
Grazie per l'aiuto
 

otto9due

Utente Attivo
22 Feb 2014
529
21
28
Seguo, è una cosa che mi chiedo anche io da tempo, ad esempio nel caso in cui si hanno dei campi dinamici, tipo "aggiungi campo" in quel caso come si procede?
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
Allora,
sto facendo in questo modo (ma naturalmente non funziona ancora):
invece di un unico form ho fatto una pagina con un form per riga, quando ho inserito i quattro dati che mi servono premo il tasto di submit che richiama una funzione ajax che provvede a mandare i dati a una pagina php per l'inserimento e alla fine con success inserisco un ok nella riga.
Funziona perfettamente sulla prima riga, mentre dalla seconda riga inserisce solo il primo dei 4 dati che mi servono...
la pagina dell'inserimento (solo le prime due righe di inserimento):
HTML:
<table width="800px" border="1" cellspacing="0" cellpadding="0" bgcolor="#CCCCCC">
  <tr>
    <td colspan="4"><p align="center"><b><? echo $codicericetta; ?></b><br><? echo $titolo; ?></p><hr></td>
  </tr>

  <tr>
    <td colspan="4"><b>Ingredienti:</b><br></td>
  </tr>

  <tr>
    <td>Ingrediente</td>
    <td>Quantità</td>
    <td>Un.Mis.</td>
    <td></td>
  </tr>

  <tr>
    <form id="tabella" name="tabella" method="post" action="">
    <td><input name="ingrediente1" id="ingrediente1" type="text" size="50" /></td>
    <td><input name="quantita1" id="quantita1" type="text" size="4" /></td>
    <td><select name="misura1" id="misura1" />
        <option value="" selected="selected">===</option>
        <option value="Kg.">Kg</option>
        <option value="Gr.">Gr.</option>
        <option value="Lt.">lt</option>
        <option value="ml">ml</option>
        <option value="N.">N.</option>
        <option value="Bicchiere/i">Bicchiere/i</option>
        <option value="QB">QB</option>
      </select>
    </td>
    <td align="center"><input type="hidden" name="idricetta1" id="idricetta1" value="<? echo $codicericetta; ?>" /><br>
      <input name="conferma1" type="submit" id="conferma1" value=" Registra " />
      <div id="risultato"></div></p></td>
  </form>
  </tr>


  <tr>
    <form id="tabella2" method="post" action="">
    <td><input name="ingrediente2" type="text" size="50" /></td>
    <td><input name="quantita2" type="text" size="4" /></td>
    <td><select name="misura2" />
        <option value="" selected="selected">===</option>
        <option value="Kg.">Kg</option>
        <option value="Gr.">Gr.</option>
        <option value="Lt.">lt</option>
        <option value="ml">ml</option>
        <option value="N.">N.</option>
        <option value="Bicchiere/i">Bicchiere/i</option>
        <option value="QB">QB</option>
      </select>
    </td>
    <td align="center"><input type="hidden" name="idricetta2" id="idricetta2" value="<? echo $codicericetta; ?>" /><br>
      <input name="conferma2" type="submit" id="conferma2" value=" Registra " />
      <div id="risultato2"></div></p></td>
    </form>
  </tr>
</table>
naturalmente alla fine della pagina completa carico jquery e la pagina .js:
HTML:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="ajax_ricette.js"></script>
Ecco la pagina ajax_ricette.js:
Codice:
$(document).ready(function() {
    //Esegui la funzione quando il form 1 viene inviato
    $('#tabella').submit(function(e) {
        // Con il comando qui sotto evito che venga eseguito il comando "action" del <form>
        // Da notare che il parametro "e" si trova come parametro della funzione qui sopra
        e.preventDefault();

        //recupero il valore degli input
        var ingrediente = $('#ingrediente1').val();
        var quantita = $('#quantita1').val();
        var misura = $('#misura1').val();
        var idricetta = $('#idricetta1').val();

        //passo alla chiamata asincrona
        registrami(idricetta, ingrediente, quantita, misura);
    });


    //Esegui la funzione quando il form 2 viene inviato
    $('#tabella2').submit(function(e) {
        // Con il comando qui sotto evito che venga eseguito il comando "action" del <form>
        // Da notare che il parametro "e" si trova come parametro della funzione qui sopra
        e.preventDefault();

        //recupero il valore degli input
        var ingrediente2 = $('#ingrediente2').val();
        var quantita2 = $('#quantita2').val();
        var misura2 = $('#misura2').val();
        var idricetta2 = $('#idricetta2').val();

        //passo alla chiamata asincrona
        registrami2(idricetta2, ingrediente2, quantita2, misura2);
    });



    //la chiamata ajax
    function registrami(idricetta, ingrediente, quantita, misura) {
        $.ajax({
            url: 'registraingrediente.php',
            method: 'POST',
            data: {ric:idricetta, ingr:ingrediente, quant:quantita, mis:misura},
            dataType: 'text',
            success: function(feedback) {
                $("div#risultato").html(feedback);
                
            }
        });
    }

    function registrami2(idricetta2, ingrediente2, quantita2, misura2) {
        $.ajax({
            url: 'registraingrediente.php',
            method: 'POST',
            data: {ric:idricetta2, ingr:ingrediente2, quant:quantita2, mis:misura2},
            dataType: 'text',
            success: function(feedback) {
                $("div#risultato2").html(feedback);
                
            }
        });
    }

});
e questa è la pagina registraingrediente.php:
PHP:
<?php

$idricetta = $_POST['ric'];
$ingrediente = $_POST['ingr'];
$quantita = $_POST['quant'];
$unitamisura = $_POST['mis'];



include 'connect.php';

$query = "INSERT INTO ricette_ingredienti VALUES ('', '$idricetta','$ingrediente', '$unitamisura', '$quantita')";

$result = mysql_query($query);

$output = "OK";

echo $output;


?>
Quando inserisco la prima riga, va tutto perfettamente, quando inserisco la seconda riga passa solo l'id ricetta.

Dove sbaglio?

Grazie
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
HTML:
<td><input name="ingrediente[]" type="text" size="50" /></td>
<td><input name="quantità[]" type="text" size="4" /></td>
<td><select name="misura[]" />
in questo modo gestisci con l'array
se vuoi la gestione dinamica delle righe, ti preparo l'esempio
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
scusa, non credo di aver capito dove sta la differenza...
se utilizzo l'array potrei gestire tutte le righe in un colpo solo?
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
si
vedi questo esempio, aggiusta solo il link a jquery ed eseguilo
PHP:
<?php
if (empty($_POST)) {
?>
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Documento senza titolo</title>
    <!-- <link href="real-world.css" rel="stylesheet" type="text/css"> -->

    <script type='text/javascript' src='http://localhost/test_site/php/jquery.min.js'></script>

    <script type='text/javascript'>
//<![CDATA[
    $(document).ready(function() {
        var currentItem = 1;
        AddRow(currentItem);

        $('#addnew').click(function(){
            currentItem++;
            AddRow(currentItem);
        });

        $('#removelast').click(function(){
            if (currentItem > 1) {
                var rowID = '#row'+currentItem
                $(rowID).remove();
                currentItem--;
                $('#items').val(currentItem);
            }
        });

        function AddRow(currentItem)
        {
            var strToAdd = NewRow(currentItem)
            $('#data').append(strToAdd);
            $('#items').val(currentItem);
        };

        function NewRow(currentItem)
        {
            text
='<tr id="row'+currentItem+'">'
+'<td><input name="ingrediente[]" type="text" size="50" /></td>'
+'<td><input name="quantita[]" type="text" size="4" /></td>'
+'<td><select name="misura[]">'
+'<option value="===" selected="selected">scegli unit&agrave; di misura</option>'
+'<option value="Kg">Kg</option>'
+'<option value="Gr">Gr</option>'
+'<option value="Lt">lt</option>'
+'<option value="ml">ml</option>'
+'<option value="N">N.</option>'
+'<option value="Bicchiere">Bicchiere/i</option>'
+'<option value="QB">QB</option>'
+'</select>'
+'</td>'
+'</tr>';
            return text;
        };
    });
//]]>
    </script>

    <style>
    </style>

  </head>

  <body>

    <form name='myform' method='POST'>
      <table class="dd" width="100%" id="data">
        <tbody>
        </tbody>
      </table>

      <input type="submit" name="submit"                     value="SubmitValues" />
      <input type="button" name="addnew"     id="addnew"     value="Add new item" />
      <input type="button" name="removelast" id="removelast" value="Remove last item" />
      <input type="hidden" name="items"      id="items"      value="0" />
    </form>
  </body>
</html>
<?php
}
else
{
  function show_var($x)
  {
    $tabella = '<table border=1><tr> <th>variable</th> <th>value</th> </tr>';
    foreach( $x as $key => $value)
    {
      if (!is_object($value) and $key !== '_SERVER')
      {
        if (is_array ($value))
        {
          $tabella.='<tr><td>$'.$key.'</td><td>';
          if ( sizeof($value)>0 )
          {
            $tabella.= show_var($value);
          }
          else
          {
            $tabella.='EMPTY';
          }
          $tabella.='</td></tr>';
        }
        else
        {
          if ( empty($value) ) $value='EMPTY';
          $tabella.='<tr><td>$'.$key.'</td><td>'.$value.'</td></tr>';
        }
      }
    }
    $tabella.= '</table>';
    return $tabella;
  }
  echo show_var( get_defined_vars() );
}
?>
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
Innanzitutto grazie,
ho provato ad eseguire il tutto e per ora ho ricevuto un errore 500 (
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, [no address given] and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.)

Intanto comunque me lo leggo per bene, cercando di capire il tutto. Poi affronterò il problema dell'errore.
A presto
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
l'errore si verifica quando premo il tasto submit, che in effetti non porta apparentemente da nessuna parte...
forse non bastava semplicemente eseguire.
devo integrare il tutto istruendo su cosa fare quando premo submit, credo.

Comunque mi sembra geniale questo codice... :)

ci lavoro un po' e poi torno
a presto
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
sono un po' incartato...
ho messo come action
HTML:
action="<?php echo $_SERVER['PHP_SELF']; ?>"
poi ho richiamato la funzione show_var:
PHP:
if (isset($_POST['mostra']))
show_var($x);
e inoltre ho dovuto il eliminare il ciclo if empty $_Post che è all'inizio della pagina per non ricevere il messaggio di funzione non trovata.
Ora non da' errori, qualcosa fa ma non riesco a capire cosa, visto che premendo il tasto submit appare qualcosa velocissimo poi scompare e ritorno alla pagina vuota iniziale, come se facesse un refresh della pagina...
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
ti suggerisco di usare lo script originale modificando,
il riferimento a jquery
PHP:
<form name='myform' method='POST' action="<?php echo $_SERVER['PHP_SELF']; ?>">
lo script verifica all'inizio che $_POST sia vuoto ( empty($_POST) ),
in caso positivo ( vuoto ) visualizza il form,
upload_2018-6-16_15-37-57.png

in caso negativo ( con contenuto ) visualizza il contenuto delle variabili definite ( echo show_var( get_defined_vars() ); ) tra cui $_POST, permettendo di vedere i valori ricevuti nell'input con la submit
upload_2018-6-16_15-39-2.png
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
strano che empty non venga trovata come funzione,
dal mio manuale "locale" un po' vecchio
upload_2018-6-16_15-45-9.png


ps, controllato online vale per php 4, 5 e 7
 
Ultima modifica:

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
Quindi ho rimesso tutto come all'inizio.
Ho cambiato l'indirizzamento a jquery:
HTML:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
Visualizzo correttamente il form;
premendo "Add new Item" aggiunge una riga al form, "Remove Last Item" funziona come ci si aspetta, ma premendo "submit" ricevo in risposta sempre l'errore 500, [no address given].
Teoricamente premendo il tasto submit dovrebbe eseguire lo script php dall'inizio, riconoscere che ci sono delle variabili inserite e mostrare quella tabella che mi hai postato, giusto?
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
tabella che mi hai postato, giusto?
esatto, errore 500 è dato da un errore php, prova a postare l'errore e la riga associata

avresti anche dovuto sostituire "form" con
PHP:
    <form name='myform' method='POST' action="<?php echo $_SERVER['PHP_SELF']; ?>">
al limite scrivi il nome dello script in chiaro per evitare problrmi richiamando $_SERVER
action="NomeDelloScript.php"

se non risolvi posta lo script intero ed il suo nome
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
L'action del form l'avevo già impostata come mi hai suggerito con PHP_SELF.
l'errore 500 non fa riferimento a nessuna riga specifica. Comunica semplicemente che c'è un errore di indirizzamento.
In effetti l'unica funzione definita nella parte php è show_var($x), ma richiamando quella non succede quello che mi aspetterei, cioè la comparsa dell'elenco di quanto inserito...
Ma rivedendo il tutto, è un mix di javascript e php e probabilmente i due linguaggi non si parlano correttamente... ma non sono abbastanza bravo per capire dove sia l'inghippo...
La pagina intera è questa:
PHP:
<?php
if (empty($_POST)) {
?>
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Documento senza titolo</title>
    <!-- <link href="real-world.css" rel="stylesheet" type="text/css"> -->

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>

    <script type='text/javascript'>
//<![CDATA[
    $(document).ready(function() {
        var currentItem = 1;
        AddRow(currentItem);

        $('#addnew').click(function(){
            currentItem++;
            AddRow(currentItem);
        });

        $('#removelast').click(function(){
            if (currentItem > 1) {
                var rowID = '#row'+currentItem
                $(rowID).remove();
                currentItem--;
                $('#items').val(currentItem);
            }
        });

        function AddRow(currentItem)
        {
            var strToAdd = NewRow(currentItem)
            $('#data').append(strToAdd);
            $('#items').val(currentItem);
        };

        function NewRow(currentItem)
        {
            text
='<tr id="row'+currentItem+'">'
+'<td><input name="ingrediente[]" type="text" size="50" /></td>'
+'<td><input name="quantita[]" type="text" size="4" /></td>'
+'<td><select name="misura[]">'
+'<option value="===" selected="selected">scegli unit&agrave; di misura</option>'
+'<option value="Kg">Kg</option>'
+'<option value="Gr">Gr</option>'
+'<option value="Lt">lt</option>'
+'<option value="ml">ml</option>'
+'<option value="N">N.</option>'
+'<option value="Bicchiere">Bicchiere/i</option>'
+'<option value="QB">QB</option>'
+'</select>'
+'</td>'
+'</tr>';
            return text;
        };
    });
//]]>
    </script>

 
  </head>

  <body>

    <form name='myform' method='POST' action="<?php echo $_SERVER['PHP_SELF']; ?>">
      <table class="dd" width="100%" id="data">
        <tbody>
        </tbody>
      </table>

      <input type="submit" name="submit"                     value="SubmitValues" />
      <input type="button" name="addnew"     id="addnew"     value="Add new item" />
      <input type="button" name="removelast" id="removelast" value="Remove last item" />
      <input type="hidden" name="items"      id="items"      value="0" />
    </form>
  </body>
</html>
<?php
}
else
{


  function show_var($x)
  {
    $tabella = '<table border=1><tr> <th>variable</th> <th>value</th> </tr>';
    foreach( $x as $key => $value)
    {
      if (!is_object($value) and $key !== '_SERVER')
      {
        if (is_array ($value))
        {
          $tabella.='<tr><td>$'.$key.'</td><td>';
          if ( sizeof($value)>0 )
          {
            $tabella.= show_var($value);
          }
          else
          {
            $tabella.='EMPTY';
          }
          $tabella.='</td></tr>';
        }
        else
        {
          if ( empty($value) ) $value='EMPTY';
          $tabella.='<tr><td>$'.$key.'</td><td>'.$value.'</td></tr>';
        }
      }
    }
    $tabella.= '</table>';
    return $tabella;
  }
  echo show_var( get_defined_vars() );
}

?>
A questo punto la riscriverei da capo in modo un po' diverso, anche perchè alla fine gli ingredienti inseriti dovranno essere registrati in una tabella del db, non solo visualizzati a schermo.
Cioè quando premo submit in realtà dovrei registrare le singole righe in altrettante righe della tabella.
Diciamo che una volta che si riesce a visualizzare le righe, so dove sono i dati dell'array e devo solo andare a scriverli con una query mysql.
Al momento non capisco dove vanno a finire...
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
lo script che hai postato, funziona bene,
per cortesia de ti da errore 500, guarda il file di log di php che contiene gli errori trovati negli script e postalo
così ci rendiamo conto di quanto accade

in ogni caso prova anche ad immettere nella action il nome dello script invece del valore preso da $_SERVER
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
ma quindi non basterebbe mettere:
HTML:
action="<?php echo $_SERVER['PHP_SELF']; ?>"
che, se non sbaglio, dovrebbe semplicemente ricaricare la pagina corrente?
Di solito poi inserisco
PHP:
if (isset($_POST['submit']))
mia_funzione();
e in questo caso (se serve) al posto di mia funzione dovrei mettere il nome della pagina?
Scusate l'ignoranza