Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony2][SF2][SF]Obsługa wyjątku przy usuwaniu rekordu z bazy
amii
post 16.07.2014, 14:09:30
Post #1





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


W ajaxie obsługuje usuwanie rekordów z bazy i w przypadku błędu (np. usuwania rekordu z powiązanym kluczem obcym) mam zwróconą stronę z błędem 500 (widzę to z poziomu konsoli).
To co chcę osiągnąć to:
- przechwycenie tego wyjątku
- zwrócenie zamiast strony błędu, odpowiedzi w formacie json

W kontrolerze mam tak ale cały czas zwraca stronę z błędem 500
  1. public function usunKlientaAction()
  2. {
  3. $em = $this->getDoctrine()->getManager();
  4. $response = new JsonResponse();
  5. $request = $this->container->get('request');
  6. $klient_id = $request->request->get('klient');
  7.  
  8. $repository = $this->getDoctrine()->getRepository('MojeBundleCMSBundle:Klienci');
  9. $ka = $repository->find($klient_id);
  10.  
  11. try {
  12. $em->remove($ka);
  13. $em->flush();
  14. }
  15. catch (Exception $e) {
  16. $response->setData(array('class' => 'error', 'message' => 'Wystapił błąd podczas usuwania rekordu!'));
  17. return $response;
  18. }
  19.  
  20. $response->setData(array('class' => 'notice', 'message' => 'Rekord został poprawnie usuniety!'));
  21. return $response;
  22. }


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
Damonsson
post 16.07.2014, 14:26:04
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


A co Ty chcesz przechwytywać? Skoro masz zawsze 500, to ślesz request pod zły adres, a nie masz żadnego błędu w zapytaniu, bo nawet tam nie dochodzisz. Więc po prostu to popraw.

Ten post edytował Damonsson 16.07.2014, 14:26:20
Go to the top of the page
+Quote Post
amii
post 16.07.2014, 14:29:56
Post #3





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


Mam błąd np. kiedy usuwam rekord z kluczem obcym. I wtedy pluje coś w stylu: 'cascading remove : integrity constraint violation 1451' chodzi mi o to żeby użytkownik dostał info jako json a nie żeby ajax zwracał error 500


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
Damonsson
post 16.07.2014, 14:38:44
Post #4





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


No to pokaż tego AJAXa którego wysyłasz.
Go to the top of the page
+Quote Post
ohm
post 16.07.2014, 14:50:36
Post #5





Grupa: Zarejestrowani
Postów: 623
Pomógł: 144
Dołączył: 22.12.2010

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


To może lepiej sprawdzić dlaczego wywala 500? A nie próbować go catchować. Relacje masz dobrze "połapane"?
No i czy musisz rekord fizycznie usuwać? Czy nie wygodniej dać mu jakiś status i ustawiać np na deleted.

Ten post edytował ohm 16.07.2014, 14:51:18
Go to the top of the page
+Quote Post
amii
post 16.07.2014, 14:52:41
Post #6





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


AJAX w php wywoływany z poziomu JS to jest właśnie ten fragment co zamieściłem czyli metoda usunKlientaAction()

Jeśli zaś chodzi o JS, to po prostu odwołanie się do tej metody
[JAVASCRIPT] pobierz, plaintext
  1. $( document ).ready(function() {
  2. (function( $ ) {
  3. $('.remove').click(function() {
  4. if (confirm('Czy na pewno chcesz usunąć tego klienta ?')) {
  5. $.ajax({
  6. url : '{{path("ajax_update_klienciusun")}}',
  7. type: 'POST',
  8. data : {
  9. 'klient' : $(this).attr('data-attr')
  10. },
  11. cache : false,
  12. success : function(data) {
  13. $("#flash-messanger").addClass(data.class).html(data.message);
  14. $("#flash-messanger").fadeIn(800);
  15. setTimeout(function() {
  16. $("#flash-messanger").fadeOut('fast');
  17. window.location.reload(true);
  18. }, 5000); // <-- hide after 5000 milliseconds
  19. }
  20. });
  21. }
  22. });
  23. }(jQuery));
  24. });
[JAVASCRIPT] pobierz, plaintext


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
Damonsson
post 16.07.2014, 15:03:48
Post #7





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


[JAVASCRIPT] pobierz, plaintext
  1. $( document ).ready(function() {
  2. (function( $ ) {
  3. $('.remove').click(function() {
  4. if (confirm('Czy na pewno chcesz usunąć tego klienta ?')) {
  5. $.ajax({
  6. url : '{{path("ajax_update_klienciusun")}}',
  7. type: 'POST',
  8. data : {
  9. 'klient' : $(this).attr('data-attr')
  10. },
  11. cache : false,
  12. success : function(data) {
  13. $("#flash-messanger").addClass(data.class).html(data.message);
  14. $("#flash-messanger").fadeIn(800);
  15. setTimeout(function() {
  16. $("#flash-messanger").fadeOut('fast');
  17. window.location.reload(true);
  18. }, 5000); // <-- hide after 5000 milliseconds
  19. },
  20. statusCode: {
  21. 500: function() {
  22. alert("500");
  23. }
  24. }
  25. });
  26. }
  27. });
  28. }(jQuery));
  29. });
[JAVASCRIPT] pobierz, plaintext


Wyłapało? Oprócz Success też masz możliwość dodania error jeszcze
Go to the top of the page
+Quote Post
Crozin
post 16.07.2014, 16:18:16
Post #8





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

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


@Damonsson: 500 Internal Server Error oznacza błąd w skrypcie (nieprzechwycony wyjątek w tym przypadku). Chyba pomyliłeś z 404 Not Found.
@amii: Popraw aplikację, bo zakładasz, że jej działanie oparte jest na błędzie. W zależności od tego co dokładnie potrzebujesz:
1. Albo sprawdź czy dany obiekt w ogóle da się usunąć w danym momencie i na podstawie tego zdecyduj czy w ogóle pokazać linka do usunięcia czy nie. Oczywiście w samej akcji usuwającej również powinieneś mieć tego typu zabezpieczenie.
2. Albo popraw swój kod tak, by w ogóle działał, tj. przed usunięciem danego klienta usuń wszystkie dane które mają z nim relację. Tutaj @ohm również dobrze zauważył, że podobnie jak w większości przypadków tak i tutaj dużo lepiej jest oznaczyć dane jako usunięte - usuwanie danych jest niebezpieczne.

PS. Obiekt Requesta powinieneś przekazać jako argument akcji; nie masz żadnego zabezpieczenia przed CSRF, a co za tym idzie Twój kod jest mało bezpieczny.
Go to the top of the page
+Quote Post
Damonsson
post 16.07.2014, 16:35:46
Post #9





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Dobrze prawisz, myślałem o 500, a napisałem o 404 facepalmxd.gif

Ten post edytował Damonsson 16.07.2014, 16:36:23
Go to the top of the page
+Quote Post
amii
post 17.07.2014, 08:37:38
Post #10





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


Crozin - poprawiłem ten błąd z usuwaniem i kluczami obcymi poprzez nadanie nullable=true, onDelete="SET NULL" dla tabeli z kluczami obcymi.


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
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: 24.07.2025 - 20:35