Ik heb een tabel gemaakt waarbij elke cel een waarde in de database kan updaten. Bijvoorbeeld:

Gebruikersnaam: 1 5 6 8 9 8 5
Gebruikersnaam: 3 6 8 4 5 8 2


Er moet dus per regel/line in de tabel een update op mijn database worden uitgevoerd. Mijn formulier heeft per regel allemaal dezelfde naam dus ik maak al gebruik van name="pos_1[]" en dat update ik met een foreach.

Nou weet ik alleen niet goed hoe ik dit met een heleboel regels moet aanpakken. Ik heb iets gemaakt wat wel werkt maar ik gebruik nu een foreach in een foreach in een foreach etc ...
Ik denk gewoon dat dit niet de goede manier is en tevens duurt het laden van de pagina ook heel lang.

Wie kan mij vertellen hoe dit wel moet?


Dit is mijn formulier:

<?php
// Haal warstats op van openstaande war
	$SQLSelectWarstats = "SELECT warid, gebruikersnaam, positie, pos_1, a_1, a_1_n, pos_2, a_2, a_2_n, a_v, a_v_s
						  FROM warstats
						  WHERE warid = '" . $warid . "'";
	$ResultSelectWarstats = $conn->query($SQLSelectWarstats);
	
	// Sla aantal warleden op in variabel
	$row_count = $ResultSelectWarstats->num_rows;
	
	// Maak een formulier aan en tabel
	echo "<form class='pure-form' method='POST' action='index.php?pagina=war&sub=invullen2'>";
	echo "<legend>War invullen:</legend>";
	echo "<br/>";
	echo "<table class='pure-table invullen'>";
	echo "<thead>";
	echo "<th></th>";
	echo "<th>Gebruikersnaam</th>";
	echo "<th>Positie 1e aanval</th>";
	echo "<th>Sterren 1e aanval</th>";
	echo "<th>Nieuwe sterren 1e aanval</th>";
	echo "<th>Positie 2e aanval</th>";
	echo "<th>Sterren 2e aanval</th>";
	echo "<th>Nieuwe sterren 2e aanval</th>";
	echo "<th>Aantal x verdediging gebruikt</th>";
	echo "<th>Aantal x verdedigd success</th>";
	echo "</thead>";
	echo "<tbody>";
	
	while($warstats = $ResultSelectWarstats->fetch_assoc()) {
		//Hidden post Warid
		echo "<input type='hidden' name='warid' value='" . $warid . "'>";
		echo "<tr>";
		// Warpositie
		echo "<td>" . $warstats["positie"] . "</td>";
		// Gebruikersnaam
		echo "<td>" . $warstats["gebruikersnaam"] . "</td>";
		echo "<input type='hidden' name='gebruikersnaam[]' value='" . $warstats["gebruikersnaam"] . "'>";
		// Tel aantal posities 1e aanval
		echo "<td><select name='pos_1[]'><option></option>";
		foreach (range(1, $row_count) as $number) {
							
			echo "<option>" . $number . "</option>";
							
		}
		echo "</select></td>";
		// Sterren 1e aanval
		echo "<td><select name='a_1[]'><option></option><option>1</option><option>2</option><option>3</option></select></td>";
		// Nieuwe sterren 1e aanval
		echo "<td><select name='a_1_n[]'><option></option><option>1</option><option>2</option><option>3</option></select></td>";
		// Tel aantal posities 2e aanval
		echo "<td><select name='pos_2[]'><option></option>";
		foreach (range(1, $row_count) as $number) {
							
			echo "<option>" . $number . "</option>";
							
		}
		echo "</select></td>";
		// Sterren 2e aanval
		echo "<td><select name='a_2[]'><option></option><option>1</option><option>2</option><option>3</option></select></td>";
		// Nieuwe sterren 2e aanval
		echo "<td><select name='a_2_n[]'><option></option><option>1</option><option>2</option><option>3</option></select></td>";
		// Aantal x verdediging gebruikt
		echo "<td><select name='a_v[]'><option></option><option>1</option><option>2</option><option>3</option><option>4</option><option>5</option><option>6</option><option>7</option><option>8</option><option>9</option><option>10</option></select></td>";
		// Aantal x verdedigd success
		echo "<td><select name='a_v_s[]'><option></option><option>1</option><option>2</option><option>3</option><option>4</option><option>5</option><option>6</option><option>7</option><option>8</option><option>9</option><option>10</option></select></td>";
		echo "</tr>";
		
	}
	
	echo "</tbody>";
	echo "</table>";
	echo "<br/>";
	echo "<input type='submit' name='updaten' value='Bijwerken'>";
	echo "</form>";
?>



En dit wordt zo verwerkt:

<?php
// Maak connectie met db
include ("../connect.php");

// Variabele naar formulier voor redirect
$formpagina = "index.php?pagina=war&sub=invullen";

if (isset($_POST['warid'])) {
	
	foreach ($_POST['pos_1'] as $pos_1) {
		
		foreach ($_POST['a_1'] as $a_1) {
			
			foreach ($_POST['a_1_n'] as $a_1_n) {
				
				foreach ($_POST['pos_2'] as $pos_2) {
					
					foreach ($_POST['a_2'] as $a_2) {
						
						foreach ($_POST['a_2_n'] as $a_2_n) {
							
							foreach ($_POST['a_v'] as $a_v) {
								
								foreach ($_POST['a_v_s'] as $a_v_s) {
									
									foreach ($_POST['gebruikersnaam'] as $gebruikersnaam) {
	
										$SQLUpdateWarstats = "UPDATE warstats
													  SET pos_1='" . $pos_1 . "',
													  a_1='" . $a_1 . "',
													  a_1_n='" . $a_1_n . "',
													  pos_2='" . $pos_2 . "',
													  a_2='" . $a_2 . "',
													  a_2_n='" . $a_2_n . "',
													  a_v='" . $a_v . "',
													  a_v_s='" . $a_v_s . "'
													  WHERE warid='" . $_POST['warid'] . "'
													  AND gebruikersnaam='" . $gebruikersnaam . "'";
										if ($conn->query($SQLUpdateWarstats) === FALSE) {
												
											echo "<div class='error'>MySQL Error 3!! GVD @#$!!!<br/>Raadpleeg een kut beheerder!!</div>"; 
											exit;
																	
										}
										
									}
									
								}
								
							}
							
						}
						
					}
					
				}
				
			}
			
		}
	
	}

	mysqli_close($conn);
	
}
?>
Dat zou best kunnen want het *is* niet voldoende, ook niet "in principe". De redenen daarvoor heb ik zojuist uitgelegd en die redenen zijn blijkbaar ook bekend bij de stackoverflow community en als ik deze reactie van jou lees dan weet jij het ook dondersgoed.

Deze stelling staat of valt met wat jij verstaat onder jouw "validatie". Als ik het heb over "input filtering" met als doel iets opslaan in een database, dan zorg ik natuurlijk dat de data ook geldig is voor dat doel. Als iets niet voldoet aan het format, ga ik niet eens een query uitvoeren.

Voorbeeld: als dit een query was waarbij je enkel gehele getallen in je database wilt zetten. Je komt niet succesvol door je filterroutine heen omdat er niet-numerieke waarden tussen zitten. Dan ben je klaar. Kom je hier wel doorheen, heb je dan escaping nodig (even los van of het verstandig is of niet)? Nee, dat is niet nodig.

Natuurlijk dienen "validatie" en "escaping" twee compleet verschillende doelen, dat bestrijd ik ook niet, maar dat is ook niet wat ik beweer.

Ik bedoel precies dit gedoe. Iemand doet een stelling en meteen rukt een leger moraalridders uit om deze neer te sabelen, zonder dat ook maar getracht wordt te doorgronden wat iemand bedoelt te zeggen.

Ik zeg nergens dat je deze aanpak (enkel filteren) moet gebruiken.
Ik predik nergens deze aanpak zelf.
Het geeft alleen aan wat het belang is van (wat je enkel met) input filtering (kunt bereiken).

Beschouw mijn stelling als troll bait.

Hook, line and sinker?

EDIT: Daarbij zie ik ook niet hoe het aantal mensen wat mij "corrigeert" er toe doet als ze allebei niet lijken te begrijpen wat ik probeer over te brengen.

als dit een query was waarbij je enkel gehele getallen in je database wilt zetten. Je komt niet succesvol door je filterroutine heen omdat er niet-numerieke waarden tussen zitten. Dan ben je klaar. Kom je hier wel doorheen, heb je dan escaping nodig (even los van of het verstandig is of niet)? Nee, dat is niet nodig.


Ah, dus "in principe" betekent "als het gaat om integers die je ook echt direct in een query zet"?

Strict genomen is dat natuurlijk waar; een waarde die niet ge-escapet hoeft te worden die hoeft niet ge-escapet worden. In de praktijk heb je niets aan die wijsheid want je hebt geen manier om te garanderen dat de waarde na de validatie niet meer zal veranderen, laat staan dat je de juiste waarden in de query zet.

Je zou de kost moeten geven aan de programmeurs die het "sommige waarden hoef je niet te escapen" idee zo letterlijk hebben genomen dat ze in hun database classes aparte validaties hebben ingebouwd om waarden te analyseren op inhoud om te zien of ze wel of niet ge-escapet hoefden te worden.


Ik bedoel precies dit gedoe. Iemand doet een stelling en meteen rukt een leger moraalridders uit om deze neer te sabelen, zonder dat ook maar getracht wordt te doorgronden wat iemand bedoelt te zeggen.

EDIT: Daarbij zie ik ook niet hoe het aantal mensen wat mij "corrigeert" er toe doet als ze allebei niet lijken te begrijpen wat ik probeer over te brengen.


Dus als twee mensen jouw "stelling" verkeerd interpreteren dan vind jij dat geen aanleiding om wat toelichting te geven? Dan gaan we nog een hoop van deze discussies hebben vrees ik. :-)
Pg Vincent op 03/11/2015 20:59:08

Je zou de kost moeten geven aan de programmeurs die het "sommige waarden hoef je niet te escapen" idee zo letterlijk hebben genomen dat ze in hun database classes aparte validaties hebben ingebouwd om waarden te analyseren op inhoud om te zien of ze wel of niet ge-escapet hoefden te worden.


Dit lijkt me meer te vallen onder de categorie onkunde.

Een goede programmeur kan zelf bepalen voor zijn/haar script of er escaping dient te worden toegepast.


Een goede programmeur kan zelf bepalen voor zijn/haar script of er escaping dient te worden toegepast.


Een goede programmeur *heeft geleerd* hoe dat moet, van andere programmeurs. Als die andere programmeurs onduidelijke, incomplete of zelfs foute adviezen geven dan leert de aankomend programmeur ook het verkeerde. Dat heeft niets te maken met kunde of onkunde van de leerling, maar met wat hem verteld is. Hij weet niet beter.


Pg Vincent op 04/11/2015 10:59:57


Een goede programmeur kan zelf bepalen voor zijn/haar script of er escaping dient te worden toegepast.


Een goede programmeur *heeft geleerd* hoe dat moet, van andere programmeurs. Als die andere programmeurs onduidelijke, incomplete of zelfs foute adviezen geven dan leert de aankomend programmeur ook het verkeerde. Dat heeft niets te maken met kunde of onkunde van de leerling, maar met wat hem verteld is. Hij weet niet beter.


Met onkunde duidde ik op: "iets niet kunnen, iets niet weten, onwetendheid".
https://nl.wiktionary.org/wiki/onkunde

Waar dit door komt is weer een heel ander verhaal.

Overigens wil ik voorstellen terug on-topic te gaan :)

Conclusie is dus:
Het is belangrijk om zowel server side als client side dergelijke problemen af te vangen.


Het nuanceverschil tussen "sommige waarden hoef je niet te escapen" en "sommige waarden hoeven in principe niet geescaped te worden" (omdat er niets te escapen valt) ontgaat je nog steeds.

Een goede programmeur *heeft geleerd* hoe dat moet, van andere programmeurs

Hier zweeft een ongeschreven "die het beter weten" achter?

Het domste wat je kunt doen is dingen klakkeloos overnemen.

Als die andere programmeurs onduidelijke, incomplete of zelfs foute adviezen geven dan leert de aankomend programmeur ook het verkeerde. Dat heeft niets te maken met kunde of onkunde van de leerling, maar met wat hem verteld is. Hij weet niet beter.

Je blijft maar hameren dat er (ik?) het verkeerde advies gegeven wordt, maar daarmee quote je alleen het deel van mijn reactie wat jou niet zint.

Vervolgens zeg ik namelijk:
Ik zou het altijd beide / allemaal doen.

Daarbij bestaat er bij mij in ieder geval geen enkel mogelijk vreselijk misverstand over wat ik bedoel waarmee ik potentieel beginnende programmeurs het verkeerde pad opstuur, waarmee trouwens meteen bewezen zou zijn dat jouw strategie funest is.

Het is de verantwoordelijkheid van de programmeur om zelf dit soort afwegingen te maken, mogelijk geholpen door meer ervaren programmeurs die zouden kunnen helpen met argumenten voor en tegen. Ik kan je wel vertellen, het helpt meer als je zelf tot een zekere overtuiging komt dan dat deze je wordt opgelegd.
Het gevaar van een welles-nietesdiscussie is dat die wordt geëxtrapoleerd tot een tegenstelling van twee tegengestelde uitersten. Daarvan is hier naar mijn smaak geen sprake. Het draait namelijk niet om de vraag óf iets moet gebeuren, maar vooral om de manier waarop:

• Het spreekt voor zich dat je input filtert en valideert. De vraag is alleen: hoe?

• Het spreekt voor zich dat je geen onveilige SQL-query uitvoert. De vraag is alleen: hoe?

Dan wordt duidelijker dat er meerdere wegen naar Rome leiden. Ervan uitgaan dat er maar één manier is om iets op te lossen, is waarschijnlijk de grootste fout die je als programmeur kunt maken. Het sluit namelijk betere, nog onbekende oplossingen bij voorbaat uit. Het beperkt je verder waarschijnlijk ook in de groei en ontwikkeling die alle goede ontwikkelaars doormaken: “Dat zou ik tegenwoordig heel anders doen...”

Toevoeging op 04/11/2015 16:30:36:

Reageren