[RISOLTO][PHP] fatture multiriga e query salvataggio mysql

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
abranca
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: mercoledì 23 gennaio 2013, 11:48
Desktop: Gnome
Distribuzione: Ubuntu GNOME 15.04
Sesso: Maschile

[RISOLTO][PHP] fatture multiriga e query salvataggio mysql

Messaggio da abranca »

Ciao a tutti,
sto realizzando un piccolo form per fatture con aggiunta di righe multiple, quindi ho i miei pulsanti per l'aggiunta di una nuova riga, la rimozione di una riga e il salvataggio del tutto che richiama una query mysql.
Sono alle prime armi con php e mysql e, sicuramente, faccio qualche stupidata.

Ora arrivo al problema. Faccio un esempio per capire meglio.
Faccio una nuova fattura con due righe:
| DESCRIZIONE | QT | PREZZO |
articolo1 1 10
articolo2 2 20

Quando vado a fare il salva viene salvata solo l'ultima riga.
Sicuramente è un problema di php, di come ho impostato la query mysql per il salvataggio.
Non capisco se devo realizzare un array o altro.
Vi posto il codice html con lo script java e il codice php.

Vorrei far notare che quando aggiungo una riga, i campi input prendono sempre gli stessi nomi. Non vorrei che ciò sia parte del problema. Lo script java l'ho recuperato sul web.

CODICE HTML:

Codice: Seleziona tutto

<!DOCTYPE html>
<head>
<style type="text/css">
table,tr,td{border:0px solid black;}
</style>
<script type="text/javascript">
    function addRow(tableID) {
        var table = document.getElementById(tableID);
        var rowCount = table.rows.length;
        var row = table.insertRow(rowCount);
        var colCount = table.rows[0].cells.length;
        for(var i=0; i<colCount; i++) {
            var newcell = row.insertCell(i);
            newcell.innerHTML = table.rows[0].cells[i].innerHTML;
            //alert(newcell.childNodes);
            switch(newcell.childNodes[0].type) {
                case "text":
                    newcell.childNodes[0].value = "";
                    break;
                case "text":
                    newcell.childNodes[0].value = "";
                    break;
                case "text":
                    newcell.childNodes[0].value = "";
                    break;
                case "text":
                    newcell.childNodes[0].value = "";
                    break;
                case "text":
                    newcell.childNodes[0].value = "";
                    break;
                case "checkbox":
                    newcell.childNodes[0].checked = false;
                    break;
                case "select-one":
                    newcell.childNodes[0].selectedIndex = 0;
                    break;
            }
        }
    }
    function deleteRow(tableID) {
        try {
        var table = document.getElementById(tableID);
        var rowCount = table.rows.length;
        for(var i=0; i<rowCount; i++) {
            var row = table.rows[i];
            var chkbox = row.cells[0].childNodes[0];
            if(null != chkbox && true == chkbox.checked) {
                if(rowCount <= 1) {
                    alert("Impossibile cancellare tutte le righe");
                    break;
                }
                table.deleteRow(i);
                rowCount--;
                i--;
            }
        }
        }catch(e) {
            alert(e);
        }
    }

</script>
</head>

<body>
    <style type="text/css">
    table,tr,td{border:0px solid black;}
    </style>
      <table id="titlebar" cellspacing="0px">
            <tr>
                <td style="width:20px;">✓</td>
                <td style="width:160px;">DESCRIZIONE</td>
                <td style="width:62px;">QT.</td>
                <td style="width:63px;">PREZZO</td>
                
            </tr>
        </table>
        <form action="index.php" method="POST">
      <table id="dataTable" width="auto" style="margin:-4px 0 0 0;" cellspacing="0px">
        <tr>
          <td style="width:20px;"><INPUT type="checkbox" name="chk" /></td>
          <td><INPUT type="text" name="descrizione" style="width:160px;" autocomplete="on" placeholder="DESCRIZIONE" required/></td>
                <td><INPUT type="text" name="qt" style="width:62px;" autocomplete="on" placeholder="QT." required/></td>
                <td><INPUT type="text" name="prezzo" style="width:63px;" autocomplete="on" placeholder="PREZZO" required/></td>
          
          </td>
               
        </tr>
      </table>
        <INPUT type="button" value="AGGIUNGI RIGA" onclick="addRow('dataTable')" />
      <INPUT type="button" value="CANCELLA RIGA" onclick="deleteRow('dataTable')" />
        <INPUT type="submit" value="INVIA"/>
        </form>

</body>
</html>
CODICE PHP:

Codice: Seleziona tutto

 <?php
   
       $con = mysql_connect('localhost', 'xxx', 'xxx') or die ('Errore, non posso fare il login');
       mysql_select_db('test') or die("errore nel selezionare il db");

     $desc = $_POST['descrizione'];
     $qt = $_POST['qt'];
     $pz = $_POST['prezzo'];

     $sql=mysql_query("INSERT INTO tab (id,descrizione,qt,prezzo) VALUES ('','$desc','$qt','$pz')");
   
   mysql_close();
    
    ?> 
Ultima modifica di abranca il sabato 16 agosto 2014, 18:14, modificato 3 volte in totale.
abranca
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: mercoledì 23 gennaio 2013, 11:48
Desktop: Gnome
Distribuzione: Ubuntu GNOME 15.04
Sesso: Maschile

Re: [PHP] fatture multiriga e query salvataggio mysql

Messaggio da abranca »

update:

ho risolto il problema del javascript che creava nuove righe assegnando ad ogni input lo stesso nome.
ho trovato un'altro javascript che però replica l'array presente nel codice html.

CODICE JAVASCRIPT:

Codice: Seleziona tutto

function addRow() {
    /* Declare variables */
    var elements, templateRow, rowCount, row, className, newRow, element;
    var i, s, t;
    
    /* Get and count all "tr" elements with class="row".    The last one will
     * be serve as a template. */
    if (!document.getElementsByTagName)
        return false; /* DOM not supported */
    elements = document.getElementsByTagName("tr");
    templateRow = null;
    rowCount = 0;
    for (i = 0; i < elements.length; i++) {
        row = elements.item(i);
        
        /* Get the "class" attribute of the row. */
        className = null;
        if (row.getAttribute)
            className = row.getAttribute('class')
        if (className == null && row.attributes) {    // MSIE 5
            /* getAttribute('class') always returns null on MSIE 5, and
             * row.attributes doesn't work on Firefox 1.0.    Go figure. */
            className = row.attributes['class'];
            if (className && typeof(className) == 'object' && className.value) {
                // MSIE 6
                className = className.value;
            }
        } 
        
        /* This is not one of the rows we're looking for.    Move along. */
        if (className != "riga")
            continue;
        
        /* This *is* a row we're looking for. */
        templateRow = row;
        rowCount++;
    }
    if (templateRow == null)
        return false; /* Couldn't find a template row. */
    
    /* Make a copy of the template row */
    newRow = templateRow.cloneNode(true);

    /* Change the form variables e.g. price[x] -> price[rowCount] */
    elements = newRow.getElementsByTagName("input");
    for (i = 0; i < elements.length; i++) {
        element = elements.item(i);
        s = null;
        s = element.getAttribute("name");
        if (s == null)
            continue;
        t = s.split("[");
        if (t.length < 2)
            continue;
        s = t[0] + "[" + rowCount.toString() + "]";
        element.setAttribute("name", s);
        element.value = "";
    }
    
    /* Add the newly-created row to the table */
    templateRow.parentNode.appendChild(newRow);
    return true;
}
CODICE HTML:

Codice: Seleziona tutto

<form action="index.php" method="post">
   <table>
<tr><th>nome</th><th>quantita</th><th>prezzo</th></tr>
<tr class="riga">
  <td><input type="text" name="descrizione[0]"/></td>
  <td><input type="text" name="quantita[0]"/></td>
  <td><input type="text" name="prezzo[0]"/></td>
</tr>


</table>

<div><input type="submit" /></div>

<div><a onclick="addRow(); return false;" href="#">Aggiungi riga</a></div>

</form>
Ora il problema sta tutto nella query.
La tabella è cosi composta:
id | descrizione | quantita | prezzo
Quando salvo le righe che ho inserito trovo il valore id corretto (autoincrementale), nella voce descrizione trovo solo la voce Array e nei campi quantita e prezzo trovo 0 (in quanto i campi sono impostati relativamente come interi per quantità e decimale come prezzo).

Vorrei che per ogni riga che creo nel form si creasse una riga nel database con valori corretti per ogni campo.
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: [PHP] fatture multiriga e query salvataggio mysql

Messaggio da SuperStep »

le variabili

Codice: Seleziona tutto

$desc = $_POST['descrizione'];
$qt = $_POST['qt'];
$pz = $_POST['prezzo'];
dovrebbero essere in realta' array, se assumono piu' di un valore con lo stesso name.

dovresti ciclarli con un foreach.

nella pagina PHP dove fai la query sospendi un attimo il codice, (magari mettendo die() dopo lo script che sto per postare) e prova a fare

Codice: Seleziona tutto

foreach($POST['descrizione'] as $id => $value)
    echo "descrizione[$id] = $value";

//die();
se ottieni tutte le descrizioni devi solamente fare la stessa cosa per quanto riguarda la query, ovvero,
o crei una struttura di appoggio dove salvi tutti gli INPUT POST ed esegui una query per ogni tuple di questa struttura.

oppure piu' grossolanamente e velocemente, cicli una variabile e prendi tramite la posizione le altre.

[EDIT] corretto for con foreach
Ultima modifica di SuperStep il venerdì 15 agosto 2014, 12:10, modificato 1 volta in totale.
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
abranca
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: mercoledì 23 gennaio 2013, 11:48
Desktop: Gnome
Distribuzione: Ubuntu GNOME 15.04
Sesso: Maschile

Re: [PHP] fatture multiriga e query salvataggio mysql

Messaggio da abranca »

ciao superstep, come sempre grazie per la risposta.
allora i parametri sono si un array, ma non assumono più lo stesso nome grazie al nuovo javascript.
infatti il campo descrizione (che prima si ripeteva con lo stesso nome) ora viene rinominato in descrizione[0], descrizione[1], ecc.

ti ricordo che utilizzo sempre la programmazione procedurale. ho seguito un po' di guide che mi avevi consigliato nell'altro post sui framework e ho, pre ora, preferito continuare con la programmazione procedurale per farmi un po' di esperienza prima di passare ai framework.
grazie per ora!
Ultima modifica di abranca il giovedì 14 agosto 2014, 12:13, modificato 1 volta in totale.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [PHP] fatture multiriga e query salvataggio mysql

Messaggio da Zoff »

quella è la sintassi del foreach, tu hai scritto solo for.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
abranca
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: mercoledì 23 gennaio 2013, 11:48
Desktop: Gnome
Distribuzione: Ubuntu GNOME 15.04
Sesso: Maschile

Re: [PHP] fatture multiriga e query salvataggio mysql

Messaggio da abranca »

grazie....scusate per la domanda stupida! me ne sono accorto dopo.... ho fatto tardi stanotte :D
abranca
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: mercoledì 23 gennaio 2013, 11:48
Desktop: Gnome
Distribuzione: Ubuntu GNOME 15.04
Sesso: Maschile

Re: [PHP] fatture multiriga e query salvataggio mysql

Messaggio da abranca »

ho corretto (dopo la domanda stupidissima) la formula in

Codice: Seleziona tutto

foreach($_POST['descrizione'] as $id => $valuedesc){
         echo "descrizione[$id] = $valuedesc<br />";
     }
     
     foreach($_POST['quantita'] as $id => $valueqt){
         echo "quantita[$id] = $valueqt<br />";
     }
        
     foreach($_POST['prezzo'] as $id => $valueprezzo){
         echo "prezzo[$id] = $valueprezzo<br />";
     }
e ottengo tutti i valori.
ora lavoro sulla query....

grazie ad entrmbi
abranca
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: mercoledì 23 gennaio 2013, 11:48
Desktop: Gnome
Distribuzione: Ubuntu GNOME 15.04
Sesso: Maschile

Re: [PHP] fatture multiriga e query salvataggio mysql

Messaggio da abranca »

grazie al vostro aiuto, ho risolto.
ho modificato la query in questo modo:

Codice: Seleziona tutto

if (
   !empty($_POST['descrizione']) && !empty($_POST['quantita']) && !empty($_POST['prezzo']) &&
   is_array($_POST['descrizione']) && is_array($_POST['quantita']) && is_array($_POST['prezzo']) &&
   count($_POST['descrizione']) === count($_POST['quantita']) 
) {
    $desc_array = $_POST['descrizione'];
    $qt_array = $_POST['quantita'];
    $pz_array = $_POST['prezzo'];
    for ($i = 0; $i < count($desc_array); $i++) {

        $descrizione = mysql_real_escape_string($desc_array[$i]);
        $quantita = mysql_real_escape_string($qt_array[$i]);
        $prezzo = mysql_real_escape_string($pz_array[$i]);
        mysql_query("INSERT INTO tab (id,descrizione,qt,prezzo) VALUES ('','$descrizione','$quantita','$prezzo')");
    } 
}
riesco a salvare tutto.
lascio postato il codice nel caso possa servire a qualcun'altro.
metto risolto.

nuovamente grazie a tutti!

P.S. ovviamente se la query è ottimizzabile o avete altri consigli sono ben accetti! ;)
P.S.S. chiedo scusa per le domande a volte semplici per chi ci lavora da anni o per chi ha avuto un'istruzione sicuramente più precisa e profonda della mia, ma sto cercando di imparare da autodidatta. sopportatemi, l'impegno ce lo metto :D
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: [RISOLTO][PHP] fatture multiriga e query salvataggio mys

Messaggio da SuperStep »

scusa ho scritto di fretta xD
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
abranca
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: mercoledì 23 gennaio 2013, 11:48
Desktop: Gnome
Distribuzione: Ubuntu GNOME 15.04
Sesso: Maschile

Re: [RISOLTO][PHP] fatture multiriga e query salvataggio mys

Messaggio da abranca »

No scusa tu....avevo già fatto esperimenti col foreach ma non ho pensato molto. ho fatto copia incolla...quando mi sono "svegliato" avevo già scritto la stupidata. :)
Comunque grazie el tuo aiuto ho risolto. Sto facendo esperimenti, magari anche inutili ma penso che sperimentando su cose reali si possa fare esperienza. Grazie nuovamente a tutti
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 19 ospiti