Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obsługa błędów
Forum PHP.pl > Forum > PHP
Malinaa
Witam,
mam taką funkcje do obsługi błędów.

Chciałbym ją usprawnić, poprawić błędy jeśli są, dodać obsługe błędów zapytań,
obsługe tych będów o których nie wiem.

  1. // OBSLUGA BLEDOW
  2. set_error_handler('ErrorHandler');
  3. // date_default_timezone_set('Europe/Warsaw'); Cos nie tak z funkcja na serwerze ?
  4.  
  5. // Prosty handler do logowania bledow
  6. function ErrorHandler($errLevel, $errMessage, $errFile, $errLine) {
  7. global $path;
  8. $data = date('Y-m-d H:i:s');
  9. $file = date("Ymd").'_'.basename($_SERVER['PHP_SELF'],".php").'.log';
  10. $file_path = $path.'logs/'.$file;
  11.  
  12. $msg = "Czas: $data\r\n Plik: $errFile\r\n Linia: $errLine\r\n Poziom: $errLevel\r\n $errMessage\r\n";
  13.  
  14. $log = fopen($file_path, 'a');
  15. fwrite($log, $msg);
  16. fclose($log);
  17.  
  18. return true;
  19. }


Pytania:
- Dlaczego na localhost muszę dodać funkcje date_default_timezone_set(), aby ErrorHandler() działał bez błędów, a na serwerze ta funkcja nie działa, ale całość działa dobrze bez tej funkcji?
- Jak dodać obsługę błędów zapytań?
Czy trzeba tutaj, przy każdym zapytanie dodać np. trigger_error(mysql_error()); , czy można prościej w inny sposób.
- Czy o czymś nie wiem i nie uwzględniłem w obsłudze błędów i zapisaniu logów błędu w pliku.

Chciałbym prosić o więcej informacji na ten temat.
Smertius
Cytat
- Jak dodać obsługę błędów zapytań?
Czy trzeba tutaj, przy każdym zapytanie dodać np. trigger_error(mysql_error()); , czy można prościej w inny sposób.


Najprościej skorzystać z PDO i rzucać wyjątkami
Malinaa
Bez PDO, z samych połączeniem z bazą nie byłoby problemu,
zmiana w jednym pliku i gotowe, ale zapewne musiałbym przerobić zapytania itp. itd.,
nie nie, to nie jest najlepszy pomysł.
cojack
O Jezu, przecież to jest temat rzeka, możesz sobie zrobić fabrykę do sql'a i ładnie ją dekoratorem upięknić, później błędy możesz albo wyjątkami rzucać albo trigger_error(). Możesz też zrobić odwróconego obserwatora, w tym że będzie wiele obserwujących a tylko jeden obserwowany, no róbta co chceta. Jak masz php 5.3 to dodaj sobie : "E_ALL | E_STRICT", poza tym brakuje Ci obsługi fatal errorów. Używanie globali w takim miejscu to chyba najgłupszy pomysł. Jak się coś psuje to musi mieć to osobny interfejs, który z założenia nie może się zepsuć.

* Dlaczego na localhost muszę dodać funkcje date_default_timezone_set(), aby ErrorHandler() działał bez błędów, a na serwerze ta funkcja nie działa, ale całość działa dobrze bez tej funkcji?

Hmmmm dziwna sprawa, może sprawdź sobie pierw: date_default_timezone_get, ale pierwszy raz się spotykam z takim błędem. Bo błąd nie opisany i napisany tylko że jest błędem, nie jest błędem.
Malinaa
Funkcja date_default_timezone_set() prawdopodobnie na serwerze było PHP4 i pewnie stąd problem.

Cytat
Używanie globali w takim miejscu to chyba najgłupszy pomysł.


Chcę bez global $path; ale muszę mieć adres ścieżki w funkcji, który jest zmienny.
Plik z funkcją jest includowany i może być załadowany w każdym pliku.php i różnym katalogu:
/ - katalog główny
/katalog/
/katalog/katalog/ itd.

Jak mogę inaczej podać zmienną scieżkę to pliku w tym przypadu jeśli pliki z logami znajdują się w katalogu:
/logs/

Wcześniej miałem tak, bez głupstw typu global $path; :
$file_path = dirname($_SERVER['SCRIPT_FILENAME']).'/logs/'.$file;
ale działało dobrze tylko dla katalogu głównego.
KKH
Cytat(Malinaa @ 23.02.2011, 13:54:20 ) *
- Dlaczego na localhost muszę dodać funkcje date_default_timezone_set(), aby ErrorHandler() działał bez błędów, a na serwerze ta funkcja nie działa, ale całość działa dobrze bez tej funkcji?


To kwestia działania funkcji date(). Poczytaj jej opis w manualu, a zobaczysz, że w jednym miejscu może ona działać bez date_default_timezone_set(), a w innym nie.

PS. pojęcia localhost, "u mnie" i "na serwerze" są zupełnie nieścisłe. Podawaj raczej konfiguracje środowisk.
cojack
@Malina:

jeżeli wiesz że ten skrypt jest w katalogu:

/var/www/TwojaStrona/publich_html/jakis_katalog/obsluga_bledow.php

a bledy zapisujesz w:

/var/www/TwojaStrona/publich_html/bledy/errors.txt

to przeciez możesz zrobić tak:

  1. $path = dirname(__FILE__).'/../';

i też Ci będzie działać wink.gif
Malinaa
No tak,
ale skąd mogłem to wiedzieć smile.gif

Używałem kiedyś tego typu ściezki,
tzn. $path = dirname(__FILE__).'/';
ale wciąż nurtowała mnie taka nie spójność
zależnie od serwera (systemu)
ścieżka miała postać
- /home/serwer/public_html/pliki/errors.log // OK
ale np. na localhost - C:\Program Files\serwer\html/pliki/errors.log // znak slasha i backslesha w ścieżce

Napisałem więc funkcje która rozpoznaje ścieżkę względną ($path = './','../','../../' itd.) zamiast jak wyżej bezwzględnej $path = dirname(__FILE__).'/'; i problem rozwiązany, ale w tym przypadku globals $path nie jest najlepszym rozwiązaniem może więc skorzystam z Twojego, ponieważ działa bez problemu tylko ta nie spójność slash i backslesh w jednej ścieżce?
cojack
So you can use the const DIRECTORY_SEPARATOR if you have diferents os on direct server and localhost to work it properly.
Malinaa
jeżeli dobrze rozumię
wystarczy zrobić tak: $fpath = dirname(__FILE__).DIRECTORY_SEPARATOR; // zaleznie od systemu moze byc slash lub backslesh
i ten problem też będzie rozwiązany.

Cytat
poza tym brakuje Ci obsługi fatal errorów

Można wiedzieć coś więcej jak taką obsługę fatal errorów dobrze zrobić.
Czy są gdzieś dostępne przykłady?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.