Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zrzucanie wyjątku w modelu z PDO
Piotrbaz
post 22.03.2013, 21:09:44
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 2
Dołączył: 15.09.2012

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


Witajcie,

Mam problem ze zrzuceniem wyjątku. W modelu mam funkcję save, oto jej ciało:

  1. public function save($task, advertisement $advert, $id = null) {
  2.  
  3. (...)
  4. if ($task == "insert") {
  5. $result = $this->db->prepare("INSERT INTO ads_advertisement
  6. VALUES('',:title, :description, :content, :miniature, :date, :type_id, :category_id)");
  7.  
  8. }
  9.  
  10. $result->bindValue(':title', $advert->getProperty('title'), PDO::PARAM_STR);
  11. //reszta wywołań bindValue (...)
  12.  
  13.  
  14. $result->execute();
  15.  
  16. }


Chcę zrzucić wyjątek, gdy podczas zapisywania wystąpi naruszenie unikalności jakiegoś pola w tabeli, np title.
No i nie wiem gdzie wrzucić throw new Exception('wiadomosc'); Próbowałem sprawdzenie, czy $result->execute() zwróci coś innego niż true, ale nie działa. Wciąż przy wyłapywaniu wyjątku dostaję wiadomość, jakbym w ogóle throw new Exception nie umieśił w Modelu.
Cytat
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'mmmmmmmmmmm' for key 'title'


Kod w kontrolerze:
  1. try {
  2.  
  3. $this->model->save("insert", $new_advert);
  4.  
  5. }
  6. catch (Exception $e) {
  7.  
  8. $this->view->set_Exception($e->getMessage());
  9.  
  10. }


W widoku, wiadomo, wyświetlam komunikat wyjątku.

edit:

Teraz już nie wiem, czy w ogóle mogę własny komunikat wysłać, w manualu znalazłem, że nie powinno się jawnie zrzucać wyjątków klasy PDOException sciana.gif
Ale nie wychodziło nawet z Exception.

Ten post edytował Piotrbaz 23.03.2013, 09:13:41


--------------------
$piotrbaz->get_Signature();
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
dzastin
post 23.03.2013, 11:58:34
Post #2





Grupa: Zarejestrowani
Postów: 29
Pomógł: 2
Dołączył: 27.02.2013

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


Cytat
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'mmmmmmmmmmm' for key 'title'

A to czasem nie jest php'owy fatal? Jeśli tak, to żeby to przechwycić musiałbyś zrobić swój error_handler
Go to the top of the page
+Quote Post
Piotrbaz
post 24.03.2013, 14:00:47
Post #3





Grupa: Zarejestrowani
Postów: 55
Pomógł: 2
Dołączył: 15.09.2012

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


Ok, doszedłem do tego, że miałem w połączeniu z bazą ustawione zrzucanie wyjątków klasy PDOException, a nie mogę ich jawnie zrzucać.

Po usunięciu
  1. setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)

mogę normalnie zrzucać wyjątki Exception. Tylko nie bardzo rozumiem sens PDOException, skoro nie mogę wpisać tam własnego komunikatu.

Ten post edytował Piotrbaz 24.03.2013, 14:05:08


--------------------
$piotrbaz->get_Signature();
Go to the top of the page
+Quote Post
Crozin
post 24.03.2013, 14:37:31
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Powinieneś samodzielnie sprawdzać czy w bazie nie istnieje już dany rekord (unikalna wartość), a nie oczekiwać na wyjątek.
2.
Cytat
Tylko nie bardzo rozumiem sens PDOException, skoro nie mogę wpisać tam własnego komunikatu.
Co to znaczy wrzucić własny komunikat? Jeżeli chcesz jakoś rozbudować zawartość rzucanego wyjątku przechwyć rzucony wyjątek PDO i "opakuj go" we własny wyjątek:
  1. try {
  2. ...
  3. } catch (PDOException $e) {
  4. throw new RuntimeException('Blah blah blah', 0, $e);
  5. }
Go to the top of the page
+Quote Post
Piotrbaz
post 24.03.2013, 19:21:17
Post #5





Grupa: Zarejestrowani
Postów: 55
Pomógł: 2
Dołączył: 15.09.2012

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


Cytat(Crozin @ 24.03.2013, 14:37:31 ) *
1. Powinieneś samodzielnie sprawdzać czy w bazie nie istnieje już dany rekord (unikalna wartość), a nie oczekiwać na wyjątek.

Rozwiązanie z UNIQUE jest prostsze, ale skoro to napisałeś, znaczy że gorsze. Dlaczego ?

Cytat(Crozin @ 24.03.2013, 14:37:31 ) *
2. Co to znaczy wrzucić własny komunikat?


Myślałem, że mogę po prostu zrobić jak ze zwykłą klasą Exception
  1. throw new PDOException("Blah Blah");


Ten post edytował Piotrbaz 24.03.2013, 19:22:26


--------------------
$piotrbaz->get_Signature();
Go to the top of the page
+Quote Post
Crozin
post 24.03.2013, 19:29:58
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Rozwiązanie z UNIQUE jest prostsze, ale skoro to napisałeś, znaczy że gorsze. Dlaczego ?
Chyba źle zrozumiałeś. Klucz typu UNIQUE ma nadal pozostać . Po prostu zamiast:
  1. <?
  2.  
  3. try {
  4. // próba dodania rekordu i operowanie jakgdyby był on unikalny
  5. } catch (... $e) {
  6. // sprawdzenie czy wyjątek dotyczy duplikatu
  7. // jeśli tak: zrób coś
  8. // jeśli nie: throw $e; // rethrow
  9. }
  10.  
  11. Powinieneś zrobić
  12.  
  13. // próba pobrania dupliaktu
  14. // jeśli nie ma: operujesz na unikalnym rekordzie
  15. // jeśli jest: zrób coś z duplikatem
Cytat
Myślałem, że mogę po prostu zrobić jak ze zwykłą klasą Exception
  1. throw new PDOException("Blah Blah");
Wyjątki PDO mają sobą reprezentować jakieś problemy z samym połączeniem z bazą danych i właściwie tylko "wnętrzności" PDO powinny rzucać wyjątek tego typu. Twoje wyjątki nie mają z tym nic wspólnego.
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 Wersja Lo-Fi Aktualny czas: 19.07.2025 - 08:32