2016-08-19 3 views
0

Ich versuche, einige Daten von Javascript zu PHP zu bekommen. Es ist eine Tabelle, in der die Anzahl der Zeilen variabel ist. Also, ich versuche, alle Daten mit einer Schleife in Javascript zu erhalten und sie dann an PHP zu senden. Dort werde ich eine andere Schleife verwenden, um jede Zeile mit einer anderen Schleife zu speichern. So gibt es den Code:Array mit mehreren Array von Javascript zu PHP

JAVASCRIPT

//---- this is the important section ---- // 
var data = new FormData(); 
var table = []; 
for (var i = 1; i <= document.getElementById('nblines').value; i++) { 
    var date = document.getElementById('date' + i).innerHTML; 
    if (document.getElementById('l' + i).checked == true) { var type = 1;} else { var type = 2;} 
    var paiement = document.getElementById('a' + i).innerHTML; 
    var tps = document.getElementById('b' + i).innerHTML; 
    var tvq = document.getElementById('c' + i).innerHTML; 
    var total = document.getElementById('d' + i).innerHTML; 
    var interet = document.getElementById('e' + i).innerHTML; 
    var principal = document.getElementById('f' + i).innerHTML; 
    var balance = document.getElementById('g' + i).innerHTML; 
    var line = [i,date,type,type,paiement,tps,tvq,total,interet,principal,total]; 
    table.push(line); 
}; 
console.log(table); 
data.append('amortTable', table); 


------------------------------------------------ 
|            | 
| ---- this is the NOT important section ---- | 
|            | 
------------------------------------------------ 


var token = document.getElementById("csrf_token").content; 
var request = new XMLHttpRequest(); 
request.onreadystatechange = function notify() 
{ 
    if (request.readyState === XMLHttpRequest.DONE) { 
     if (request.status === 200) { 
      setTimeout(loadPage(page),500); 
      $.niftyNoty({ 
       type: 'success', 
       container : 'floating', 
       html : 'Votre calcul s\'est enregistré avec succès!', 
       timer : 5000 
      }); 
     } else { 
     } 
    } else { 
     // still not ready 
    } 
} 
request.open("POST", "savecalcul", true); 
request.setRequestHeader("X-CSRF-TOKEN", token); 
request.send(data); 

PHP

foreach ($request->input('amortTable') as $i) { 
    $line = new Amortissement; 
    $line -> calcul() -> associate($calcul->id); 
    $line -> number = $i[0]; 
    $line -> date = $i[1]; 
    $line -> type = $i[2]; 
    $line -> paiement = $i[3]; 
    $line -> tps = $i[4]; 
    $line -> tvq = $i[5]; 
    $line -> total = $i[6]; 
    $line -> interet = $i[7]; 
    $line -> principal = $i[8]; 
    $line -> total = $i[9]; 
    $line -> save(); 
} 

Ich erhalte diesen Fehler local.ERROR: Ausnahme 'Error' mit der Meldung ‚Invalid argument für foreach geliefert() 'in ... der Linie ist:

foreach ($request->input('amortTable') as $i) { 

Also, bin ich auf dem richtigen Weg, und wenn ja, was soll ich tun falsch. Wenn ich nicht auf dem richtigen Weg bin, was soll ich tun?

Antwort

2

Das Problem in dieser Linie ist:

for (var i = 1; i >= document.getElementById('nblines').value; i++) {

Es sollte:

for (var i = 1; i <= document.getElementById('nblines').value; i++) {

+0

Ja, habe es gesehen. Vielen Dank. Jetzt bekomme ich etwas in der console.log, aber ich habe einen Fehler in PHP: local.ERROR: Ausnahme 'ErrorException' mit Nachricht 'Ungültige Argument für foreach()' in ... –

+0

Ihre PHP-Code ist nicht vollständig. Dieser Fehler bedeutet, dass '$ request-> input ('table')' kein Array ist. – rationalboss

+1

Sie haben das JS-Array zu 'FormData' als' amortTable' hinzugefügt. Wahrscheinlich müssen Sie '-> input ('table')' in '-> input ('amortTable')' ändern, damit es mit dem übereinstimmt, was Sie senden. (oder ändern Sie die JS, um '' Tabelle '' zu verwenden) – Terminus

0

Also, mit Hilfe von @Terminus, der mich zu this Q/A führen, fand ich die Lösung für mein Problem.

Es ist der neue JavaScript-Code, wird explaination folgen:

var data = new FormData(); 
data.append('nblines', document.getElementById('nblines').value); 
for (var i = 1; i <= document.getElementById('nblines').value; i++) { 
    var date = document.getElementById('date' + i).innerHTML; 
    if (document.getElementById('l' + i).checked == true) { var type = 1;} else { var type = 2;} 
    var paiement = document.getElementById('a' + i).innerHTML; 
    var tps = document.getElementById('b' + i).innerHTML; 
    var tvq = document.getElementById('c' + i).innerHTML; 
    var total = document.getElementById('d' + i).innerHTML; 
    var interet = document.getElementById('e' + i).innerHTML; 
    var principal = document.getElementById('f' + i).innerHTML; 
    var balance = document.getElementById('g' + i).innerHTML; 
    var line = i + '|' + date + '|' + type + '|' + paiement + '|' + tps + '|' + tvq + '|' + total + '|' + interet + '|' + principal + '|' + balance; 
    data.append('line' + i, line); 
}; 

Also, anstatt zu versuchen, alles auf dem gleichen Array zu setzen, füge ich auf „Daten“ die erste Zeile weichen nützliche Informationen enthalten. In diesem Fall die Gesamtanzahl der Zeile, die ich der Datenbank hinzufügen möchte.

Dann habe ich eine Schleife erstellt, die jede Zeile zu der DataForm mit dem Index line + i hinzufügen, die eine Zeichenfolge jeder Var enthalten, die mit einem bestimmten Zeichen getrennt ist. Verwenden Sie keines, das Sie in der Eingabe finden können. Da ich in diesem Fall nur numerische Zeichen hinzufüge, habe ich "|" gewählt.

Danach, kommen Sie den PHP-Code, wo Sie einfach die ersten data.append verwenden, um zu finden, wie viel Zeit Sie brauchen, um die nächste Schleife zu starten.

$nblines = $request->input('nblines'); 
    for ($i=1; $i <= $nblines ; $i++) { 
     $line = new Amortissement; 
     $line -> calcul() -> associate($calcul->id); 
     $j = explode('|', $request->input('line'.$i)); 
     $line -> number = $j[0]; 
     $line -> date = $j[1]; 
     $line -> type = $j[2]; 
     $line -> paiement = $j[3]; 
     $line -> tps = $j[4]; 
     $line -> tvq = $j[5]; 
     $line -> total = $j[6]; 
     $line -> interet = $j[7]; 
     $line -> principal = $j[8]; 
     $line -> balance = $j[9]; 
     $line->save(['timestamps' => false]); 
    } 

$j = explode('|', $request->input('line'.$i)); Verwendung wird das Array auf jeder Saite basiert ich in die Datenform hinzugefügt.

Besonderer Dank geht an Rationalboss und Terminus!

Verwandte Themen