Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP][PDO] Zapobieganie podwójnym rekordom.
Forum PHP.pl > Forum > Przedszkole
mlawnik
Witam.
rać
Mam tabelę z Id i wartością. id używane jest w innej tabeli. Mój kod dodaje poprawnie rekordy, ale gdy ma dodać zduplikowany to zamiast pominąć wyrzuca błąd:

Cytat
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'subjectId' cannot be null


Fragment kodu:

  1. <?php
  2. try {
  3. //put into database
  4. $queryHandleTwo = $pdo->prepare('INSERT INTO subjects SET subjectName=:subjectName');
  5. $queryHandleTwo->bindParam(':subjectName', $subjectName);
  6. $queryHandleTwo->execute();
  7. $subjectId = $pdo->lastInsertId('subjectId');
  8. } catch (PDOException $e) {
  9. if ($e->errorInfo[1] == 1062) {
  10. // duplicate entry, do something else
  11. $queryHandleOne = $pdo->prepare('SELECT subjectId FROM subjects WHERE subjectName = :subjectName');
  12. $queryHandleOne->bindParam(':subjectName', $subjectName);
  13. $subjectIdQuery = $queryHandleOne->fetch(PDO::FETCH_BOTH);
  14. $subjectId = $subjectIdQuery[0];
  15. } else {
  16. // an error other than duplicate entry occurred
  17. echo $e->getMessage();
  18. }
  19. }
  20. ?>


Chciałbym poprosić o nakierowanie na rozwiązanie.

Pozdrawiam,
mlawnik
nospor
Widocznie ten kod:
  1. // duplicate entry, do something else
  2.  
  3. $queryHandleOne = $pdo->prepare('SELECT subjectId FROM subjects WHERE subjectName = :subjectName');
  4.  
  5. $queryHandleOne->bindParam(':subjectName', $subjectName);
  6.  
  7. $subjectIdQuery = $queryHandleOne->fetch(PDO::FETCH_BOTH);
  8.  
  9. $subjectId = $subjectIdQuery[0];

Nie jest wykonywany lub jest wykonywany źle. Ciezko sprawdzić co zwraca?
sowiq
Kod
Column 'subjectId' cannot be null

Czytanie ze zrozumieniem się kłania. W zapytaniu INSERT musisz ustawiać również wartość kolumny 'subjectId', bo Ci krzyczy, że nie może być NULL snitch.gif
mlawnik
@nospor Racja, już sprawdzam
@sowiq, ale jeżeli to jest AUTO_INCREMENT to chyba nie muszę?
nospor
Cytat
@sowiq, ale jeżeli to jest AUTO_INCREMENT to chyba nie muszę?
oczywiscie ze nie muisz To dla sowiq czytanie ze zrozumieniem się klania smile.gif
sowiq
Cytat(nospor @ 10.06.2013, 14:50:27 ) *
oczywiscie ze nie muisz To dla sowiq czytanie ze zrozumieniem się klania smile.gif

No chyba nie chcesz mi powiedzieć, że błąd "SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'subjectId' cannot be null" został wypluty po wykonaniu SELECT'a snitch.gif
nospor
sowiq ale czytaj ze zrozumieniem. Wyraźnie napisał że blad pojawia się dopiero po dodawaniu duplikatu, a nie za każdym razem. Wyraźnie wiec widać, że kod który pluje mu błedem nie jest tu podany..... tu jest podany kod na pobieranie id....
sowiq
Cytat(nospor @ 10.06.2013, 14:54:07 ) *
Wyraźnie wiec widać, że kod który pluje mu błedem nie jest tu podany..... tu jest podany kod na pobieranie id....

To po co mu napisałeś, żeby sprawdził co zwraca podany kod, skoro błąd jest gdzie indziej? biggrin.gif

Cytat(mlawnik)
@sowiq, ale jeżeli to jest AUTO_INCREMENT to chyba nie muszę?

No nie musisz, ale nie podałeś tego drobnego szczegółu snitch.gif
nospor
Cytat
To po co mu napisałeś, żeby sprawdził co zwraca podany kod, skoro błąd jest gdzie indziej?


[Skup się]
ten własnie kod co kazalem mu sprawdzić zwraca mu złe ID, a konkretnie puste ID przez co kod, którego nie podał, wali komunikatem, ze nie podano ID....
[/koniec skupienia]
.....
mlawnik
Cytat(sowiq @ 10.06.2013, 14:59:02 ) *
To po co mu napisałeś, żeby sprawdził co zwraca podany kod, skoro błąd jest gdzie indziej? biggrin.gif


No nie musisz, ale nie podałeś tego drobnego szczegółu snitch.gif


@sowiq, wybacz, wydało mi się oczywiste że id to AUTO_INCREMENT UNIQUE, mój błąd.

@nospor, już doszedłem, czemu nie działało. Zapytanie trzeba po prostu wykonać:

  1. } catch (PDOException $e) {
  2. if ($e->errorInfo[1] == 1062) {
  3. // duplicate entry, do something else
  4. $queryHandleOne = $pdo->prepare('SELECT subjectId FROM subjects WHERE subjectName = :subjectName');
  5. $queryHandleOne->bindParam(':subjectName', $subjectName);
  6. $queryHandleOne->execute();// o w ten sposób
  7. $subjectIdQuery = $queryHandleOne->fetch(PDO::FETCH_ASSOC);
  8. $subjectId = $subjectIdQuery['subjectId'];
  9. } else {
  10. // an error other than duplicate entry occurred
  11. echo $e->getMessage();
  12. }
  13. }


Czy jest jakiś inny ładniejszy sposób na to?

Pozdrawiam,
mlawnik
nospor
Cytat
. Zapytanie trzeba po prostu wykonać:
Nom, czyli błąd był dokładnie tam gdzie kazałem szukać. Na przyszłość sam sprawdzaj tak oczywiste rzeczy smile.gif
sowiq
No OK, w takim razie jesteś lepszą wróżką niż ja. Ja szukałem problemu w podanym przez autora kodzie. IMO było bardzo prawdopodobne, że błąd był generowany przez pierwsze zapytanie.

To chyba przyzwyczajenie, że jak ktoś pisze, że problem sprawia mu cytowany kod, to szukam problemu w cytowanym kodzie. A nie, czekaj... to nie przyzwyczajenie tylko normalność smile.gif

Pozdrawiam.
nospor
Cytat
No OK, w takim razie jesteś lepszą wróżką niż ja. Ja szukałem problemu w podanym przez autora kodzie. IMO było bardzo prawdopodobne, że błąd był generowany przez pierwsze zapytanie.
Ale tu nie było co wróżyć.... wyraźnie napisał że bląd pojawia się dopiero przy duplikacie, a to wyjasniało wszystko.
Fakt, jakby autor raczył podać dalszą cześć kodu, to pewnie byłoby to jeszcze bardziej czytelne
mlawnik
Pomógł leci.

Pozdrawiam,
mlawnik
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.