Invalid argument supplied for foreach()
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\Eindopdracht 1.6\bestel.php on line 49
Ik heb dit online bekeken en vond een oplossing om te bekijken of het wel een array of object is, dit was het helaas niet.
Code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php if ($conn->query( $sql ) ) {
$bestelnummer = $conn->insert_id;
$producten = $_POST['aantal'];
foreach ($producten as $productnummer => $aantal) {
if ($aantal > 0) {
$sql = "INSERT INTO 'bestelregel' ('bestelnummer', 'productnummer', 'aantal')
VALUES ('" . $bestelnummer . "', '" . $productnummer . "', '" . $aantal . "')";
$conn->query($sql);
echo "Bestelling is succesvol geplaatst met bestelnummer: " . $bestelnummer;
}
}
}
?>
$bestelnummer = $conn->insert_id;
$producten = $_POST['aantal'];
foreach ($producten as $productnummer => $aantal) {
if ($aantal > 0) {
$sql = "INSERT INTO 'bestelregel' ('bestelnummer', 'productnummer', 'aantal')
VALUES ('" . $bestelnummer . "', '" . $productnummer . "', '" . $aantal . "')";
$conn->query($sql);
echo "Bestelling is succesvol geplaatst met bestelnummer: " . $bestelnummer;
}
}
}
?>
En
Code (php)
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
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
<?php
$sql = 'SELECT * FROM producten WHERE categorie = "wijnen"';
$result = $conn->query($sql);
$categorie = ("Wijnen");
if ($result->num_rows > 0) {
echo '
<div class="form-group col-md-6">
<table class="table">
<thead>
<h2 class="ml-1">' . $categorie . '</h2>
<tr>
<th class="col-md-1">Product</th>
<th>Prijs</th>
<th>Aantal</th>
</tr>
</thead>
<tbody>
';
while($row = $result->fetch_assoc()) {
echo '
<tr>
<td>' . $row['naam'] . '</td>
<td>' . $row['prijs'] . '</td>
<td> <input type="text" class="form-control" class="w-100" name="aantal"> </input></td>
</tr>
'; }
echo '</tbody>
</table>
</div>';
} else {
echo '0 results';
}
?>
$sql = 'SELECT * FROM producten WHERE categorie = "wijnen"';
$result = $conn->query($sql);
$categorie = ("Wijnen");
if ($result->num_rows > 0) {
echo '
<div class="form-group col-md-6">
<table class="table">
<thead>
<h2 class="ml-1">' . $categorie . '</h2>
<tr>
<th class="col-md-1">Product</th>
<th>Prijs</th>
<th>Aantal</th>
</tr>
</thead>
<tbody>
';
while($row = $result->fetch_assoc()) {
echo '
<tr>
<td>' . $row['naam'] . '</td>
<td>' . $row['prijs'] . '</td>
<td> <input type="text" class="form-control" class="w-100" name="aantal"> </input></td>
</tr>
'; }
echo '</tbody>
</table>
</div>';
} else {
echo '0 results';
}
?>
Horen hierbij, ik hoop dat iemand mij hier mee kan helpen.
Gewijzigd op 21/06/2020 17:21:16 door Delano Velthuis
aantal[] zorgt ervoor dat $_POST['aantal'] een array is, en <productnummer> heb je nodig omdat dit overeenstemt met $productnummer in je foreach: foreach ($producten as $productnummer => $aantal).
Kan je het script tussen code-tags zetten?
Thomas van den Heuvel op 21/06/2020 17:01:10:
Verander name="aantal" in name="aantal[<productnummer>]" waarbij <productnummer> het productnummer uit je queryresultaten is.
aantal[] zorgt ervoor dat $_POST['aantal'] een array is, en <productnummer> heb je nodig omdat dit overeenstemt met $productnummer in je foreach: foreach ($producten as $productnummer => $aantal).
aantal[] zorgt ervoor dat $_POST['aantal'] een array is, en <productnummer> heb je nodig omdat dit overeenstemt met $productnummer in je foreach: foreach ($producten as $productnummer => $aantal).
Dit heeft geholpen, hartelijk dank!
Enige probleem waar ik nu mee zit is dat hij hem niet in phpmyadmin plaatst, wat ondanks de code na checken helemaal goed lijkt.
Ik heb doormiddel van de echo alles uitgeprint,
Hier kwam uit dat hij de productcode niet kan vinden.
Alleen ik zie niet waarom niet..
Gewijzigd op 21/06/2020 17:18:23 door Delano Velthuis
Gewijzigd op 21/06/2020 17:22:24 door - Ariën -
- Ariën - op 21/06/2020 17:20:34:
Je bedoelt je database. PhpMyAdmin is niets meer dan een in PHP gebouwd script om de database mee uit te lezen en te beheren.
Oh, ik wist dit niet.
Hartelijk bedankt voor het informeren.
Ik heb de code ook net aangepast met codetag voor u.
Echo op lijn 9 eens $sql.
- Ariën - op 21/06/2020 17:25:17:
Echo op lijn 9 eens $sql.
Dan krijg ik dit:
INSERT INTO 'bestelregel' ('bestelnummer', 'productnummer', 'aantal') VALUES ('55', '', '22')
Gewijzigd op 21/06/2020 18:00:46 door Delano Velthuis
Haal de quotes eens weg om je tabelnaam.
- Ariën - op 21/06/2020 18:07:30:
Haal de quotes eens weg om je tabelnaam.
Krijg ik hetzelfde resultaat:
INSERT INTO bestelregel ('bestelnummer', 'productnummer', 'aantal') VALUES ('57', '', '22')
Maar probeer dit dan eens uit te voeren in phpMyAdmin.
Code (php)
1
2
2
<?php $sql = "INSERT INTO bestelregel (bestelnummer, productnummer, aantal)
VALUES ('" . $bestelnummer . "', '" . $productnummer . "', '" . $aantal . "')"; ?>
VALUES ('" . $bestelnummer . "', '" . $productnummer . "', '" . $aantal . "')"; ?>
zo?
Als ik dit invul krijg ik:
Warning: #1366 Incorrect integer value: '" . $bestelnummer . "' for column `sligro`.`bestelregel`.`bestelnummer` at row 1
voor bestelnummer, productnummer en aantal
De uitvoer moet je invoeren, niet het script.
- Ariën - op 21/06/2020 18:22:23:
De uitvoer moet je invoeren, niet het script.
INSERT INTO bestelregel (bestelnummer, productnummer, aantal) VALUES ('58', '', '22')
Dit? excusses ben hier nieuw in
Jep.
- Ariën - op 21/06/2020 18:27:08:
Jep.
#1062 - Dubbele ingang '58' voor zoeksleutel 'PRIMARY'
Nu doe ik 59 i.p.v.
die werkte wel.
Nu vul in zelf een waarde in voor productcode zoals 3 wat een id is van een product van mij
deze werkt ook.
Mijn code zelf kan dus niet de productcode ophalen maar wel het aantal
Hoe luidt $sql van de eerste regel van het eerste codefragment uit jouw eerste bericht? Staan daar toevallig ook quotes om de tabel- of kolomnamen?
Thomas van den Heuvel op 21/06/2020 19:28:09:
Indien $bestelnummer geen nummer is (dump deze eens naar het scherm met var_dump($bestelnummer)?) dan moet je misschien even controleren of de query van de bestelling zelf wel goed ging.
Hoe luidt $sql van de eerste regel van het eerste codefragment uit jouw eerste bericht? Staan daar toevallig ook quotes om de tabel- of kolomnamen?
Hoe luidt $sql van de eerste regel van het eerste codefragment uit jouw eerste bericht? Staan daar toevallig ook quotes om de tabel- of kolomnamen?
Code (php)
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
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
<?php
include'includes/header.php';
$hostname = 'localhost';
$username = 'root';
$password = '';
$database = 'sligro';
$conn = new mysqli($hostname, $username, $password, $database);
if ($conn->connect_error) {
echo "Verbinding mislukt";
exit();
}
$voornaam = $_POST['voornaam'];
$achternaam = $_POST['achternaam'];
$adress = $_POST['adress'];
$postcode = $_POST['postcode'];
$woonplaats = $_POST['woonplaats'];
$email = $_POST['email'];
$telefoon = $_POST['telefoon'];
$verzendwijze = $_POST['verzendwijze'];
$wachtwoord = $_POST['wachtwoord'];
$wachtwoord_bevestigen = $_POST['wachtwoord_bevestigen'];
if($wachtwoord != $wachtwoord_bevestigen) {
echo "Uw wachtwoord komt niet overeen";
exit();
}
$wachtwoord = password_hash($password, PASSWORD_DEFAULT);
$sql = "INSERT INTO `klant` (`voornaam`, `achternaam`, `adress`, `postcode`, `woonplaats`, `email`, `telefoon`, `wachtwoord`)
VALUES ('" . $voornaam . "', '" . $achternaam . "', '" . $adress . "', '" . $postcode . "', '" . $woonplaats . "', '" . $email . "', '" . $telefoon . "', '" . $wachtwoord . "')";
if ($conn->query( $sql ) ) {
$klantnummer = $conn->insert_id;
$sql = "INSERT INTO `bestelling` (`klant_klantnummer`, `verzendwijze`)
VALUES ('" . $klantnummer . "', '" . $verzendwijze . "')";
if ($conn->query( $sql ) ) {
$bestelnummer = $conn->insert_id;
$producten = $_POST['aantal'];
foreach($producten as $productnummer => $aantal) {
if ($aantal > 0) {
$sql = "INSERT INTO bestelregel (bestelnummer, productnummer, aantal)
VALUES ('" . $bestelnummer . "', '" . $productnummer . "', '" . $aantal . "')";
echo $sql;
$conn->query($sql);
// echo "Bestelling is succesvol geplaatst met bestelnummer: " . $bestelnummer;
//echo "Bestelling is succesvol geplaatst met bestelnummer: " . $productnummer;
//echo "Bestelling is succesvol geplaatst met bestelnummer: " . $aantal;
var_dump($productnummer);
}
}
}
}
include'includes/footer.php';
?>
include'includes/header.php';
$hostname = 'localhost';
$username = 'root';
$password = '';
$database = 'sligro';
$conn = new mysqli($hostname, $username, $password, $database);
if ($conn->connect_error) {
echo "Verbinding mislukt";
exit();
}
$voornaam = $_POST['voornaam'];
$achternaam = $_POST['achternaam'];
$adress = $_POST['adress'];
$postcode = $_POST['postcode'];
$woonplaats = $_POST['woonplaats'];
$email = $_POST['email'];
$telefoon = $_POST['telefoon'];
$verzendwijze = $_POST['verzendwijze'];
$wachtwoord = $_POST['wachtwoord'];
$wachtwoord_bevestigen = $_POST['wachtwoord_bevestigen'];
if($wachtwoord != $wachtwoord_bevestigen) {
echo "Uw wachtwoord komt niet overeen";
exit();
}
$wachtwoord = password_hash($password, PASSWORD_DEFAULT);
$sql = "INSERT INTO `klant` (`voornaam`, `achternaam`, `adress`, `postcode`, `woonplaats`, `email`, `telefoon`, `wachtwoord`)
VALUES ('" . $voornaam . "', '" . $achternaam . "', '" . $adress . "', '" . $postcode . "', '" . $woonplaats . "', '" . $email . "', '" . $telefoon . "', '" . $wachtwoord . "')";
if ($conn->query( $sql ) ) {
$klantnummer = $conn->insert_id;
$sql = "INSERT INTO `bestelling` (`klant_klantnummer`, `verzendwijze`)
VALUES ('" . $klantnummer . "', '" . $verzendwijze . "')";
if ($conn->query( $sql ) ) {
$bestelnummer = $conn->insert_id;
$producten = $_POST['aantal'];
foreach($producten as $productnummer => $aantal) {
if ($aantal > 0) {
$sql = "INSERT INTO bestelregel (bestelnummer, productnummer, aantal)
VALUES ('" . $bestelnummer . "', '" . $productnummer . "', '" . $aantal . "')";
echo $sql;
$conn->query($sql);
// echo "Bestelling is succesvol geplaatst met bestelnummer: " . $bestelnummer;
//echo "Bestelling is succesvol geplaatst met bestelnummer: " . $productnummer;
//echo "Bestelling is succesvol geplaatst met bestelnummer: " . $aantal;
var_dump($productnummer);
}
}
}
}
include'includes/footer.php';
?>
Dit is de code momenteel, uitkomst vardump productnummer (wat het niet deed) is string(15) ""
- Zorg dat elke invoer geëscaped wordt tegen kwaadardige manipulatie via SQL-injection. Dus zorg in dit geval dat je $_POST-veriabelen beveiliogd worden met $conn->real_escape_string()
- Waarom moet je script stoppen als je password niet goed is? Laat het netjes afsluiten met if-else statements.
- Vaste getallen in querys hoeven niet tussen single query-quotes.
Gewijzigd op 21/06/2020 22:18:49 door - Ariën -
- Ariën - op 21/06/2020 21:48:04:
- Zorg dat elke invoer geëscaped wordt tegen kwaadardige manipulatie via SQL-injection. Dus zorg in dit geval dat je $_POST-veriabelen beveiliogd worden met $conn->real_escape_string()
- Nummers in querys hoeven niet tussen single query-quotes.
- Nummers in querys hoeven niet tussen single query-quotes.
Maar het een is niet veilig zonder het ander. Dus kun je dit beter wel doen. Het is ook consistenter als je overal quotes + escaping gebruikt. Zodat je ook niet overal hoeft na te denken of het per ongeluk is vergeten of het expres achterwege is gelaten.
Of je single-quotes gebruikt bij getallen of niet, tja... dat blijft een eigen keuze.