Hoi,

Ik ben bezig met een webshop voor iemand. Een winkelwagen is hetgeen waar ik niet helemaal uitkom. En dan bedoel ik alleen het deel voor het updaten van het aantal. Ik heb een vakje en een knop voor het 'submitten' van het aantal wat je wilt veranderen. 2D array ziet er zo uit:

<?php
$itemArray = array($productByID[0]["ID"] => array (
'Naam' => $productByID[0]["Naam"],
'Prijs_nieuw' => $productByID[0]["Prijs_nieuw"],
'Aantal' => 1,
'ProductID' => $productByID[0]["ID"],
'Afbeelding' => 'images/Producten/'.$productByID[0]["ID"].'_0.png',
'Afmetingen' => $productByID[0]["Lengte"]. ' x ' .$productByID[0]["Breedte"]. ' x ' .$productByID[0]["Hoogte"] . ' CM',
'Kleuren' => $productByID[0]["Kleuren"],
));
?>

In het overzicht heb ik een form gemaakt waarin het aantal aan te passen is:

<?php
<form method="POST" action="Winkelwagen.php" name="update_aantal">
<input type="image" name="submit_aantal" src="images/Update.png"/>
<input type="text" name="Aantal" value="<?php echo $item['Aantal']?>" size="3" max="99" required><a href='winkelwagen.php?action=remove&id=<?php echo $item["ProductID"]; ?>'><img src='Images/Delete.png'/></a>
<input type="hidden" name="ProductID" value="<?= $item['ProductID']; ?>">
</form>
?>

En zodra je dus op het knopje "update" klikt, de submit knop, dan heb ik laten doorverwijzen naar een fuctie:

<?php
function Update_cart()
{
echo "Hoi";
$prod_id = $_POST["ProductID"];
foreach ($_SESSION["cart_item"] as $prod_id => $v)
{
if ($productByID[0]["ID"] == $prod_id)
{
$_SESSION["cart_item"][$prod_id]["Aantal"] = $_POST["Aantal"];
}
}
}
if(isset($_POST['update_aantal']))
{
Update_cart();
}
?>

<?php
print_r($_SESSION["cart_item"]):


Array
(
[0] => Array
(
[Naam] => Productnaam_6
[Prijs_nieuw] => 2.00
[Aantal] => 4
[ProductID] => 6
[Afbeelding] => images/Producten/6_0.png
[Afmetingen] => 9.99 x 9.99 x 9.99 CM
[Kleuren] => Grijs
)
)
?>

Ik wil dus de diktedrukte aantallen aanpassen dmv de functie. maar de functie word niet aangeroepen (hoi komt niet in beeld) plus de update werkt ook niet. Wat doe ik verkeerd?

Je overschrijft $prod_id :p.

Daarnaast, waarom zou je al die zooi in je sessie zetten?

Meer dan $_SESSION['cart'][<product id>] = <aantal> heb je toch niet nodig (specifieke productconfiguraties et cetera en -aanpassingen daargelaten)?

De rest trek je uit je database bij weergave.

Ook hoop ik eigenlijk dat je direct een refresh doet, of dat je je cart via een AJAX-call update (zowel sessie als op het scherm) want een update van je cart is een state change. Ook wil je niet blijven hangen op een pagina waarin je een POST request verwerkt, dat vertieft je navigatie. Doe na een POST altijd op een of andere manier een refresh, of doe de POST op de achtergrond via AJAX.

NB ik zou ook één stijl aanhouden voor het weergeven van PHP-waarden. Waarbij <?php echo ... ?> waarschijnlijk de voorkeur verdient. Daarbij loont het ook de moeite om alle output te escapen die je weergeeft.
Thomas van den Heuvel op 09/11/2019 16:31:45

Je overschrijft $prod_id :p.

Daarnaast, waarom zou je al die zooi in je sessie zetten?

Meer dan $_SESSION['cart'][<product id>] = <aantal> heb je toch niet nodig (specifieke productconfiguraties et cetera en -aanpassingen daargelaten)?

De rest trek je uit je database bij weergave.

Ook hoop ik eigenlijk dat je direct een refresh doet, of dat je je cart via een AJAX-call update (zowel sessie als op het scherm) want een update van je cart is een state change. Ook wil je niet blijven hangen op een pagina waarin je een POST request verwerkt, dat vertieft je navigatie. Doe na een POST altijd op een of andere manier een refresh, of doe de POST op de achtergrond via AJAX.

NB ik zou ook één stijl aanhouden voor het weergeven van PHP-waarden. Waarbij <?php echo ... ?> waarschijnlijk de voorkeur verdient. Daarbij loont het ook de moeite om alle output te escapen die je weergeeft.


Dat tweede klinkt erg interessant. Is iets om later is te bekijken, maar ik wil het eerst zo is werkend krijgen. Maakt op zich niet uit wat ik zou vervangen, er word niks geüpdatet in de array. Wat ik er ook neer zet. Dat vind ik zo raar.
Je test op de naam van het FORM.

$_POST['update_aantal']

Maar die wordt niet meegestuurd.

Je moet testen op de naam van een input.
Donovan - op 09/11/2019 18:53:17
Dat tweede klinkt erg interessant. Is iets om later is te bekijken, maar ik wil het eerst zo is werkend krijgen.

Het escapen betreft security, iets dat tijdens het ontwerp en het bouwen een prominente rol zou moeten spelen. Dit is niet een soort van suikerlaag die je over de uiteindelijke taart strooit, maar zou in alle stages en facetten van je applicatie opgenomen moeten worden.

Donovan - op 09/11/2019 18:53:17
Maakt op zich niet uit wat ik zou vervangen, er word niks geüpdatet in de array. Wat ik er ook neer zet. Dat vind ik zo raar.

Heb je gezien wat ik aangaf? Je overschrijft $prod_id.
<?php
function Update_cart() {
    $prod_id = $_POST["ProductID"]; // hier gebruik je $prod_id
    foreach ($_SESSION["cart_item"] as $prod_id => $v) { // hier overschrijf je $prod_id
        if ($productByID[0]["ID"] == $prod_id) {
            $_SESSION["cart_item"][$prod_id]["Aantal"] = $_POST["Aantal"];
        }
    }
}
?>

Gooi die "Hoi" eruit, mogelijk doet dat iets met je sessies (voorkomt schrijven of wat dan ook).

Het heeft geen zin om naar een situatie te kijken waarvan je weet dat deze niet klopt (zie $prod_id). Los dit eerst allemaal op en kijk of dan de problemen nog spelen.

Controleer vervolgens hoe dat lijstje wordt opgebouwd. Gebruik je ook echt waarden uit $_SESSION en staat overal waar je een sessie gebruikt ook session_start()?

En wat @Adoptive zei: het feit dat je geen "Hoi" zag en dat er niets werd bijgewerkt was daar eigenlijk al een indicatie van - de functie werd nooit aangeroepen omdat de conditie in het if-statement niet voldeed.

Je moet testen op de naam van een input.

Actually, je zou moeten controleren of er iets gePOST wordt middels:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // ...
}
?>
Thomas van den Heuvel op 09/11/2019 19:08:46

[quote="Donovan - op 09/11/2019 18:53:17"]Dat tweede klinkt erg interessant. Is iets om later is te bekijken, maar ik wil het eerst zo is werkend krijgen.

Het escapen betreft security, iets dat tijdens het ontwerp en het bouwen een prominente rol zou moeten spelen. Dit is niet een soort van suikerlaag die je over de uiteindelijke taart strooit, maar zou in alle stages en facetten van je applicatie opgenomen moeten worden.

Donovan - op 09/11/2019 18:53:17
Maakt op zich niet uit wat ik zou vervangen, er word niks geüpdatet in de array. Wat ik er ook neer zet. Dat vind ik zo raar.

Heb je gezien wat ik aangaf? Je overschrijft $prod_id.



<?php
function Update_cart() {
    $prod_id = $_POST["ProductID"]; // hier gebruik je $prod_id
    foreach ($_SESSION["cart_item"] as $prod_id => $v) { // hier overschrijf je $prod_id
        if ($productByID[0]["ID"] == $prod_id) {
            $_SESSION["cart_item"][$prod_id]["Aantal"] = $_POST["Aantal"];
        }
    }
}
?>

Gooi die "Hoi" eruit, mogelijk doet dat iets met je sessies (voorkomt schrijven of wat dan ook).

Het heeft geen zin om naar een situatie te kijken waarvan je weet dat deze niet klopt (zie $prod_id). Los dit eerst allemaal op en kijk of dan de problemen nog spelen.

Controleer vervolgens hoe dat lijstje wordt opgebouwd. Gebruik je ook echt waarden uit $_SESSION en staat overal waar je een sessie gebruikt ook session_start()?

En wat @Adoptive zei: het feit dat je geen "Hoi" zag en dat er niets werd bijgewerkt was daar eigenlijk al een indicatie van - de functie werd nooit aangeroepen omdat de conditie in het if-statement niet voldeed.

Je moet testen op de naam van een input.

Actually, je zou moeten controleren of er iets gePOST wordt middels:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // ...
}
?>

[/quote]

Genoeg stof tot nadenken. Ik ga er morgen mee aan de slag. Thanks for the input!
Je hoeft overigens niet het hele vorige bericht elke keer te quoten tenzij hier relevante dingen in staan waar je het verder over wilt hebben.

<?php
if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['Aantal'])) ) 
{
	$prod_id = $_POST["ProductID"];
	foreach ($_SESSION["cart_item"] as $item) 
	{
		if ($item["ProductID"] == $_POST["ProductID"]) 
		{
			$item["Aantal"] = $_POST["Aantal"];
		}
	}
}
?>


Dit is wat ik er nu van heb gemaakt. Zowel $_POST["ProductID"] als $_POST["Aantal"] heb ik zichtbaar kunnen echoën maar het aantal update niet in de array. Elke pagina heb ik de Sessie gestart inderdaad en ik redirect naar de winkelwagen toe.
Regel 4 is zo te zien overbodig.

Dat het aantal niet in de session staat is logisch.
Je stopt het namelijk in $item en $item is tijdelijk (in de foreach).

Donovan - op 10/11/2019 15:23:11


<?php
	foreach ($_SESSION["cart_item"] as $key => $item) 
	{
		if ($item["ProductID"] == $_POST["ProductID"]) 
		{
			$_SESSION["cart_item"][$key]["Aantal"] = $_POST["Aantal"];
		}
	}
?>



Gelukt!! En een klein beetje uitgebreid. Dank voor de reacties.


if (isset($_POST['Aantal'])) 
		{
			$prod_id = $_POST["ProductID"];
			foreach ($_SESSION["cart_item"] as &$item) 
			{
				if ($item["ProductID"] == $_POST["ProductID"] && $_POST["Aantal"] > 0 && $_POST["Aantal"] <= 99) 
				{
					$item['Aantal'] = $_POST["Aantal"];
					
					header('Location:winkelwagen.php');
					exit;
				}
			}
		}
Zou het niet logischer zijn om, als je op enig moment een enkel item aanpast, om gewoon te controleren of deze aanwezig is in $_SESSION?

En dat if-statement is (nog steeds) raar. Stel nu dat ik het aantal aanpas naar 100, dan kan ik deze niet meer wijzigen? En je controleert wat het was, en niet wat het wordt. Dus als ik van $_POST['Aantal'] "banaan" maak, dan wordt "banaan" opgeslagen? Iets wat hier ontbreekt is "input filtering", dit zou altijd de eerste stap moeten zijn als je een formulier verwerkt: controleren of je invoer klopt.

Reageren