Beste allemaal,
Wie zou mij kunnen helpen met mijn programma? Ik heb een zoekmachine gebouwd en heb ik hiervoor een associative array gebruikt en dat werkt prima (producten.php). De zoektermen heb ik vastgelegd in $producten["tags"], zie het programma hieronder wat ik heb geschreven.

Echter, wanneer ik "Aantal" invul en op de knop "Koop nu" klik krijg ik deze foutmelding in het bestand "factuur.php": Notice: Undefined variable: product.

Kortom: het lukt mij niet om de varaiabelen c.q. de elementen te posten van producten.php naar factuur.php. Hieronder de codes van beide bestanden.

Groeten,
Steve

producten.php:

<?php
$producten = [
	[
		"naam" 		=> "Zak appels",
		"prijs" 	=> 2,
		"tags" 		=> ["appel", "fruit", "eten", "voedsel"],
		"voorraad" 	=> 50,
		
	],
	[
		"naam" 		=> "Rijst",
		"prijs" 	=> 1,
		"tags" 		=> ["diner", "eten", "voedsel"],
		"voorraad" 	=> 3
	],
	[
		"naam" 		=> "Gouden ring",
		"prijs" 	=> 500,
		"tags" 		=> ["juweel", "duur"],
		"voorraad" 	=> 0
	],
	[
		"naam" 		=> "Broccoli",
		"prijs" 	=> 1,
		"tags" 		=> ["diner", "eten", "voedsel"],
		"voorraad" 	=> 12
	]
];
if (isset($_POST["zoekopdracht"])) { 
	$filter = $_POST["zoekopdracht"]; 

	$kandidaat_producten = $producten;
	$producten = [];

	foreach($kandidaat_producten as $product) {
		foreach($product["tags"] as $tag){
			if ($tag == $filter) {
				array_push($producten, $product); // voeg dat ene product $product aan de lijst $producten
				}
			}
		}
}

?>

<!DOCTYPE HTML>
<html lang="nl">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>

<meta charset="utf-8">

<title>Producten</title>

<style type="text/css">	
			section {
				border: 1px solid black;
				width: 400px;
				height: 180px;
				background-color: lightblue;
				margin:25px;
            }
</style> 
</head>	

<body style="background-color:lightgreen">
	<section>
		<div>
			<h1>Steve's webshop</h1> 
			<form action="producten.php" method="POST">
				<input type="text" name="zoekopdracht">
				<input type="submit" value="search">				
			</form>
		</div>
		<div>
			<p> Koop hier je producten</p>
		</div>
	</section>


	<?php
		foreach($producten as $product) {
			?>
				<section>
					<div>
						<h2>
							<?php
								echo $product["naam"];									
							?>
						</h2>
						<small>Voorraad:
							<?php
								$voorraad = $product["voorraad"];
								
								if($voorraad == 0) {
									echo "leeg";
								} elseif ($voorraad <= 10) {
									echo "bijna op!";
								} else {
									echo "genoeg";
								}
							?>
						</small>
					</div>
					<div>
						<h2>
							<?php
								echo $product["prijs"] . " euro";
							?>
						</h2>
												
						<form action="factuur.php " method="post">
							Aantal <input type="text" name="aantal" size="5">
										<?php											
											if ($product["voorraad"] > 0) {
												echo "<button>Koop nu</button>";
											} else {
												echo "<button disabled>Niet beschikbaar</button>";
											}									
										?>										
						</form> 						
					</div>							
				</section>		
	<?php					
		}				
	?>	
</body>	
</html> 




factuur.php:
<!DOCTYPE html>
<html>
<head>
    <title>Factuur</title>
</head>
<body style="background-color:pink">
<h1>FACTUUR</h1>

<?php
$aantal = $_POST["aantal"];

if (($product["naam"] == "Zak appels")) {		
			echo "Zak appels!";
			$tebetalen = $aantal * 2;
			echo "Te betalen " . $tebetalen;	
		}
		if (($product["naam"] == "Rijst")) {
			echo "Rijst!";
			$tebetalen = $aantal * 1;
			echo "Te betalen " . $tebetalen;	
		}
		if (($product["naam"] == "Broccoli")) {		
			echo "Broccoli!";
			$tebetalen = $aantal * 1;
			echo "Te betalen " . $tebetalen;	
		}
	
?>
    
</body>
</html>


Beste E vH en -SanThe-,

Dank je wel voor jullie feedback. Ik ga met jullie opmerkingen aan de slag.

E vH ... ik ben het met je eens. Ik ben bewust niet consequent geweest en is misschien ook slordig, omdat ik met de vorige feedback van jullie alles opnieuw wilde bouwen en/of met een schone lei wilde beginnen om zodoende mijn hoofd leeg te maken en denk ik ook dat ik hier in de fout ben gegaan dat ik niet in de gaten had dat ik met meerdere forms ging werken en dat dit niet bewust mijn bedoeling was geweest, maar inderdaad zoals je zegt om met 1 form te werken. Tot zo ver zie ik dat ik 1 form heb gemaakt (regel 66:
<form action="prijs-factuur.php" method="post">
) , maar ik zal voor mezelf beter nagaan of ik meerdere forms heb gemaakt.

En ja, bij mij is het een kwestie van oefenen, de logica snappen, maar ook bovenal wil ik iets bouwen die ik wil gebruiken voor mijn HAVO leerlingen. Ik heb niet echt een programmeer-achtergrond en heb ik daarom een basiscursus PHP gevolgd en met succes afgerond en wil ik mij meer verdiepen in PHP. Onder andere zoekmachines bouwen, werken met associative arrays, etc. zijn onderwerpen die helaas niet ter sprake zijn gekomen op de cursus. En daarom ben ik ook blij met jullie steun.

Maar goed ... ik ga aan de slag en ga ik eerst proberen te achterhalen waar ik meerdere forms aan het gebruiken ben (omdat ik met een snelle orientatie dat nog steeds niet zie) en denk ik dat dit o.a. het probleem is van alles.
Het klopt inderdaad dat je hem er maar 1 x fysiek in hebt staan, maar door de (herhaal)lus op de genoemde regels in mijn vorige post ontstaat er nu zoiets:

<form>
...product 1..
</form>
<form>
...product 2..
</form>
<form>
...product 3..
</form>
dus is het zaak om de <form> tag voor je foreach-lus te plaatsen,
en de </form> tag erna.

Daarmee komen al je elementen in 1 groot form terecht
Beste E vH en -SanThe-,

Het is eindelijk gelukt. Ik heb de form aangepast. Het programma werkt goed en ook de aantallen die groter zijn dan 0 worden alleen uitgevoerd, zodat je geen regels krijgt met 0 aankopen, omdat dat niet interessant is en E Vh ben ik het hiermee volkomen met je eens; ik had wat jij had voorgesteld ook uitgevoerd en ging het om de code:
$array_met_aantallen = array_filter($aantal);
.

E vH en -SanThe-, ik wil jullie ontzettend veel bedanken voor jullie support, adviezen, toelichtingen en alles wat nog te maken had met de obstakels die ik tegenkwam. Voor mij is het een leerproces geweest met af en toe wat stress, maar als ik terugkijk dan was het toch de moeite waard en ik een voldaan gevoel hiervan overgehouden.

ps: Ivo P ook bedankt voor je toelichting.
Hi Steve,

Leuk om te zien dat je verder bent gekomen, maar je bent er nog niet.

In je array maak je gebruik van een voorraad waarde, laten we zeggen: 10 stuks voor product X
Try it: bestel er eens 20 ;-), als je een "demo" wilt laten zien.. bouw dat er ook nog in ( of bewust niet en licht het toe).

Ik denk dat je er dan in de regel wel bent... althans qua logica. Onthoud wel dat prijzen, maar ook de productnamen gemanipuleerd kunnen worden in je form en dat hier dus geen verificatie nu in zit. Dit zou je eventueel kunnen oplossen door alleen de betreffende KEY van het product mee te sturen in je form ( hidden field ), en dan met die KEY loop je weer door je array producten heen. Je kan dan zowel de productnaam, als de prijs en voorraad opvragen. Ik zal verder niet inhaken op voorraad aantallen afschrijven na bestellen, ik neem aan dat het voor dit doel niet belangrijk is.

Verder goed bezig! Uit nieuwsgierigheid: wat is eigenlijk het doel voor de leerlingen?
Hallo E vH,

Je hebt groot gelijk. Ik heb helemaal niet eraan gedacht dat wanneer mijn voorraad 20 is voor het product Muis, ik inderdaad niet meer dan 20 kan verkopen en mijn programma berekent toch het bedrag bij een aantal meer dan 20. Dit is dus niet goed. Weer een leuke uitdaging en ga ik hiermee aan de slag.

Het les- of einddoel van de leerlingen is dat ze een programma moeten schrijven voor een handelsonderneming en gebruikmakend van een associative array. Uiteraard kan het ook zonder een associative array, maar ik heb deze keuze gemaakt. De koper moet het aantal opgeven en moet het te betalen bedrag te zien zijn.

Maar nu weet ik dat ik de voorraad moet afhandelen en zoals eerder vermeld ga ik hiermee aan de slag. Bedankt voor de opmerking.
Beste E Vh,

Het is mij gelukt dat wanneer de aantallen groter zijn dan de voorraad, je uiteraard niet kan verkopen en dat is logisch. Je kan niet meer uitgeven dan wat je in je portemonnee hebt, zeg maar! Ik stuur je de code van beide bestanden en kan je zien hoe ik dat heb opgelost en misschien heb je nog suggesties. De twee bestanden zijn prijsberekenenV3.php (het startprogramma) en prijs-factuurV3.php

prijsberekenenV3.php (het startprogramma)

<html>
<head>
    <title>Formulier</title>
</head>
<body style="background-color:lightgreen;">

<?php

$artikelen = [
			[
				"firstname"		=> "John",
				"lastname"   	=> "Doelaar",
				"middlename" 	=> "Bray",
				"artikel"		=> "Muis",
				"prijs"			=> 5,
				"voorraad" 		=> 50,
			],
			[
				"firstname"  	=> "Steve",
				"lastname"  	=> "Bonoo",
				"middlename" 	=> "Suniel",
				"artikel"		=> "Toetsenbord",
				"prijs"			=> 3,
				"voorraad" 		=> 10
			],
			[
				"firstname"  	=> "Carla",
				"lastname"   	=> "Zonneveld",
				"middlename" 	=> "Judy",
				"artikel"		=> "USB-kabel",
				"prijs"			=> 2,
				"voorraad" 		=> 8
			],
			[
				"firstname"  	=> "Hugo",
				"lastname"   	=> "Kerkraad",
				"middlename" 	=> "Jos",
				"artikel"		=> "Beeldscherm",
				"prijs"			=> 25,
				"voorraad" 		=> 4
			] 
];
?>
<form action="prijs-factuurV3.php" method="post">

<?php
foreach ($artikelen as $key => $product) {
?>

<section>
	<div>
	<h2>
		<?php
		echo "<b>Achternaam: </b>" . $product["lastname"];
		?>
	</h2>				
	</div>
	<div>
		<?php
		echo "<b>Artikel: </b>" . $product["artikel"];
		?>		
	</div>
	<div>
		<?php
		echo "Prijs p/st " . $product["prijs"] . " euro";
		?>		
	</div>
		<?php
		echo "Voorraad " . $product["voorraad"];
		?>	
	<div>	
	Geef aantal op
	<input type="text" name="aantal[<?php echo $key;?>]" "[<?php echo $product['artikel']?>]" size="5" > 
	<!--<input type="text" name="aantal[<?php echo $key;?>]" "[<?php echo $key['artikel']?>]" size="5" > -->
	
	<input type="hidden" name="voorraad[<?php echo $key;?>]" value="<?php echo $product['voorraad'];?>" >	

	<input type="hidden" name="prijs[<?php echo $key;?>]" value="<?php echo $product['prijs'];?>" > 
	<!--<input type="hidden" name="prijs[<?php echo $key;?>]" > -->
	
	<input type="hidden" name="artikelnaam[<?php echo $key;?>]" value="<?php echo $product['artikel'];?>" >	
	<!--<input type="hidden" name="artikelnaam[<?php echo $key;?>]"  >	-->
	
	
	<input type="hidden" name="achternaam[<?php echo $key;?>]" value="<?php echo $product['lastname'];?>" >

	<button>Bereken</button>	
	</div>
</section>	
<?php
}
?>
</form>
</body>
</html>



prijs-factuurV3.php

<!DOCTYPE html>
<html>
<head>
    <title>Factuur</title>
</head>
<body style="background-color:pink">
<h1>FACTUUR</h1>

<?php
$aantal = $_POST["aantal"];
$prijs = $_POST["prijs"];
$artikelnaam = $_POST["artikelnaam"];
$voorraad = $_POST["voorraad"];

$array_met_voorraad = array_filter($voorraad);
$array_met_aantallen = array_filter($aantal);

$somTotaal = 0;

foreach($array_met_aantallen as $key => $value){	
	if ($array_met_aantallen[$key] <= $array_met_voorraad[$key]) {
	//$prijs[0] = 10;	dit is indien ik de prijs van Muis wil wijzigen van 5 naar 10 euro.
	echo ''.$value.' stuks van product: '. $artikelnaam[$key].'. Te betalen: &euro; '.($array_met_aantallen[$key]*$prijs[$key]);			
	
	$array_met_voorraad[$key] -=  $array_met_aantallen[$key];
	echo "<br>";
	echo "Nog in voorraad ". $artikelnaam[$key]. " " . $array_met_voorraad[$key];
	echo "<br><br>";
		
$somTotaal += ($array_met_aantallen[$key]*$prijs[$key]);
	}
	else {  
		echo "Voorraad is niet genoeg van product " . $artikelnaam[$key];
		echo "<br><br>";
	}
}
echo "<b>Het totaal te betalen bedrag is " . $somTotaal . " euro</b>";

?>

</body>
</html>

Niet slim om de voorraad, artikelnaam en prijs uit het formulier te halen.
Dat kan de bezoeker aanpassen.
Hoi -SanThe-,

Bedankt voor je reactie.
E vH had in zijn vorige/laatste post het erover dat o.a. de prijs en de voorraad gemanipuleerd zou kunnen worden en dat ik in de form alleen de KEY met een "hidden" veld zou kunnen gebruiken. Ik heb het gedaan, maar ik heb alles teruggedraaid omdat alles (lees: de output van het programma) op zijn kop ging. Ik zal vastwel het e.e.a. niet goed hebben gedaan in de codes. in het startprogramma, t.w. prijsberekenenV3.php, zal je zien wat ik o.a. zou wijzigen en van die codes heb ik "commentaar" gemaakt. Van die foreach-loop had ik ook dit gedaan:

<?php
foreach ($artikelen as $key => $product) {
?>

<section>
	<div>
	<h2>
		<?php
		echo "<b>Achternaam: </b>" . $key["lastname"];
		?>
	</h2>				
	</div>
	<div>
		<?php
		echo "<b>Artikel: </b>" . $key["artikel"];
		?>		
	</div>
	<div>
		<?php
		echo "Prijs p/st " . $key["prijs"] . " euro";
		?>		
	</div>
		<?php
		echo "Voorraad " . $key["voorraad"];
		?>	
	<div>	
	Geef aantal op
	<input type="text" name="aantal[<?php echo $key;?>]" "[<?php echo $product['artikel']?>]" size="5" > 
	<!--<input type="text" name="aantal[<?php echo $key;?>]" "[<?php echo $key['artikel']?>]" size="5" > -->
	
	<input type="hidden" name="voorraad[<?php echo $key;?>]" value="<?php echo $product['voorraad'];?>" >	

	<input type="hidden" name="prijs[<?php echo $key;?>]" value="<?php echo $product['prijs'];?>" > 
	<!--<input type="hidden" name="prijs[<?php echo $key;?>]" > -->
	
	<input type="hidden" name="artikelnaam[<?php echo $key;?>]" value="<?php echo $product['artikel'];?>" >	
	<!--<input type="hidden" name="artikelnaam[<?php echo $key;?>]"  >	-->
	
	
	<input type="hidden" name="achternaam[<?php echo $key;?>]" value="<?php echo $product['lastname'];?>" >

	<button>Bereken</button>	
	</div>
</section>


Ik ga het nog nakijken.
In het formulier heb je alleen dit nodig:

<input type="number" name="aantal[<?php echo $key;?>]">

En na het posten doorloop je $_POST['aantal' als key => waarde.
De key is dan het productnummer en de waarde het aantal.

Reageren