Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przejmowanie błędu dostępu w mysql_connect()
Forum PHP.pl > Forum > Bazy danych > MySQL
wisiena
Witajcie!
Jakiś czas temu napisałem klasę do komunikacji z MySql. Wszystkie błędy przechwytuję przy pomocy funkcji:
mysql_errno(); i mysql_error();
Po pojawieniu się ewentualnego błędu, zapisuję go w sesji i przekierowuje do skryptu error.php, który wyświetla elegancką podstronę błędu, pasującą do wyglądu strony.
W tej chwili odkryłem sytuację, w której ta metoda zawodzi. Jeżeli funkcja mysql_connect(); nie może się połączyć, bo na przykład pomylimy nazwę użytkownika, to ani mysql_errno(); ani mysql_error(); nie czyta błędu, a php wyświetla stronę z treścią:
Warning: mysql_connect(): Access denied for user 'xxxxx'@'localhost' (using password: YES) in /www/library/php_classes/db.class.php on line 30
Jak rozwiązać taki problem, może jest zupełnie inna, lepsza metoda na eleganckie wyświetlanie błędów na stronie.

(M.)
pmir13
Trochę dziwi mnie używanie mysql_connect() w obiektowym php, nie lepiej mysqli lub PDO?
A ten komunikat to jest warning php, zależy od ustawień php.ini, error_reporting() i tym podobnych.
Można też jednorazowo:
  1. $db = @mysql_connect('localhost', 'root', 'wrongpass');
  2. if (!$db)
  3. {
  4. $error = error_get_last();
  5. var_dump( $error);
  6. }

wisiena
Dziękuję za odpowiedź!
Z przykrością stwierdzam, że nie zawiera ona rozwiązania mojego problemu. Ja nie chcę wyłączać informacji o błędach i ostrzeżeniach a wyświetlać je w kontrolowany sposób.
Przedstawiona metoda pozwala przeczytać błąd, nie ostrzeżenie i to już po tym jak serwer php wyświetli swoją stronę, czego właśnie chcę uniknąć.
Uwaga na temat funkcji łączenia się z bazą danych jest bardzo lakoniczna acz intrygująca. Czy mogę prosić o jakieś konkretne, techniczne argumenty na poparcie/wyjaśnienie zdziwienia kolegi?

(M.)
d3ut3r
Przeczytaj: http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO

jak widzisz proces łączenia z bazą danych możesz zamknąć w bloku tryi za pomocą catchwyłapać ew błąd w połączeniu.
wisiena
Dziękuję bardzo!
Po przeczytaniu załączonego artykułu na pewno przesiądę się na PDO.
Mój problem rozwiązałem tak:

  1. ini_set('error_reporting', E_ALL);
  2. set_error_handler("errorHandler");
  3.  
  4. function errorHandler ($number, $message, $file = '', $line = '', $context = '')
  5. {
  6. if ((isset($_SESSION['is_open'])) && ($_SESSION['is_open'] == TRUE))
  7. {
  8. $_SESSION['error_number'] = $number;
  9. $_SESSION['error_message'] = $message;
  10. if ($file != '') $_SESSION['error_file'] = $file;
  11. if ($line != '') $_SESSION['error_line'] = $line;
  12. if ($context != '') $_SESSION['error_context'] = $context;
  13. header("Location: error.php");
  14. }
  15. }


Znalazłem w dokumentacji opis jak przypisać własną funkcję, do której trafiają błędy. To załatwia problem błędów zgłaszanych przez mysql_connect();, których nie czytają mysql_errno(); i mysql_error();. Błędy zapytań do bazy nadal czytam standardowo. Co ciekawe, serwer doskonale pokazuje kontekst wystąpienia błędu z zmiennej $context.

(M.)
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.