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
Crozin
post 24.03.2013, 14:37:31
Post #2





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 #3





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

Posty w temacie


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: 14.08.2025 - 04:53