Probleem met foreign key
voor een hobbyprojectje ben ik wederom bezig met een Shopping Cart, die de bestelling doorgeeft in de database. Nu zit het probleem niet in de query op de website, maar in de database zelf. Ik krijg de volgende foutmelding: Cannot add or update a child row: a foreign key constraint fails.
Even ter uitleg, ik heb twee tabellen, in de eerste zitten de persoonlijke gegevens van de bestelling met orderar en in de tweede tabel zit het ordernr, productnr en hoeveelheid.
Dit is hoe de tabel eruit ziet.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE `Bestellingdetails` (
`ordernr` int(11) NOT NULL,
`voornaam` varchar(255) NOT NULL,
`achternaam` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`telnr` int(20) NOT NULL,
`straatnaam` varchar(255) NOT NULL,
`huisnummer` int(9) NOT NULL,
`postcode` varchar(6) NOT NULL,
`plaats` int(255) NOT NULL,
`besteldatum` datetime NOT NULL DEFAULT current_timestamp(),
`status` varchar(255) NOT NULL,
PRIMARY KEY (`ordernr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin
`ordernr` int(11) NOT NULL,
`voornaam` varchar(255) NOT NULL,
`achternaam` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`telnr` int(20) NOT NULL,
`straatnaam` varchar(255) NOT NULL,
`huisnummer` int(9) NOT NULL,
`postcode` varchar(6) NOT NULL,
`plaats` int(255) NOT NULL,
`besteldatum` datetime NOT NULL DEFAULT current_timestamp(),
`status` varchar(255) NOT NULL,
PRIMARY KEY (`ordernr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin
NOTE: Ik heb auto increment hier uit ordernr gehaald.
En de andere:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
CREATE TABLE `Bestellingproduct` (
`ordernr` int(11) NOT NULL,
`productnr` int(11) NOT NULL,
`hoeveelheid` int(11) NOT NULL,
KEY `productnr` (`productnr`),
KEY `ordernr` (`ordernr`),
CONSTRAINT `Bestellingproduct_ibfk_1` FOREIGN KEY (`productnr`) REFERENCES `Producten` (`productnr`),
CONSTRAINT `Bestellingproduct_ibfk_2` FOREIGN KEY (`ordernr`) REFERENCES `Bestellingdetails` (`ordernr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
`ordernr` int(11) NOT NULL,
`productnr` int(11) NOT NULL,
`hoeveelheid` int(11) NOT NULL,
KEY `productnr` (`productnr`),
KEY `ordernr` (`ordernr`),
CONSTRAINT `Bestellingproduct_ibfk_1` FOREIGN KEY (`productnr`) REFERENCES `Producten` (`productnr`),
CONSTRAINT `Bestellingproduct_ibfk_2` FOREIGN KEY (`ordernr`) REFERENCES `Bestellingdetails` (`ordernr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
En tot slot de query in php:
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
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
$voornaam = $_POST["voornaam"];
$achternaam = $_POST["achternaam"];
$email = $_POST["email"];
$telnr = $_POST["telnr"];
$straatnaam = $_POST["straatnaam"];
$huisnummer = $_POST["huisnummer"];
$postcode = $_POST["postcode"];
$plaats = $_POST["plaats"];
if(isset($_POST['submit'])){
$sql="INSERT INTO Bestellingdetails (voornaam,achternaam,email,telnr,straatnaam,huisnummer,postcode,plaats,status) VALUES ('$voornaam','$achternaam','$email','$telnr','$straatnaam','$huisnummer','$postcode','$plaats','Bestelling ontvangen')";
if (mysqli_query($connectie, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($connectie);
}
foreach ($_SESSION["cart_item"] as $item){
$hoeveelheid=$item['quantity'];
$productnr=$item["productnr"];
$query="INSERT INTO Bestellingproduct (productnr,hoeveelheid) VALUES ('$productnr','$hoeveelheid')";
if (mysqli_query($connectie, $query)) {
echo "New record created successfully";
} else {
echo "Error: " . $query . "<br>" . mysqli_error($connectie);
}
}
}
$achternaam = $_POST["achternaam"];
$email = $_POST["email"];
$telnr = $_POST["telnr"];
$straatnaam = $_POST["straatnaam"];
$huisnummer = $_POST["huisnummer"];
$postcode = $_POST["postcode"];
$plaats = $_POST["plaats"];
if(isset($_POST['submit'])){
$sql="INSERT INTO Bestellingdetails (voornaam,achternaam,email,telnr,straatnaam,huisnummer,postcode,plaats,status) VALUES ('$voornaam','$achternaam','$email','$telnr','$straatnaam','$huisnummer','$postcode','$plaats','Bestelling ontvangen')";
if (mysqli_query($connectie, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($connectie);
}
foreach ($_SESSION["cart_item"] as $item){
$hoeveelheid=$item['quantity'];
$productnr=$item["productnr"];
$query="INSERT INTO Bestellingproduct (productnr,hoeveelheid) VALUES ('$productnr','$hoeveelheid')";
if (mysqli_query($connectie, $query)) {
echo "New record created successfully";
} else {
echo "Error: " . $query . "<br>" . mysqli_error($connectie);
}
}
}
Hopelijk kan een van jullie het probleem vinden.
Dank alvast
Middels https://www.php.net/manual/en/mysqli.insert-id.php kun je het id dat je op regel 11 verkreeg ophalen.
Dat gebruik je vervolgens bij de query van regel 20
Ivo P op 10/04/2021 19:31:54:
je vergeet bij de insert-into-bestellingproduct query om ordernr op te geven.
Middels https://www.php.net/manual/en/mysqli.insert-id.php kun je het id dat je op regel 11 verkreeg ophalen.
Dat gebruik je vervolgens bij de query van regel 20
Middels https://www.php.net/manual/en/mysqli.insert-id.php kun je het id dat je op regel 11 verkreeg ophalen.
Dat gebruik je vervolgens bij de query van regel 20
Dankjewel, het is deels gelukt. Ik noem de variabel die uit insert_id komt $id. Het ding dat zich nu afspeelt is dat wanneer de for each loop opent, $id zijn waarde verliest, hoe kan ik dit fixen?
Is er ook code van hoe die $id uit insert_id komt in de foreach lus?
$id moet maar 1x zijn waarde krijgen, en wel vóór je de foreach lus in gaat.