Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> łapanie wyjątków a połączenie MySql
Gligamesh
post
Post #1





Grupa: Zarejestrowani
Postów: 227
Pomógł: 0
Dołączył: 13.06.2003
Skąd: rykowice

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


Witajcie, poniżej wklejam to co stworzyłem sobie od obsługi błędów i komunikatów (jeszcze nie skończone). Pojawił się spory problem z MySql, chodzi mi o błąd połączenia, proste pytanie jak go złapać ?


  1. $errors = array(
  2. 'error' => array(),
  3. 'warning' => array(),
  4. 'notice' => array());
  5.  
  6. class Error extends Exception
  7. {
  8. protected $level = 'error';
  9. function getLevel()
  10. {
  11. return $this->level;
  12. }
  13. }
  14.  
  15. class Warning extends Error
  16. {
  17. protected $level = 'warning';
  18. }
  19.  
  20. class Notice extends Error
  21. {
  22. protected $level = 'notice';
  23. }
  24.  
  25. function msg($e)
  26. {
  27. global $errors;
  28. $errors[$e->getLevel()][] = (String)$e;
  29. if($e->getLevel() == 'error') {
  30. $tpl = New Template();
  31. $tpl -> assign('e', $e->getMessage());
  32. $tpl -> display('przyklad_bledy.php');
  33. die();
  34. } elseif($e->getLevel() == 'notice') {
  35. // echo $e->getLine().' -> '.$e->getMessage();
  36. }
  37. }
  38.  
  39. function exception_handler($e)
  40. {
  41. msg($e);
  42. }
  43.  
  44. function error_handler($no, $str, $file, $line)
  45. {
  46. if(production_mode === true) {
  47. $msgContent = 'Napotkano błąd aplikacji, numer błędu: '.$no;
  48. } else {
  49. $msgContent = $no.' '.$str.' @ '.$file.' # '.$line;
  50. }
  51.  
  52. msg(new Error($msgContent));
  53. }
  54.  
  55. set_exception_handler('exception_handler');
  56. set_error_handler('error_handler');
Go to the top of the page
+Quote Post
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Wyłapujesz wyjątek za pomocą konstrukcji try {} catch(...) {} Jeśli mogę coś doradzić to nie trać czasu na wymyślanie koła na nowo i skorzystaj z chyba już standardowego i zalecanego rozwiązania pod tytułem PDO, które to rozwiązanie ma już wbudowaną obsługę wyjątków. Korzyść odniesiesz podwójną, bo poprawne używanie PDO zwiększa poziom bezpieczeństwa tworzonych rozwiązań webowych.
Go to the top of the page
+Quote Post
thek
post
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Jeśli uprzesz się na robienie po swojemu... Zobacz co zwraca mysql_connect i pozostałe funkcje mysql_* w przypadku błędów... Wykorzystaj to w swojej klasie (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Gligamesh
post
Post #4





Grupa: Zarejestrowani
Postów: 227
Pomógł: 0
Dołączył: 13.06.2003
Skąd: rykowice

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


widzę że nie zrozumieliście problemu. Więc troszeczkę jaśniej

kolejność ładowania
- błędy
- sql

błąd się oczywiście wyświetla
  1. "mysqli_connect() [function.mysqli-connect]: (28000/1045): Access denied for user 'ODBC'@'localhost' (using password: NO)"

zgodnie z definicją w msg(). Problem polega na tym by ten komunikat nadpisać, czyli musimy jakaś odróżnić w msg() błędy sql.

PDO - w sumie używałem go krótko i dawno temu, ale nie widzę żadnych powodów by go używać.

po co try{} skoro jest handler ?
Go to the top of the page
+Quote Post
Quadina
post
Post #5





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

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


Zapraszam na stronę dokumentacji http://www.php.net/manual/pl/mysqli.connect.php nie jest napisane, że rzuca wyjątkiem, zatem będzie po prostu drukować błąd na standardowe wyjście. W dokumentacji jest ten opisane jak to ominąć. Można sobie popatrzyć na dowolny ORM i zobaczyć, że w mysqli zawsze obsługa błędu połączenia to @mysqli_connect i $mysqli->connect_error.

Ogólnie popieram darko - nie ma sensu wymyślać koła na nowo. A używanie try{}catch jest po prostu bardziej estetyczne i w coraz szerszych kręgach profesjonalne. W PHP odchodzi się już od myślenia funkcyjnego mimo, że PHP wciąż jest językiem paradygmatowym.
Go to the top of the page
+Quote Post
Gligamesh
post
Post #6





Grupa: Zarejestrowani
Postów: 227
Pomógł: 0
Dołączył: 13.06.2003
Skąd: rykowice

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


Cytat
Zapraszam na stronę dokumentacji http://www.php.net/manual/pl/mysqli.connect.php nie jest napisane, że rzuca wyjątkiem, zatem będzie po prostu drukować błąd na standardowe wyjście. W dokumentacji jest ten opisane jak to ominąć. Można sobie popatrzyć na dowolny ORM i zobaczyć, że w mysqli zawsze obsługa błędu połączenia to @mysqli_connect i $mysqli->connect_error.


przeczytaj wszystko co napisałem i pomyśl czemu to nie zadziała. (...) Po za tym nie wiem czy zauważyłeś że błąd jest poprawnie załapany...

Cytat
nie ma sensu wymyślać koła na nowo.
a czy ktoś je wymyśla ?

Cytat
A używanie try{}catch jest po prostu bardziej estetyczne i w coraz szerszych kręgach profesjonalne. W PHP odchodzi się już od myślenia funkcyjnego mimo, że PHP wciąż jest językiem paradygmatowym.
Pierwsze słyszę, no ale kłócił się nie będę, jak lubisz ciągle klepać to samo to sobie klep. Biorąc pod uwagę że jeszcze niedawno OOP w php prawie nie istniało a dziś mamy zaledwie marne naśladownictwo... to fakt odchodzi się.

Jeśli mogę to prosił bym o skupienie się na problemie.

Ten post edytował Gligamesh 9.02.2011, 12:20:04
Go to the top of the page
+Quote Post
kalmaceta
post
Post #7





Grupa: Zarejestrowani
Postów: 183
Pomógł: 24
Dołączył: 4.12.2010

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


twoje wypowiedzi:
Cytat
chodzi mi o błąd połączenia, proste pytanie jak go złapać ?

Cytat
Po za tym nie wiem czy zauważyłeś że błąd jest poprawnie załapany...

i nadal nie wiadomo o co ci chodzi bo nie tyle wymyślasz kolo od nowa, ile utrudniasz sobie życie

Ten post edytował kalmaceta 9.02.2011, 12:36:01
Go to the top of the page
+Quote Post
Gligamesh
post
Post #8





Grupa: Zarejestrowani
Postów: 227
Pomógł: 0
Dołączył: 13.06.2003
Skąd: rykowice

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


Cytat
nie tyle wymyślasz kolo od nowa, ile utrudniasz sobie życie
no to wyjaśnij mi proszę w czym sobie życie utrudniam ? i co takiego robię co już jest zrobione ?

Łopatologicznie:
to co przedstawiłem skutecznie łapie błąd w taki sposób jaki sobie zdefiniujemy ($msgContent), jak pisałem wyżej chodzi o proste rozpoznanie błędu połączenia z serwerem, błędu wyboru / dostępności bazy.


Ten post edytował Gligamesh 9.02.2011, 15:29:11
Go to the top of the page
+Quote Post
kalmaceta
post
Post #9





Grupa: Zarejestrowani
Postów: 183
Pomógł: 24
Dołączył: 4.12.2010

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


łopatologicznie: strpos() na $str i sprawdzasz czy zawiera mysql_connect itd. pomóc może też debug_backtrace()

utrudniasz sobie życie, bo zajmujesz się grupowaniem błędów zamiast ich usuwaniem - masz problem z szufladkowaniem błędów na takim a nie innym poziomie i dopóki tego nie zrozumiesz (i troche pokory) uzyskane informacje nie pomogą ci w debugu w jakiej by nie były formie. Dobry debug i profiler jest w każdym FW, PDO samo ma niezłe możliwości.
Go to the top of the page
+Quote Post
Gligamesh
post
Post #10





Grupa: Zarejestrowani
Postów: 227
Pomógł: 0
Dołączył: 13.06.2003
Skąd: rykowice

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


debug_backtrace() - nic przydatnego nie zwraca podobnie jak getTrace()
strpos() - no można i milion innych, miałem nadzieje że jest na to jakiś ładny i fajny sposób

Cytat
utrudniasz sobie życie, bo zajmujesz się grupowaniem błędów zamiast ich usuwaniem - masz problem z szufladkowaniem błędów na takim a nie innym poziomie i dopóki tego nie zrozumiesz.
no tutaj to mnie troszkę poraziłeś. W ramach wyjaśnienia do debugowania i obsługi błędów używam zupełnie czego innego (co nie trafia finalnie na serwer), kto tutaj wmieszał PDO i po co ? nie wiem. To co stworzyłem fakt jest stare (to tylko odświeżenie), ale nigdy nie miało służyć do tego o czym tu piszecie, z błędami ma tylko tyle wspólnego że je łapie i albo wyświetli w naturalnej formie albo zdefiniowany tekst. I masz racje błędy są po to by je usuwać, tylko że jak Ci stock albo serwer zdechnie to raczej wypada w jakiś ładny sposób o tym poinformować. Więc odpowiadając na Twój zarzut, nie szufladkuje błędów i nie mam z tym problemów (ale owszem wrzucam je do jednego wora > wszystkie).

Odnośnie PDO, osobiście do niego nic nie mam ale go nie używam bo nie jest mi potrzebne do szczęścia, czy podnosi poziom bezpieczeństwa ? mity i legendy. Dla mnie jego największą zaletą jest mobilność i współpraca z chyba każdym popularnym silnikiem bazodanowym. Z resztą jak pisano miał zostać w php6 podobnie jak mysqli (które też jest obiektowe i całkiem ciekawe).

odnośnie framework'ów, firmy wymagają przeważnie Zenda dlatego tylko jego jestem zwolennikiem, jednak uważam że używanie tak rozbudowanych narzędzi to prostych stron jest trochę przekombinowane.

Sumując, nie używam czegoś co nie jest mi potrzebne, czytać nie będę stosował FW/PDO bo inni tak mówią, bo jest fajne czy modnie jest używać. Nie jednokrotnie analizowałem na stałe używać Zenda, (PDO też)


Odnośnie tematu, to myślę że nie ma sensu dalej dywagować, działa jak ma, skoro się inaczej nie da to trudno. Thx za zainteresowanie.

Ten post edytował Gligamesh 9.02.2011, 16:45:21
Go to the top of the page
+Quote Post
darko
post
Post #11





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Cytat(Gligamesh @ 9.02.2011, 16:34:08 ) *
kto tutaj wmieszał PDO i po co ? nie wiem. Odnośnie PDO, osobiście do niego nic nie mam ale go nie używam bo nie jest mi potrzebne do szczęścia, czy podnosi poziom bezpieczeństwa ? mity i legendy. Dla mnie jego największą zaletą jest mobilność i współpraca z chyba każdym popularnym silnikiem bazodanowym.
Sumując, nie używam czegoś co nie jest mi potrzebne, czytać nie będę stosował FW/PDO bo inni tak mówią, bo jest fajne czy modnie jest używać.

Gdybyś tylko chwilę poświęcił na lekturę manuala doczytałbyś, o czym już zresztą wspomniał ~thek, co zwracają funkcje z rodziny mysql_* w przypadku błędu oraz jak za pomocą funkcji is_resource można sprawdzić czy w ogóle masz połączenie z bazą danych. Ty jednak wolisz sam tworzyć "mity i legendy", a my Cię nie mamy zamiaru powstrzymywać, skoro sam wiesz lepiej , co jest dla Ciebie dobre. Chciałbym tylko usłyszeć chociaż jeden sensowny argument przeciw używaniu PDO, poza tym nikt Ci niczego nie każe stosować, ostateczną decyzję podejmiesz sam.
Go to the top of the page
+Quote Post
Gligamesh
post
Post #12





Grupa: Zarejestrowani
Postów: 227
Pomógł: 0
Dołączył: 13.06.2003
Skąd: rykowice

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


Cytat
Chciałbym tylko usłyszeć chociaż jeden sensowny argument przeciw używaniu PDO
czy gdzieś ktoś napisał że jest złe ? "darko" to może Ty spróbuj przekonać mnie do PDO (ale może na PW), skoro jest takie fajne to może ma coś o czym nie wiem.

is_resource, mysql_* i inne a zwłaszcza "Gdybyś tylko chwilę poświęcił na lekturę manuala doczytałbyś" - tutaj warto najpierw spojrzeć na siebie a potem krytykować innych, więc teraz ty zajrzyj do manula (albo bardziej podstaw php) i zobacz dlaczego to nie zadziała.

eh.. wiecie co ja nie jestem żaden guru, nie mam żadnej udokumentowanej wiedzy na temat php bo raczkuje w tym języku ale znam jego podstawy przynajmniej tak mi się wydaje. Jak stwierdził "kalmaceta" trochę pokory i by się przydało ale jak czytam co niektóre osoby wypisują to mnie po prostu na nią nie stać. Problem był z 1 błędem a wy z tego robicie nie wiadomo jakie grupowanie (z ciekawości co na to wskazuje ?), i wkładacie mi w usta nie wiadomo co. Gdzie ja napisałem że PDO jest złe ? to że czegoś nie chce używać bo nie widzę potrzeby to nie znaczy żę jest to nie wiadomo jakie badziewie, ludzie ile wy macie lat ? ! Kolejna sprawa, to nie jest podstawówka i wierzcie mi że nie raz przekopywałem manul w poszukiwaniu rozwiązań, wam za to nawet przez myśl nie przeszło że może ten prosty sposób nie zadziała.

W ramach wyjaśnienia do czego służy to co robię, oczywiście krytyka mile widziana (tylko sensowna). Potrzebowałem czegoś co w prosty i wygodny sposób umożliwi mi informowani o efekcie akcji użytkownika, czyli głupie proste wyświetlanie napisu "operacja się udała" "albo nie". Przy okazji stwierdziłem że ładnie będzie wyświetlić błędy (o ile się jakieś zdarzą) w konkretnym miejscu w jakiś cywilizowany sposób. Postanowiłem więc połączyć w to jeden worek. ot tyle.

Ten post edytował Gligamesh 9.02.2011, 22:45:17
Go to the top of the page
+Quote Post
kalmaceta
post
Post #13





Grupa: Zarejestrowani
Postów: 183
Pomógł: 24
Dołączył: 4.12.2010

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


po pierwsze przeczytaj swój pierwszy post - nie umiem złapać błędu, później piszesz że nie w tym rzecz, jak napisałem strpos to odpowiedziałeś że wiedziałeś, ale coś tam myślałeś..., rotfl

co do krytyki samego rozwiązania, na cholerę użytkownikowi wiedza że to błąd SQL, czystego php, linii, funkcji - jedyne co go może interesować to błędne dane przez niego wprowadzone, które powinny być odfiltrowane zanim przystąpisz do jakiejkolwiek akcji czyli error handler z tego powodu nic nie otrzyma do pracy.
Go to the top of the page
+Quote Post
Gligamesh
post
Post #14





Grupa: Zarejestrowani
Postów: 227
Pomógł: 0
Dołączył: 13.06.2003
Skąd: rykowice

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


Cytat
po pierwsze przeczytaj swój pierwszy post - nie umiem złapać błędu, później piszesz że nie w tym rzecz, jak napisałem strpos to odpowiedziałeś że wiedziałeś, ale coś tam myślałeś...
tutaj niestety masz racje, cóż zobacz godzinę publikacji (IMG:style_emoticons/default/tongue.gif) dlatego szybko w drugim poście się poprawiłem. Użyłem preg_match(), ale poprawiłem na strops'a bo tutaj też zadziała a jest na pewno szybszy. Myślałem po prostu że jest coś wbudowanego o czym nie wiem, tyle.

ad krytyki, tak masz rację i tak jest zrobione. Zobacz co jest w error_handler(), albo wyświetli się błąd w tradycyjnej postaci, albo tylko informacja że jest błąd i nic więcej. I tylko tyle otrzyma zwykły user, chciałem dodać tylko inny monit dla problemów z sqlem. Odnośnie filtrowania danych itd, tym już zajmuje się model (generuje listy, formularze, przeprowadza walidacje) i informuje nas o efekcie rzucając lub wywołując msg(). Wydaje mi się to dość wygodne.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 13:28