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>


In je array_push moet je als tweede argument een element gebruiken en geen array.
Normaal gesproken post je die informatie niet (telkens opnieuw), maar bewaar je dat in $_SESSION.

Als je het toch wilt posten is een snelle manier om het hele array in 1 variabele stoppen via utf8_encode(), en achteraf decoderen met utf8_decode().

Als je het toch wilt posten en het op de uitgebreide manier wilt doen, dan moet je voor elke index in de associatieve array een input maken met als name attribuut de index in van die array, met haakjes. Bijvoorbeeld:

<input type="hidden" name="mijn_array[index][tweede_niveau]" value="waarde">

Maar dat is extra werk en ik raad het niet aan om het zo te doen.
Beste Ariën,

Het is mij helaas niet gelukt wat jij had voorgesteld. De functie array_push had ik voor die zoekmachine gebruikt, maar nadat ik enkele aanpassingen deed, zoals je had voorgesteld om als tweede argument een element te gebruiken i.p.v. een array, werkte de zoekmachine niet meer en ook de rest van het programma.

Ad kwam met een voorstel om de global variabele $_SESSION te gebruiken en ga ik mij hierin verdiepen aangezien ik weinig met deze variabele heb gedaan.



[size=xsmall]Toevoeging op 16/10/2023 16:25:47:[/size]

Beste Ad,

Dank voor je reactie. Ik ga met jouw optie aan de slag en hoop ik dat het zal lukken.

[size=xsmall]Toevoeging op 17/10/2023 09:14:53:[/size]

Hallo Ad,

Ik heb het e.e.a. aangepast, zoals je had voorgesteld, met $_SESSION (zie bestanden hieronder). Echter, wanneer ik "aantal" invul voor bijvoorbeeld alleen "Zak appels" dan worden ook de andere producten berekend, terwijl ik geen "aantal" voor die producten heb opgegeven.

En wat ik ook zie is dat wanneer ik bijvoorbeeld "if (($_SESSION['Producten'] = ["Zak appel"])&& (!empty($aantal)))" invul en ik er bijvoorbeeld "if (($_SESSION['Producten'] = ["Zak appelXXXXXXXX"])&& (!empty($aantal)))" van maak het toch "goed" gaat en dat vind ik vreemd. Ik heb bijna van alles geprobeerd, maar het lukt mij niet.

Kortom: wat doe ik niet goed? Of ligt het aan mijn $_SESSION?
VERKOOP.php

<?php
// Start the session
session_start();
?>
<!DOCTYPE html>
<html>
<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>

<?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" 		=> "Broccoli",
		"prijs" 	=> 1,
		"tags" 		=> ["diner", "eten", "voedsel"],
		"voorraad" 	=> 12
	],
	[
		"naam" 		=> "Gouden ring",
		"prijs" 	=> 500,
		"tags" 		=> ["juweel", "duur"],
		"voorraad" 	=> 0
	]
];
?>

<?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="verkoop-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					
		}				

$_SESSION['Producten'] = $product["naam"];
?>

</body>
</html>


VERKOOP-FACTUUR.php

<?php
session_start();
?>

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

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

if (($_SESSION['Producten'] = ["Zak appels"])&& (!empty($aantal))) {		
			echo "Zak appels!";
			$tebetalen = $aantal * 2;
			echo " Te betalen " . $tebetalen;	
		}
echo "<br>";
		
if (($_SESSION['Producten'] = ["Rijst"]) && (!empty($aantal))) {		
			echo "Rijst!";
			$tebetalen = $aantal * 1;
			echo " Te betalen " . $tebetalen;	
		}
echo "<br>";

if (($_SESSION['Producten'] = ["Broccoli"]) && (!empty($aantal))){		
			echo "Broccoli!";
			$tebetalen = $aantal * 1;
			echo " Te betalen " . $tebetalen;	
		}
echo "<br>";

if (($_SESSION['Producten'] = ["Gouden ring"]) && (!empty($aantal))){		
			echo "Gouden ring!";
			$tebetalen = $aantal * 1;
			echo " Te betalen " . $tebetalen;	
		}

?>
 
</body>
</html>
Steve Bonoo op 16/10/2023 16:24:07

En wat ik ook zie is dat wanneer ik bijvoorbeeld "if (($_SESSION['Producten'] = ["Zak appel"])&& (!empty($aantal)))" invul en ik er bijvoorbeeld "if (($_SESSION['Producten'] = ["Zak appelXXXXXXXX"])&& (!empty($aantal)))" van maak het toch "goed" gaat en dat vind ik vreemd. Ik heb bijna van alles geprobeerd, maar het lukt mij niet.


In een if() gebruik je dubbel == in plaats van enkel =.
In bestand VERKOOP-FACTUUR.php regels 16, 23, 30 en 37

moet worden $_SESSION['Producten'] == (dubbele == is vergelijken, enkeleis = waarde toekennen)
Beste SanThe en Adoptive Solution,

Allereerst bedankt voor jullie snelle reactie.

Ik ben het met jullie eens dat je bij een if-statement dubbele == moet gebruiken, maar doe ik dat dan krijg ik niets te zien op de pagina en alleen de kop <h1>FACTUUR</h1>.
Dan is er blijkbaar niets.
Doe eens een vardump op de variabelen.
Hoi SanThe,

Ik heb een vardump op de volgende variabelen gedaan:

echo var_dump ($aantal);
echo "<br>";
echo var_dump($_SESSION['Producten']);
echo "<br>";
echo var_dump($tebetalen);

Als output kreeg ik:

string(2) "30"
string(11) "Gouden ring"
int(0)

Ik zie dat wanneer ik voor "Zak appels" kies, ik "Gouden ring" zie staan en dit klopt niet. En wanneer ik voor aantal 30 invul ik bij $tebetalen int(0) zie staan en had ik 60 verwacht( 30*2=60). Volgens mij klopt dit ook niet en ik zou niet weten waaraan het ligt.
Steve Bonoo op 16/10/2023 16:24:07


<?php
// Start the session
session_start();
....
$producten = [
	[
		"naam" 		=> "Zak appels",
		"prijs" 	=> 2,
		"tags" 		=> ["appel", "fruit", "eten", "voedsel"],
		"voorraad" 	=> 50,
		
	],
	[
		"naam" 		=> "Rijst",
		"prijs" 	=> 1,
		"tags" 		=> ["diner", "eten", "voedsel"],
		"voorraad" 	=> 3
	],
	[
		"naam" 		=> "Broccoli",
		"prijs" 	=> 1,
		"tags" 		=> ["diner", "eten", "voedsel"],
		"voorraad" 	=> 12
	],
	[
		"naam" 		=> "Gouden ring",
		"prijs" 	=> 500,
		"tags" 		=> ["juweel", "duur"],
		"voorraad" 	=> 0
	]
];
		foreach($producten as $product) {
			........		
		}				

$_SESSION['Producten'] = $product["naam"];
?>



Je vult $_SESSION['Producten'] na de foreach() dus daar zal altijd de laatste ("Gouden ring") in zitten.


[size=xsmall]Toevoeging op 17/10/2023 14:24:31:[/size]

Beetje zitten spelen.

<!DOCTYPE html>
<html>
<head>
<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>

<form action="verkoop-factuur.php" method="post">
<?php
include("data.php");
foreach($producten as $key => $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>
            Aantal <input type="number" style="width:50px" name="aantal[<?php echo $key; ?>]" min="0" max="<?php echo $voorraad; ?>" value="0">
				   <input type="hidden" name="naam[<?php echo $key; ?>]" value="<?php echo $product["naam"]; ?>">
			<?php                                            
				if ($product["voorraad"] > 0) {
					echo '<button type="submit">Koop nu</button>';
				} else {
					echo '<button disabled>Niet beschikbaar</button>';
				}                                    
			?>                                        
		</div>
	</section>        
<?php }                
?>
</form>                         
</body>
</html> 


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

<?php
include("data.php");

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
	$aantal = $_POST["aantal"];
	$naam = $_POST["naam"];
	$totaal = 0;
	foreach($producten as $key => $product)
	{
		$tebetalen = 0;
		if ($product["naam"] == $naam[$key] && !empty($aantal[$key]))
		{        
			echo $product["naam"];
			$tebetalen = $aantal[$key] * $product["prijs"];
			echo " Te betalen " . $tebetalen;    
			echo "<br>";
		}
		$totaal += $tebetalen;
	}
	echo "<hr>Totaal " . $totaal;
}
else echo "Er is geen factuur.";
?>
</body>
</html> 


data.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"         => "Broccoli",
        "prijs"     => 1,
        "tags"         => ["diner", "eten", "voedsel"],
        "voorraad"     => 12
    ],
    [
        "naam"         => "Gouden ring",
        "prijs"     => 500,
        "tags"         => ["juweel", "duur"],
        "voorraad"     => 0
    ]
];
?>
Geen idee wat je aan het doen bent met die haakjes en blokhaken, maar dit

if (($_SESSION['Producten'] = ["Zak appels"])&& (!empty($aantal))) {

hoort dus zo:

if ($_SESSION['Producten'] === 'Zak appels' && !empty($aantal)) {

Geldt uiteraard ook voor de andere regels.

Reageren