Razvoj web-stranica

[PHP, MySQL] Umetanje u tablicu s $_GET[' ']

Bp1700 pet 14.6.2019 09:14

Pozdrav, nov sam u ovom području i stoga molim za pomoć i razumijevanje. Uglavnom, radim si nekakvu aplikaciju koju sam zamislio ovako. Imam na stranici prikazanu tablicu, u kojoj svaki red predstavlja jedno vozilo koje se može naručiti klikom na poveznicu koja se nalazi pored podataka o vozilu. Kad se ta poveznica klikne, otvara se obrazac za narudžbu prema kojem je, pomoću kontrolne varijable, poslana registracijska oznaka naručenog vozila. U otvorenom obrascu za narudžbu unose se neke pojedinosti narudžbe, poput polazišta i odredišta. Klikom na gumb Naruči, trebalo bi se u tablicu Narudžbe na localhostu pohraniti te pojedinosti unesene u obrascu kao i registracijska oznaka koja je primljena pomoću $_GET[' ']. Registracijska oznaka u tablici Narudžbe zapravo je strani ključ prema varijabli u tablici Vozila. 

 

Izlistanje vozila (prvi PHP dokument). Ovdje je sve u redu.

<?php
...
if ($result->num_rows >0) {
while($row = $result->fetch_assoc()) {
echo '<tr><td>'.$row["id_vozila"].'</td>';
echo '<td>'.$row["duljina"].'</td>';
echo '<td>'.$row["sirina"].'</td>';
echo '<td>'.$row["visina"].'</td>';
echo '<td>'.$row["nosivost"].'</td>';
echo '<td><a href="naruci.php?id_vozila='.$row["id_vozila"].'">Naruči</a></td>';
}
...
?>
Izlistanje iz obrasca narudžbe (drugi PHP dokument).
...
$id_vozila = $_GET['id_vozila'] ?? ''; //dohvaćanje poslane reg. oznake
// $id_vozila = "ZG902AG"; //ručno unesena reg. oznaka
$polaziste=$_POST['polaziste'] ??''; //dohvaćanje podatka unesenog u obrascu
$odrediste=$_POST['odrediste'] ??''; //dohvaćanje podatka unesenog u obrascu
$upit ="INSERT INTO narudzbe(id_vozila, polaziste, odrediste)
VALUES('$id_vozila', '$polaziste', '$odrediste')";
if (mysqli_query($db, $upit)) {
echo "Narudžba je uspješna.";
} else {
echo "Pogrješka: ". $upit ."". mysqli_error($db);
}
}
?>
...
Kada se id_vozila dohvaća pomoću GET-a dobijem sljedeću obavijest: Error: INSERT INTO narudzbe(id_vozila, polaziste, odrediste) VALUES('', 'Zagreb', 'Bratislava')Cannot add or update a child row: a foreign key constraint fails (`enaruci`.`narudzbe`, CONSTRAINT `narudzbe_fk_vozila` FOREIGN KEY (`id_vozila`) REFERENCES `vozila` (`id_vozila`)).
Kada se id_vozila (koje već postoji u bazi) ručno unese (ovdje ZG902AG) sve bude u redu.
Kao što se vidi u obavijesti o pogrješci, odmah iza VALUES, na mjestu gdje bi trebao biti id_vozila odabranog vozila, nema ničega. U čemu je problem? S primarnim i stranim ključevima je sve u redu, provjeravao sam.
MrBlc pet 14.6.2019 14:50
Bp1700 kaže...
Kada se id_vozila dohvaća pomoću GET-a dobijem sljedeću obavijest: Error: INSERT INTO narudzbe(id_vozila, polaziste, odrediste) VALUES('', 'Zagreb', 'Bratislava')Cannot add or update a child row: a foreign key constraint fails (`enaruci`.`narudzbe`, CONSTRAINT `narudzbe_fk_vozila` FOREIGN KEY (`id_vozila`) REFERENCES `vozila` (`id_vozila`)).
Kada se id_vozila (koje već postoji u bazi) ručno unese (ovdje ZG902AG) sve bude u redu.
Kao što se vidi u obavijesti o pogrješci, odmah iza VALUES, na mjestu gdje bi trebao biti id_vozila odabranog vozila, nema ničega. U čemu je problem? S primarnim i stranim ključevima je sve u redu, provjeravao sam.

Na koji url se forma submita? Ako se submita na trenutni url, onda bi GET parametar trebao biti dostupan. Ako imaš u from tagu specificiran url na koji se submita, onda moraš proslijediti GET parametar, bilo kao GET parametar url-a na koji se submita, bilo kao hidden input unutar forme (a onda će ti vrijednost biti u POST arrayu, a ne GET).

 

Inače, čitav kod ti je jako nesiguran i opasan. NIKAD ne smiješ vanjske varijable ubacivati direktno u SQL. Prouči malo: https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

 

Entry Point kaže...

 Svejedno, to je POST metoda ako šalješ. 

Ovo nije točno - pri POST upitu na url koji ima i GET parametre, isti su i dalje dostupni u $_GET arrayu. Dapače, u $_GET i $_POST arrayu možeš imati  i različite vrijednosti za isti array key.

Bp1700 pet 14.6.2019 21:12
MrBlc kaže...
Bp1700 kaže...
Kada se id_vozila dohvaća pomoću GET-a dobijem sljedeću obavijest: Error: INSERT INTO narudzbe(id_vozila, polaziste, odrediste) VALUES('', 'Zagreb', 'Bratislava')Cannot add or update a child row: a foreign key constraint fails (`enaruci`.`narudzbe`, CONSTRAINT `narudzbe_fk_vozila` FOREIGN KEY (`id_vozila`) REFERENCES `vozila` (`id_vozila`)).
Kada se id_vozila (koje već postoji u bazi) ručno unese (ovdje ZG902AG) sve bude u redu.
Kao što se vidi u obavijesti o pogrješci, odmah iza VALUES, na mjestu gdje bi trebao biti id_vozila odabranog vozila, nema ničega. U čemu je problem? S primarnim i stranim ključevima je sve u redu, provjeravao sam.

Na koji url se forma submita? Ako se submita na trenutni url, onda bi GET parametar trebao biti dostupan. Ako imaš u from tagu specificiran url na koji se submita, onda moraš proslijediti GET parametar, bilo kao GET parametar url-a na koji se submita, bilo kao hidden input unutar forme (a onda će ti vrijednost biti u POST arrayu, a ne GET).

 

Inače, čitav kod ti je jako nesiguran i opasan. NIKAD ne smiješ vanjske varijable ubacivati direktno u SQL. Prouči malo: https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

 Da, specificirao sam URL submitanja i sada dodao hidden input i proradilo je. Što se tiče nedostataka koda, svjestan sam toga, i poradit ću na tome. Hvala puno na pomoći i sugestiji.