Ik ben momenteel met school bezig en loop tegen het probleem
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:
<?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;

}
}
}

?>
En
<?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';
}
?>
Horen hierbij, ik hoop dat iemand mij hier mee kan helpen.
<?php $sql = "INSERT INTO bestelregel (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
- 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
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?
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?

<?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) ""

Een paar opmerkingen:

- 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.
- 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.


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.
Ik zie geen SQL-injection in een vaste waarde hoor. Ik heb mijn bericht daarom even geëdit voor de duidelijkheid. Verder zijn single-quotes voor je SQL bij invoer dus altijd verplicht, evenals de double-quotes om je variabelen geëscaped uit te voeren.

Of je single-quotes gebruikt bij getallen of niet, tja... dat blijft een eigen keuze.

Reageren