Voor onderstaande code zoek ik iets, ik wil graag automatisch, of door middel van een knopje de velden "bedrag" en "bethaalmethode" elke keer extra laten verschijnen.
Maximaal 100 stuks ofzo (niet alle 100 tegelijk)

Bij het verzenden van de data moeten alle velden meegenomen worden en de datum ook.


<?php
include ("db_config.php");
include ("site_config.php");

$sqlquery = "INSERT INTO omzet (datum, betaalmethode, bedrag) VALUES('".$_POST['datum']."','".$_POST['betaalmethode']."','".$_POST['bedrag']."')";

$results = mysql_query($sqlquery) or die ("Fout: " .
mysql_error());

mysql_close();
?> 
<html>
 <head>
 <meta charset="utf-8">
 <title><?php echo $titel; ?></title>
 <link rel="stylesheet" href="css/style.css">
 </head>

 <body>
 <form id="zoekform" method="post" action="toevoegen.php">
 <div class="row">
 <label for="datum"><?php echo $datum; ?></label>
 <input type="text" name="datum" id="datum" datum=""> </br></br>
 </div>
 
 <div class="row">
 <label for="betaalmethode"><?php echo $betaalmethode; ?></label>
 <select type="text"  name="betaalmethode" id="betaalmethode" betaalmethode=""> </br></br>
                <option value="contant" selected>Contant</option>
                <option value="pin">Pin</option>
</select></br></br>
 </div>
 
 <div class="row">
 <label for="bedrag"><?php echo $bedrag; ?></label>
 <input type="text"  name="bedrag" id="bedrag" bedrag=""> </br></br>
 </div>
 
 <hr>
 <input type="submit" value="toevoegen">
 <input type="reset" value="terugzetten">
 </form>

<a href= index.php >Home</a>
 </body>
 </html>


Jup, dat kan ook. In mijn geval bedoelde ik overigens per iteratie. Dus per keer dat er geklikt wordt tussen de blokhaken doortellen.

Maar Thomas zijn manier is beter.
Stel dat je deze regels ook weer even gemakkelijk wilt verwijderen, of anders wilt rangschikken. Ik denk dat je dan alleen maar meer hinder ondervindt van een vaste nummering dan dat je hier profijt van hebt.

Ook heeft de index geen echte betekenis noch echte meerwaarde, want de velden worden toch verzonden in de volgorde waarin ze visueel op het scherm staan.

Om toch/gemakkelijk het aantal elementen te kunnen tellen zou ik hier een soort van container/wrapper (div) met een id omheen zetten, en dan gewoon elke keer als er geklikt wordt het aantal elementen in de container tellen.
Thomas van den Heuvel op 12/07/2016 12:58:49

Het enige wat je hoeft te doen is de veldnamen in je JavaScript snippet te voorzien van rechte haken?

Er zit mogelijk een spellingsfout in de veldnaam -> bet[color=#ff0000]h[/color]aalmethode.

En voor de goede orde zouden waarden van tag-eigenschappen tussen "dubbele quotes" moeten staan in plaats van enkele.


thx voor de spellingsfout, was idd zo.
Maar blijkbaar snap ik het niet.
Ik heb de js aangepast, volgens mij correct, maar het werkt nog steeds niet.

var counter = 1;
var limit = 50;
function meer(divName){
     if (counter == limit)  {
          alert("Maximum bereikt " + counter + " inputs");
     }
     else {
          var newdiv = document.createElement('div');
          newdiv.innerHTML = "Entry " + (counter + 1) + " <div class="row">Betaalmethode <input type="text" name="betaalmethode[]"><section> Bedrag <input type="text" name="bedrag[]">";
          document.getElementById(divName).appendChild(newdiv);
          counter++;
     }
}


Kijk eens met print_r($_POST) wat er ge-POST wordt?
@Douwe ik denk dat je JavaScript breekt omdat je de zowel de string begrensd met dubbele quotes, en ook in de string zelf dubbele quotes gebruikt... Als je nu eens je string begrensd met enkele quotes?

Concreet, vervang regel 9 door:
newdiv.innerHTML = 'Entry ' + (counter + 1) + ' <div class="row">Betaalmethode <input type="text" name="betaalmethode[]"><section> Bedrag <input type="text" name="bedrag[]">';


Waarom open je daar trouwens een section? :/
- Ariën - op 12/07/2016 14:01:42

Kijk eens met print_r($_POST) wat er ge-POST wordt?

Dan komt er dit uit:

Array ( [datum] => 11.2.16 [betaalmethode] => Array ( [0] => Overmaken [1] => Pin ) [bedrag] => Array ( [0] => 11,11 [1] => 52.25 ) )

Thomas van den Heuvel op 12/07/2016 14:40:08

@Douwe ik denk dat je JavaScript breekt omdat je de zowel de string begrensd met dubbele quotes, en ook in de string zelf dubbele quotes gebruikt... Als je nu eens je string begrensd met enkele quotes?

Concreet, vervang regel 9 door:
newdiv.innerHTML = 'Entry ' + (counter + 1) + ' <div class="row">Betaalmethode <input type="text" name="betaalmethode[]"><section> Bedrag <input type="text" name="bedrag[]">';


Waarom open je daar trouwens een section? :/


Helaas nog steeds niet in de db
Die section is weg, was een probeerseltje nvt
Okay.

Het HTML en JavaScript gedeelte zou nu opgelost moeten zijn. Resteert je nog het bakken van INSERT-queries.

Ik denk dat je het jezelf gemakkelijker maakt om dit soort dingen in verschillende deelproblemen op te delen want je neemt teveel hooi op je vork. Je probeert alles in 1x op te lossen en dan "werkt het niet", in plaats van dingen stap voor stap en gestructureerd aan te pakken.

Je bent nu zover dat je je POST data kunt gaan inspecteren en op grond daarvan queries kunt gaan bouwen. Het is misschien ook handig om eerst te controleren of je formulier verzonden is voordat je lukraak $_POST variabelen gaat gebruiken die mogelijk helemaal niet bestaan...

Probeer even wat meer orde te scheppen in je (eigen) chaos.
Thomas van den Heuvel op 12/07/2016 16:16:32

Okay.

Het HTML en JavaScript gedeelte zou nu opgelost moeten zijn. Resteert je nog het bakken van INSERT-queries.

Ik denk dat je het jezelf gemakkelijker maakt om dit soort dingen in verschillende deelproblemen op te delen want je neemt teveel hooi op je vork. Je probeert alles in 1x op te lossen en dan "werkt het niet", in plaats van dingen stap voor stap en gestructureerd aan te pakken.

Je bent nu zover dat je je POST data kunt gaan inspecteren en op grond daarvan queries kunt gaan bouwen. Het is misschien ook handig om eerst te controleren of je formulier verzonden is voordat je lukraak $_POST variabelen gaat gebruiken die mogelijk helemaal niet bestaan...

Probeer even wat meer orde te scheppen in je (eigen) chaos.


Hoi Thomas,

Excuus voor de late reactie (vakantie), maar mijn kennis rijkt niet ver genoeg (nog) om te snappen wat je bedoeld en uit te voeren.
Kan/wil je mij op weg helpen?
Zorg dat je eerst structuur in je code brengt, waarbij je de afhandeling en de 'view' met wat je ziet gescheiden houdt binnen een enkel PHP-script.

In dit ietswat gestripte voorbeeld houd ik rekening dat je de MySQLi-functies gebruikt. Je zult hierbij nog wel je db_config.php moeten aanpassen.


<?php
include ("db_config.php");
include ("site_config.php");
if($_SERVER['REQUEST_METHOD'] == "POST") {
	$sqlquery = "INSERT INTO omzet (datum, 
					betaalmethode, 
					bedrag)
				 VALUES('".mysqli_real_escape_string($con,$_POST['datum'])."',
					'".mysqli_real_escape_string($con,$_POST['betaalmethode']."',
					'".mysqli_real_escape_string($con,$_POST['bedrag']."
					')";

	$results = mysqli_query($con,$sqlquery) or die ("Fout: " .mysqli_error($con));
} else {
?>
/* HIER JE HTML-GEDEELTE
<?php
}
?>
@Ariën het hele idee was juist dat je meerdere records in 1x in kon voeren :). Je zult dus op zijn minst met een foreach-loop door je POST data heen moeten.

Daarnaast is het verstandig om je invoer te filteren, je wilt dat datums goed geformatteerde datums zijn, dat (bij voorkeur) de betaalmethode een id(entifier) is van een betaalmethode-tabel en dat een bedrag ook echt een numeriek bedrag is. Dit alles om er zorg voor te dragen dat de informatie die de database in gaat ook echt (in ieder geval qua formattering) klopt.

Oh en als je hier dan toch een foreach van maakt wil je waarschijnlijk ook dat al deze records worden ingevoerd, of geen van alle. Misschien is dan gebruikmaking van een transactie verstandig. Wat tot gevolg heeft dat de engine van deze tabel(len) InnoDB moet zijn.

Daarnaast wil je dan waarschijnlijk ook terugkoppeling over wat er fout is indien er iets niet klopt en wil je tevens niet alles opnieuw invullen maar het formulier terugkrijgen met alle zojuist ingevulde informatie, waarbij de velden met fouten voorzien zijn van een aantekening. Anders wordt het invoeren van omzet nogal een beproeving.

Oftewel: het invoeren moet makkelijk zijn, geen extra werk kosten en de data die de database in gaat moet van het juiste format zijn.

@Douwe hoe zijn deze bedragen opgebouwd? Met een komma als decimaal scheidingsteken, of een punt? Of vul je alles in in centen? Indien je bedragen invoert met een komma dan kan PHP/MySQL hier niet (goed) mee rekenen. Daarnaast, hoe luidt de tabeldefinitie van omzet (op te vragen met SHOW CREATE TABLE omzet)?

Reageren