[mySql -PHP] Constraint error

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey allemaal,

Ik zit met een probleem, ik zou namelijk graag wat gegevens willen weg schrijven in een databank.
Maar ik krijg een error
code:
1
Error: Cannot add or update a child row: a foreign key constraint fails (`project31/gebruiker`, CONSTRAINT `gebruiker_ibfk_1` FOREIGN KEY (`categorieId`) REFERENCES `categorie` (`id`) ON DELETE SET NULL ON UPDATE CASCADE)


Wat ik dus eigenlijk wil doen;
een gebruiker toevoegen aan mijn databank "gebruiker". De relatie tussen de tabel categorie en gebruiker is als volgt:

code:
1
2
-KEY `categorieId` (`categorieId`),
- ADD CONSTRAINT `gebruiker_ibfk_1` FOREIGN KEY (`categorieId`) REFERENCES `categorie` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,


Kan iemand me helpen?

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 09:48
Waarschijnlijk staat die foreign key op Not Null. Je moet in ieder geval zorgen dat je in beide keys (zowel de Primary als de Foreign) dezelfde waarde invult, want je kunt met een FK niet verwijzen naar een PK die niet bestaat :)

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Zomaar een gok, je vult een categorieId in die niet in de categorie table staat.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Er steekt zowieso een waarde in de categorieId want anders voert hij de SQL niet uit. Met javascript wordt dit gecontroleerd dus.. Mijn veld "categorieId" staat op "null" standaardwaarde is ook Null

@Sebazzz: FOREIGN KEY (`categorieId`) REFERENCES `categorie` (`id`)

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Allereerst. Met javascript kun je onmogelijk controleren of een waarde correct gezet is. Javascript is client-side, en kan door kwaadwillenden beïnvloed worden. Controleer daarom altijd server-side, in dit geval in je PHP-script, of alle user-input aan je verwachtingen voldoet voordat je deze doorzet naar je database. De javascript-controle kun je laten staan ter bevordering van de usability, maar niet als input validatie.

Verder is de foutmelding erg eenduidig; Je geeft een waarde in de kolom "categorieId" die in de tabel "categorie" niet bestaat in de kolom "id'
Ik vermoed dat je de string "NULL" invoert. Jij bent opzoek naar de constante NULL, die je in je query niet met quotes dient te omringen
SQL:
1
INSERT INTO gebruikers SET naam = "Tweakers", categorieID = NULL


Alle variabelen in een formulier worden altijd als string gepost. Je zult nooit booleans, integers of NULL-values vinden in de $_POST superglobal.
Je kunt indien er geen categorie is gekozen bijvoorbeeld een lege string insturen, deze met de PHP-functie empty() afvangen, en aan de hand daarvan je SQL-commando opbouwen.

[ Voor 19% gewijzigd door frickY op 18-04-2010 19:14 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik voeg in de tabel "Gebruiker" een nieuwe gebruiker toe met als categorieId = 4;
in de tabel "Categorie" staat er een record met "Id" = 4.. dus dat is het vreemde..

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Bekijk eens de query zoals die letterlijk wordt uitgevoerd door deze te echo-en voordat je deze in mysql_query() (of gelijkwaardige) functie stopt. Ik betwijfel namelijk dat hier inderdaad die "4" in staat.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wat gaat er mis;
- Hij wisselt ineens van de sql statement straat & huisnummer om.. waar, ik zou het NIET weten.
- Hij doet heeft mij " ' " verwijdert van de geboortedatum terwijl dat ik dat niet gevraagd heb.
- Hij geeft de gescheiden niet mee, terwijl die ook waarde 1 is.
- Hij zet ook de waarde van de e-mail(dit was vroeger een kolom in de tabel "gebruiker" maar die hebben we dertussenuit verwijdert) in het vak van geboortedatum.

Al de rest doet hij correct.
PRINTS;
code:
1
INSERT INTO gebruiker (bondsnummer, wachtwoord, naam, voornaam, straat, huisnummer, postcode, plaats, geboortedatum, categorieId, groepId, autoriteitId, gescheiden) VALUES ('ZG-121212', 'test', 'Lauwerijzen', 'Maarten', '29', 'Sijssjesstraat', '2330', 'Turnhout', 'maarten.lauwerijzen@pandora.be', 1991-10-23, 1, 1, '1')

Dit is de sql statement die ik meegaf:
code:
1
2
$sql = "INSERT INTO gebruiker (bondsnummer, wachtwoord, naam, voornaam, straat, huisnummer, postcode, plaats, geboortedatum, categorieId, groepId, autoriteitId, gescheiden)
           VALUES ($bondsnummer, $wachtwoord, $naam, $voornaam, $straat, $huisnummer, $postcode, $plaats, $geboortedatum, $categorieId, $groepId, $autoriteitId, $gescheiden)";


Dit is het ophalen van de waardes van het object;
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
                $bondsnummer = toNull(escape($gebruiker->getBondsnummer()), true);
                $wachtwoord = toNull(escape($gebruiker->getWachtwoord()), true);
        $naam = toNull(escape($gebruiker->getNaam()), true);
        $voornaam = toNull(escape($gebruiker->getVoornaam()), true);
        $straat = toNull(escape($gebruiker->getStraat()), true);
        $huisnummer = toNull(escape($gebruiker->getHuisnummer()), true);
        $postcode = toNull(escape($gebruiker->getPostcode()), true);
        $plaats = toNull(escape($gebruiker->getPlaats()), true);
                $geboortedatum = toNull(escape($gebruiker->getGeboortedatum()), true);
                $categorieId = $gebruiker->getCategorieId();
                $groepId = $gebruiker->getGroepId();
                $autoriteitId = $gebruiker->getAutoriteitId();
                $gescheiden = $gebruiker->getGescheiden();

[ Voor 3% gewijzigd door Verwijderd op 18-04-2010 19:48 ]


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Een paar opmerkingen:

- Je zegt dat de quotes van je geboortedatum verdwenen zijn, dit ligt niet aan PHP o.i.d. maar ik denk aan je escape() of je toNull() functie. Ga daar eens kijken en debuggen.
- Hetzelfde geldt voor het omwisselen van straat en huisnummer, oorzaak moet in jouw functies liggen, kijk bij getHuisnummer() en getStraat()
- Je MySQL error is vrij logisch, op de plek van de categorieId in de INSERT query staat een geboorte datum. En omdat je kolomtype bij categorieId waarschijnlijk iets van INT of TINYINT is gaat dit mis.
- Oh, en nog een tip: NEVER EVER STORE PLAIN TEXT PASSWORDS, en wees niet zo naïef door te zeggen dat je systeem waterdicht is, want het kan altijd misgaan, en dan liggen wel al je wachtwoorden onbeveiligd op straat
- De gescheiden zie ik in de query gewoon op 1 staan hoor...

Kortom kijk nog eens naar de functies die de variabelen van de query vullen... Pas als die goed werken kun je de querys gaan debuggen, wat dan waarschijnlijk al niet meer nodig is.
Pagina: 1