Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Klucze obce, inserty
Forum PHP.pl > Forum > Przedszkole
loogin
Witam ponownie, mam kwestię, której nie ogarniam, dlatego proszę o pomoc.
Rzecz ma się tak:

Fragment formularza związany z nieszczęsnym kontrahentem. Manipulacje nazwami forumularza, a nawet tabelami nic nie dały.
  1. dostawca:<br>
  2. <select name="kontrahent" id="kontrahent">
  3. <?php
  4. $res = mysql_query ("SELECT nazwa FROM kontrahent ");
  5. while($row = mysql_fetch_array($res))
  6. {
  7. $kontrahent= $row["nazwa"];
  8. echo "<option>$kontrahent</option>";
  9. }
  10. echo "</select>";
  11. ?>

  1. $kontrahent2 = $_POST['kontrahent'];
  2.  
  3. $kontrahent_id = mysql_query ("SELECT idkontrahent FROM kontrahent WHERE nazwa='$kontrahent2'");
  4. echo mysql_result($kontrahent_id,0,0); //sprawdzam, czy pobiera dobre id, ale obawiam się, ze nie tak powinno to być, booo ;)
  5. //print_r($katid) // wywala błąd Resource id #7, z którym nie wiem co począć

i dalej coś, czego w ogóle nie mogę rozwiązać, a zapewnie łączy się z powyższym
  1. $kon_obcy= mysql_query("INSERT INTO produkt SET idkontrahent='$kontrahent_id'");

Błąd
Cannot add or update a child row: a foreign key constraint fails (`sklepik`.`produkt`, CONSTRAINT `kontrahent` FOREIGN KEY (`idkontrahent`) REFERENCES `kontrahent` (`idkontrahent`) ON DELETE CASCADE ON UPDATE CASCADE)

Tabela kontrahentów jest wypełniona, a taki sposób uzupełniania wykorzystuję w kilku miejscach – w jednych działa, w innych nie (zawsze ten sam rodzaj błędu) i nie wiem robię źle.

Następnie łączenie produktu z odpowiednią kategorią:
  1. $produkt = mysql_query("INSERT INTO produkt SET nazwa='$nazwa', ilosc='$ilosc', itd.'");
  2. $klucz_produkt=mysql_insert_id();
  3. $kat_pr = mysql_query("INSERT INTO produkt_has_kategoria SET produkt_idprodukt='$klucz_produkt'");
Sam produkt uzupełnia się prawidłowo, jednak tabela produkt_has_kategoria pozostaje pusta.

Podobne rozwiązanie w przypadku kontrahenta i adresu działa:
  1. $adres = mysql_query("INSERT INTO adres SET miejscowosc='$miejscowosc', kod_pocztowy='$kod_pocztowy' itd.");
  2. $klucz_adres=mysql_insert_id();
  3. $info = mysql_query("INSERT INTO kontrahent SET nazwa='$nazwa' itd.");
  4. $klucz_info=mysql_insert_id();
  5.  
  6. $konadres = mysql_query("INSERT INTO kontrahent_has_adres SET kontrahent_idkontrahent='$klucz_info', adres_idadres='$klucz_adres'");


Może trochę za dużo tych kodów, ale właśnie rzecz w tym, że tu działa, a tam nie. Jeśli można, proszę mi wskazać co doczytać, aby rozwiązać te problemy smile.gif
MateuszS
Nie zagłębiając się w kod, pierwsze co mi się w oczy rzuciło to brak value w option, value czyli wartość jaką wyślesz POSTEM, jeżeli jej nie ma to lipa.
loogin
Cytat(MateuszScirka @ 3.04.2010, 23:10:06 ) *
Nie zagłębiając się w kod, pierwsze co mi się w oczy rzuciło to brak value w option, value czyli wartość jaką wyślesz POSTEM, jeżeli jej nie ma to lipa.

Czułam, że z tym to znowu jakiś głupi błąd. Naprawione.

Pozostaje kwestia tego błędu:
  1. Cannot add or update a child row: a foreign key constraint fails(`sklepik`.`produkt_has_kategoria`, CONSTRAINT `fk_produkt_has_kategoria_kategoria1` FOREIGN KEY (`kategoria_idkategoria`) REFERENCES `kategoria` (`idkategoria`) ON DELETE CASCADE ON UPDATE CAS)

po takich komendach:
  1. $produkt = mysql_query("INSERT INTO produkt SET nazwa='$nazwa', ilosc='$ilosc'"); //itd.
  2. $klucz_produkt=mysql_insert_id(); echo "<br>zmienna klucz produkt "; echo $klucz_produkt; //wyswietla jakis kosmos, a w innych przypadkach dziala dobrze
  3. $kat_pr = mysql_query("INSERT INTO produkt_has_kategoria SET produkt_idprodukt='$klucz_produkt', kategoria_idkategoria='$katid'")


Dlaczego mysql_insert_id() nie wyrzuca tego, co powinno? Tabela 'produkt' jest AI.

Poza tym w kontrahencie jest analogiczny błąd
  1. $kontrahent_id = mysql_query ("SELECT idkontrahent FROM kontrahent WHERE nazwa='$kontrahent'"); echo mysql_error();
  2.  
  3. $lal = mysql_fetch_array($kontrahent_id);
  4. echo "<br>zawartosc zmiennej kontrahent id: "; echo $lal['idkontrahent']; //wysietla prawidłowo
  5.  
  6. $kon_obcy= mysql_query("INSERT INTO produkt SET idkontrahent='$lal'");

  1. Cannot add or update a child row: a foreign key constraint fails (`sklepik`.`produkt`, CONSTRAINT `kontrahent` FOREIGN KEY (`idkontrahent`) REFERENCES `kontrahent` (`idkontrahent`) ON DELETE CASCADE ON UPDATE CASCADE)


Sama sie już w tym mieszam tongue.gif
luck
  1. echo "<br>zawartosc zmiennej kontrahent id: "; echo $lal['idkontrahent']; //wysietla prawidłowo
  2. $kon_obcy= mysql_query("INSERT INTO produkt SET idkontrahent='$lal'");
Tak sobie myślę, że skoro $lal jest tablicą to nie możesz jej sobie ot tak wstawić do zapytania smile.gif Spróbuj:
  1. $kon_obcy= mysql_query("INSERT INTO produkt SET idkontrahent='". $lal['idkontrahent'] ."'");
loogin
Cytat(luck @ 5.04.2010, 17:31:49 ) *
Spróbuj:
  1. $kon_obcy= mysql_query("INSERT INTO produkt SET idkontrahent='". $lal['idkontrahent'] ."'");

Nie mam słów na siebie. Kiedy chciałam coś takiego zrobić, to nie dałam kropek, czyli było nieprawidłowo zbudowane, czyli nie działało. To jest w porządku. Dziękuję!

edit

Jednak nie... Ten INSERT wstawia się dwukrotnie:
raz wszystkie pola poza kontrahentem
drugi wszystko na null, a w kontrahencie prawidłowo połączone id

mortus
To zapytanie działa prawidłowo i robi to co ma robić. Najlepiej pokaż cały kod, choć jeśli są to dwa osobne pliki, to może być problem. Jeżeli natomiast jest to jeden plik, to trzeba będzie zmienić kolejność wykonywania zapytań.

Jeżeli kod jest napisany w takiej kolejności, w jakiej go wyświetlałaś i wszystko znajduje się w jednym pliku, to możemy zamiast INSERT użyć UPDATE
  1. $kon_obcy= mysql_query("UPDATE produkt SET idkontrahent='" . $lal['idkontrahent'] . "' WHERE idprodukt=" . $klucz_produkt);
loogin
Cytat(mortus @ 5.04.2010, 18:48:27 ) *
Jeżeli kod jest napisany w takiej kolejności, w jakiej go wyświetlałaś i wszystko znajduje się w jednym pliku, to możemy zamiast INSERT użyć UPDATE
  1. $kon_obcy= mysql_query("UPDATE produkt SET idkontrahent='" . $lal['idkontrahent'] . "' WHERE idprodukt=" . $klucz_produkt);

Wszystko jest w jednym, krótkim i prostym pliku, więc póki co pozostanę przy zastosowaniu UPDATEu, bo wygląda na to, że w tej chwili sprawdza się najlepiej.


Dziękuję wszystkim; jeden formularz, a tyle problemów stworzyłam dry.gif. Całość działa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.