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>


Hi -SanThe-,

Bedankt voor de goede tip en kan ik hiermee gericht te werk gaan.
Aantal <input type="number" style="width:50px" name="aantal[<?php echo $key; ?>]" min="0" max="<?php echo $voorraad; ?>" value="0">

Uit een van mijn vorige posts.
Hier kan je dus niet meer dan de voorraad kopen.
- SanThe - op 29/10/2023 13:39:26

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



- SanThe - op 29/10/2023 15:33:33

Aantal <input type="number" style="width:50px" name="aantal[<?php echo $key; ?>]" min="0" max="<?php echo $voorraad; ?>" value="0">

Uit een van mijn vorige posts.
Hier kan je dus niet meer dan de voorraad kopen.


Dit klopt natuurlijk ook niet.. ook deze input (max) kan aangepast worden.


Ja maar dat check jij zelf toch na de post.
En als de bezoeker dat doet dan weet ie bij voorbaat dat dat zinloos is.

Aantal <input type="number" style="width:50px" name="aantal[<?php echo $key; ?>]" min="0" max="<?php echo $voorraad; ?>" value="0">


Hi -SanThe-,

Dat klopt dat je mij in jouw vorige posts bovenstaande code had gestuurd en waarbij het maximaal op te geven aantallen opgevangen wordt met min en max. Deze code ga ik hergebruiken. Ik vergeet soms de goede tips van jou en van A Vh van jullie vorige posts, doordat ik mij helemaal focus op het "nu".

Beste E vH en -SanThe-,

Ik heb er dit van gemaakt. De aantallen en berekeningen kloppen allemaal. Echter lukt het mij niet dat, wanneer "aantal" 0 is, ik niets wil zien van het artikel en het tegenstrijdig is dat er staat "Het gekozen artikel is (bijvoorbeeld) Beeldscherm, etc.. Verder heb ik bij regel 7 in het bestand "prijs-factuurV4.php" een error-afhandeling gedaan om bij uitvoer van het programma niet van die irritante notities te zien, wanneer "aantal" 0 is.

prijsberekenenV4.php

<html>
<head>
    <title>Aankopen</title>
</head>
<body style="background-color:lightgrey;">

<?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-factuurV4.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" > -->
	Aantal <input type="number" style="width:50px" name="aantal[<?php echo $key; ?>]" min="0" max="<?php echo $voorraad; ?>" value="0">	
	<button>Bereken</button>	
	</div>
</section>	
<?php
}
?>
</form>
</body>
</html>



prijs-factuurV4.php

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

<?php error_reporting (E_ALL ^ E_NOTICE);

$aantal = $_POST["aantal"];
$somTotaal = 0;

$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
			] 
];
$array_met_aantallen = array_filter($aantal);

foreach($artikelen as $key => $artikel){	
	echo " Het gekozen artikel is : " . $artikel["artikel"];
	echo "<br>";
	echo "De prijs van het artikel " . $artikel["artikel"] . " is " . $artikel["prijs"];
	echo "<br>";
	
	if ($artikel["voorraad"] >= $array_met_aantallen[$key]) {
		echo "Aantal is: " . $array_met_aantallen[$key];
		echo "<br>";
		echo "Te betalen voor " . $artikel["artikel"] . " " . $array_met_aantallen[$key]*$artikel["prijs"] . " euro";
		echo "<br><br>";
		$somTotaal += ($array_met_aantallen[$key]*$artikel["prijs"]);
	}
	else {
		echo "Er is niet genoeg in voorraad van het product " . $artikel["artikel"];
		echo "<br><br>";
	}	
}
echo "<br>";
echo "<b>Het totaal te betalen bedrag is " . $somTotaal . " euro</b>";
?>

</body>
</html>
prijsberekenenV4.php, regel 74:
$voorraad veranderen naar $product["voorraad"], $voorraad bestaat namelijk niet en is dus leeg.


prijs-factuurV4.php
op regel 54 doe je deze vergelijking:
if ($artikel["voorraad"] >= $array_met_aantallen[$key]) { 


Wat je nu doet is een INTEGER vergelijken met een STRING. $array_met_aantallen[$key] kun je integer maken door de code aan te passen naar:
if ($artikel["voorraad"] >= (int)$array_met_aantallen[$key]) { 


Regel 55: idem, maak er een integer van, je zal merken dat een waarde die "leeg" ( dus niet opgegeven ).. nu een cijfer 0 weergeeft.. ipv alleen Aantal is: ...(leeg)...

Om terug te komen op je vraagstelling: "Echter lukt het mij niet dat, wanneer "aantal" 0 is, ik niets wil zien van het artikel"

Geef dan een extra conditie aan je if op regel 54:
if ($artikel["voorraad"] >= (int)$array_met_aantallen[$key] && (int)$array_met_aantallen[$key] != 0) {


Met een beetje rommelen.. zal je nu een stapje verder komen, wederom succes! :-)


Beste E vH,

Keer op keer motiveer je mij. Ik ben erg blij met jouw bevindingen en adviezen en ga ik hiermee, zoals je dat zegt om een beetje te rommelen, aan de slag. Dank je wel.

[size=xsmall]Toevoeging op 01/11/2023 20:55:35:[/size]

Beste E vH,

Ik heb de aanpassingen die je had voorgesteld, gedaan. Vervolgens heb ik regel 64 vervangen door regel 65, t.w. "leeg" (echo " ";), omdat je toch niet meer kan kiezen dan er in voorraad is van een artikel (max). Ook laat regel 65, indien "aantal" 0 is, niets zien van dat artikel en dat is zoals je in een eerdere post had gezegd dat het niet interessant is om nog informatie te zien als er niets wordt gekocht.

Ook heb ik dus regel 49 t/m 52 geplaatst in de if-lus bij regel 52 in de nieuwe situatie. Zie hieronder de nieuwe situatie. Ik ga hiermee verder en ga ik dit programma koppelen aan een database (in PHPMyAdmin, DirectAdmin) en is de cirkel af en kan ik mijn lesplannen voor zowel mijn havo als vwo-leerlingen gaan schrijven.

E vH bedankt voor alles en heb ik veel van je geleerd. De basiscursus PHP die ik heb gevolgd gaf mij geen voldoening en uitdagingen meer en daarom wilde ik verder gaan en o.a. dank zij jou heb ik mijn kennis kunnen uitbreiden. Ook weet ik dat ik er nog niet ben, omdat er nog veel te leren is, maar ik heb in elk geval een begin gemaakt. Nogmaals bedankt voor je support. Als ik in de toekomst weer tegen iets aanloop dan zal ik je weer benaderen :)

prijsberekenenV4.php


<html>
<head>
    <title>Aankopen</title>
</head>
<body style="background-color:lightgrey;">

<?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-factuurV4.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" > -->
	<!-- Aantal <input type="number" style="width:50px" name="aantal[<?php echo $key; ?>]" min="0" max="<?php echo $voorraad; ?>" value="0">-->
	Aantal <input type="number" style="width:50px" name="aantal[<?php echo $key; ?>]" min="0" max="<?php echo $product["voorraad"]; ?>" value="0">

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



prijs-factuurV4.php


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

<?php error_reporting (E_ALL ^ E_NOTICE);

$aantal = $_POST["aantal"];
$somTotaal = 0;

$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
			] 
];
$array_met_aantallen = array_filter($aantal);

foreach($artikelen as $key => $artikel){	
	
	
//if ($artikel["voorraad"] >= (int)$array_met_aantallen[$key]) {
	if ($artikel["voorraad"] >= (int)$array_met_aantallen[$key] && (int)$array_met_aantallen[$key] != 0) {
			echo " Het gekozen artikel is : " . $artikel["artikel"];
			echo "<br>";
			echo "De prijs van het artikel " . $artikel["artikel"] . " is " . $artikel["prijs"];
			echo "<br>";
			echo "Aantal is: " . (int)$array_met_aantallen[$key];
			echo "<br>";
			echo "Te betalen voor " . $artikel["artikel"] . " " . $array_met_aantallen[$key]*$artikel["prijs"] . " euro";
			echo "<br><br>";
			$somTotaal += ($array_met_aantallen[$key]*$artikel["prijs"]);
	}
	else {
		//echo "Er is niet genoeg in voorraad van het product " . $artikel["artikel"];
		echo " ";
		echo "<br><br>";
	}	
}
echo "<br>";
echo "<b>Het totaal te betalen bedrag is " . $somTotaal . " euro</b>";
?>

</body>
</html>

Reageren