Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP][PDO] Zapobieganie podwójnym rekordom.
mlawnik
post
Post #1





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


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


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sowiq
post
Post #3





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mlawnik
post
Post #4





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


@nospor Racja, już sprawdzam
@sowiq, ale jeżeli to jest AUTO_INCREMENT to chyba nie muszę?


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Powód edycji: [nospor]:


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sowiq
post
Post #6





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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

Ten post edytował sowiq 10.06.2013, 13:53:09
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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....


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sowiq
post
Post #8





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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]
.....


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mlawnik
post
Post #10





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


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


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sowiq
post
Post #12





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Powód edycji: [nospor]:


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mlawnik
post
Post #14





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


Pomógł leci.

Pozdrawiam,
mlawnik

Ten post edytował mlawnik 10.06.2013, 14:14:02


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 14:47