Beste forumleden,

Ik heb jullie hulp nodig. Ik ben bezig met een hobby-projectje (jamjam1.haperen.eu), maar ik kom er niet uit. Ik heb een shopping cart gemaakt met behulp van php. Als iemand een product toevoegt, wordt deze vastgelegd in een session, hierin zitten onder andere de code van het product, prijs en hoeveelheid.
Op de bestelpagina staan ook meerdere persoonlijke gegevens die een klant kan invullen. Wanneer iemand op een submit knop drukt zou ik graag willen dat deze data d.m.v. een query naar mijn database verzonden wordt. Het ding is dat ik niet weet hoe ik dat moet doen met foreach, want als je meerdere producten hebt zijn er dus ook meerdere sessies.
De code hiervan staat hieronder.
Mocht je eten wat ik kan doen laat dan een reactie achter!
Gr. Gijs


<form name="methode">


<div class="ui-field-contain">
<label for="inp_first_name" class="control-label">Afhalen/Bezorgen</label>
<input type="radio" name="methode" value="afhalen" checked> Afhalen<br>
<input type="radio" name="methode" value="bezorgen"> Bezorgen<br>
</div>

<div class="ui-field-contain">
<label for="inp_first_name" class="control-label">Filiaalkeuze</label>
<SELECT NAME='filiaalkeuze'>
<OPTION VALUE='xx' disabled>Kies filiaal:</OPTION>
<?php
require('connecties.php');
$sql = "SELECT * FROM `filialen` WHERE filiaal not like 'Hoofdkantoor'";
$result = mysqli_query($connectie, $sql );
if (mysqli_num_rows($result) > 0) {
// output data of each row
while($row = mysqli_fetch_assoc($result)) {
echo "
<OPTION VALUE='" . $row["filiaal"]. "'>" . $row["filiaal"]. "</OPTION>";
}

} else {
echo "<OPTION VALUE='fout'>fout</OPTION>";

}
?>
</SELECT></div>

<h2>Contactgegevens</h2>
<div class="ui-field-contain">
<label for="inp_first_name" class="control-label">Voornaam</label>
<input type="text" name="voornaam" maxlength="30" placeholder="Verplicht" autocomplete="given-name" required />
</div>

<div class="ui-field-contain">
<label for="inp_first_name" class="control-label">Achternaam</label>
<input type="text" name="achternaam" maxlength="30" placeholder="Verplicht" autocomplete="family-name" required />
</div>

<div class="ui-field-contain">
<label for="inp_first_name" class="control-label">Telefoon</label>
<input type="text" name="telefoonnr" maxlength="30" placeholder="Verplicht" autocomplete="tel" required />
</div>

<div class="ui-field-contain">
<label for="inp_first_name" class="control-label">E-mailadres</label>
<input type="email" name="email" placeholder="Optioneel" autocomplete="email"/>
</div>


<h2>Bezorgadres</h2>

<div class="ui-field-contain">
<label for="inp_postal_code" class="control-label">Postcode</label>
<input type="text" name="postcode" maxlength="6" minlenght="6" placeholder="Verplicht,bijv: 1100AA" autocomplete="postal-code" required />
</div>

<div class="ui-field-contain">
<label for="inp_house_number" class="control-label">Huisnr</label>
<input type="text" name="huisnr" maxlength="10" placeholder="Verplicht" required />
</div>

<div class="ui-field-contain">
<label for="inp_street_name" class="control-label">Straatnaam</label>
<input type="text" name="straatnaam" maxlength="100" placeholder="Verplicht" required />
</div>

<div class="ui-field-contain">
<label for="inp_city" class="control-label">Woonplaats</label>
<input type="text" name="woonplaats" maxlength="50" placeholder="Verplicht" autocomplete="address-level2" required />
</div>

<div class="ui-field-contain">
<label for="inp_city" class="control-label">Gewenste tijdstip</label>
<input type="datetime-local" name="datumtijd" pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}" min="2020-02-01T00:00"required />
</div>

<div class="ui-field-contain">
<label for="OrderNotes" class="control-label">Heeft u opmerkingen voor uw bestelling?</label>
<input type="text" name="bestelgegevens" maxlength="100000" rows="5"/>
</div>

<?
$methode = mysqli_real_escape_string($connectie, $_POST["methode"]);
$filiaalkeuze = mysqli_real_escape_string($connectie, $_POST["filiaalkeuze"]);
$voornaam = mysqli_real_escape_string($connectie, $_POST["voornaam"]);
$achternaam = mysqli_real_escape_string($connectie, $_POST["achternaam"]);
$telefoonnr = mysqli_real_escape_string($connectie, $_POST["telefoonnr"]);
$email = mysqli_real_escape_string($connectie, $_POST["email"]);
$postcode = mysqli_real_escape_string($connectie, $_POST["postcode"]);
$huisnr = mysqli_real_escape_string($connectie, $_POST["huisnr"]);
$straatnaam = mysqli_real_escape_string($connectie, $_POST["straatnaam"]);
$woonplaats = mysqli_real_escape_string($connectie, $_POST["postcode"]);
$datumtijd = mysqli_real_escape_string($connectie, $_POST["datumtijd"]);
$bestelgegevens = mysqli_real_escape_string($connectie, $_POST["bestelgegevens"]);
$tijdbestelling = now();

?>
<?php
foreach ($_SESSION["shopping_cart"] as $product){

$prod = $product['code'];
$aant = $product['quantity'];
$klant = 1;

$sql = "insert into bestellingen (email, product, aantal, leveren, afgewerkt) values ('$klant', '$prod' , '$aant' , now() , 0";

}
?>
Here you begin:
https://www.w3schools.com/php/php_arrays_multidimensional.asp
https://www.geeksforgeeks.org/multidimensional-arrays-in-php/

Je wilt immers een goede boomstructuur hebben van al je data die je in je sessie opslaat. Je wilt immers bijvoorbeeld in één keer alle pita gyro's uit je mandje halen, en laten scannen bij de kassa. En met zulke array-bomen kan je dat eenvoudig doen, zolang je het maar goed ordend.

Ik hoop dat je eruit komt, anders horen we het wel waar je op vast loopt.

Even ene voorbeeld:

<?php
$_SESSION['cart']['Pita Gyros'] = 5;
$_SESSION['cart']['Friet Kapsalon'] = 3;
$_SESSION['cart']['Keftedaki'] = 5;
$_SESSION['cart']['Griekse wijn'] = 2;

print_r($_SESSION['cart']);
?>


Dit geeft:

Array
(
[Pita Gyros] => 5
[Friet Kapsalon] => 3
[Keftedakia] => 5
[Griekse wijn] => 2
)

Dus een simpele boom met de producten (die je normaal met een ID nummer ophaalt, omdat je friet bijvoorbeeld in meerdere soorten hebt, zoals gewoon en Ras, en dus beiden verschillend productnummer) en de aantallen.
Het is niet echt een boom, eerder een (multidimensionale) lijst.

Zoals @Ariën aangeeft hoef je geen prijs op te slaan, omdat deze afleidbaar is uit een product (die waarschijnlijk het eenvoudigst geïdentificeerd kan worden met een id).

Als je een structuur gebruikt waarin je alles opslaat in $_SESSION['cart'], op de hierboven beschreven wijze, dan kun je hier op een gemakkelijke manier doorheen:
<?php
foreach ($_SESSION['cart'] as $productId => $quantity) {
    // doe hier je ding
}
?>

De vraag is echter, als je al met geavanceerde onderwerpen zoals sessies en databases bezig bent, hoe kunnen arrays en loops dan nog geheimen voor je hebben? :/
Als je meerdere sessies maakt, (en dus niet in de 'cart' (winkelwagen)),dan krijg je meer een boom. Eigenlijk laat ik hier maar een tak zien. Maar het illustreert wel dat je een boom-structuur kan maken.
Misschien zien er specifieke instellingen die je in een sessie wilt gebruiken, zoals de keuze om BTW wel/niet te tonen, of sitespecifieke instellingen (die je bij het maken van een account) kan overhevelen naar de database.
Een (enkelvoudig) genest array is geen boom.

Ingeval van meerdere sessies zijn er onderling geen verbindingen, en is er ook niet echt sprake van een "één parent meerdere children" structuur.

Een (of meerdere) shoppingcart(s) volgen dus niet echt de graafstructuur van een boom. Als jij dit een boom wilt noemen, fijn :p.

Misschien bij complexere producten, die uiteenvallen uit meerdere (optionele) componenten is een boomstructuur mogelijk handig, maar dit is niet nodig / daar is geen sprake van bij een platte product => aantal mapping.

Laat ik het anders verwoorden: in dit geval is er geen hierarchish verband tussen de verschillende elementen in de cart, behalve dat ze in hetzelfde array zitten misschien, maar dat maakt het nog geen boom.
Een boom begint immers bij een stengel.

Maar goed, laten we maar afwachten of het Gijs lukt, dan een interessante discussie of het een boom is.

Reageren