Hulp met 'foreach' variabelen in een query zetten

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Gijs Marien

Gijs Marien

02/03/2020 11:45:43
Quote Anchor link
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

Quote:

<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>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
    $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();
  
  ?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?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";
    
}

?>
 
PHP hulp

PHP hulp

19/04/2024 07:38:57
 
- Ariën  -
Beheerder

- Ariën -

02/03/2020 11:49:04
Quote Anchor link
Kan je jouw code tussen code-tags plaatsen?
En wat doet de now() functie? Dat is niet standaard in PHP, dus vermoedelijk zelf gemaakt? Of je haalt de functies van MySQL en PHP door elkaar?
Gewijzigd op 02/03/2020 11:50:28 door - Ariën -
 
Gijs Marien

Gijs Marien

02/03/2020 11:49:33
Quote Anchor link
Hoe doe je dat?
 
- Ariën  -
Beheerder

- Ariën -

02/03/2020 11:51:06
Quote Anchor link
[code] en [/code].
De opmaakcodes staan ook bij de Veelgestelde Vragen vermeld op deze site ;-)
Zie ook mijn edit met mijn vraag over je script.
Gewijzigd op 02/03/2020 11:51:42 door - Ariën -
 
Gijs Marien

Gijs Marien

02/03/2020 11:52:23
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<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";
    
}

?>
 
- Ariën  -
Beheerder

- Ariën -

02/03/2020 11:53:21
Quote Anchor link
En wat doet de now() functie? Dat is niet standaard in PHP, dus vermoedelijk zelf gemaakt? Of je haalt de functies van MySQL en PHP door elkaar?
 
Gijs Marien

Gijs Marien

02/03/2020 11:54:50
Quote Anchor link
De now() functie zorgt ervoor dat de tijd op het moment van submit in de MYSQL database komt.
 
- Ariën  -
Beheerder

- Ariën -

02/03/2020 12:00:31
Quote Anchor link
Nou, die bestaat overigens niet in PHP, wel in MySQL.
Maar zo te zien had je dat blijkbaar al ontdekt.

Maar Je moet dus inbouwen dat je bij het klikken op een product een sessie met een multidimensionale aanmaakt, met daarin je product en je aantal..

$productID = 1; // Bijv. Pita Gyros
$aantal = 2;
$_SESSION['cart'][$productID] = $aantal.

Uiteindelijk vormt dit een boomstructuur van de producten in je winkelmand, waarna je dit bij de kassa laat afrekenen.
 
Gijs Marien

Gijs Marien

02/03/2020 12:03:02
Quote Anchor link
Huh ik begrijp dat niet helemaal? Zou je dat op een andere manier kunnen uitleggen?
 
- Ariën  -
Beheerder

- Ariën -

02/03/2020 12:03:37
Quote Anchor link
Wat begrijp je niet? Ben je bekend met multi-dimensionale array's?
 
Gijs Marien

Gijs Marien

02/03/2020 12:05:18
Quote Anchor link
Nope...
 
- Ariën  -
Beheerder

- Ariën -

02/03/2020 12:06:01
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?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:
Quote:
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.
Gewijzigd op 02/03/2020 13:48:27 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

02/03/2020 16:32:22
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?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? :/
 
- Ariën  -
Beheerder

- Ariën -

02/03/2020 16:50:06
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

02/03/2020 17:23:49
Quote Anchor link
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.
Gewijzigd op 02/03/2020 17:37:06 door Thomas van den Heuvel
 
- Ariën  -
Beheerder

- Ariën -

02/03/2020 17:38:38
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.