Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wysyłanie pustego pliku do przeglądarki przy obsłudze wyjątków
Forum PHP.pl > Forum > PHP > Object-oriented programming
albrzykowski
Witam,

Mam następujący problem, mam własną klasę do obsługi bazy danych i drugą raportującą błędy na zasadzie zapisania informacji o błędzie w bazie.

Oto fragment kodu gdzie skrypt zaczyna się dziwnie zachowywać (opiszę poniżej):
  1. <?php
  2. public function execute($query){
  3.                $this->result = mysql_query($query);
  4.                if($this->result!=FALSE){
  5.                        return $this->result;
  6.                }
  7.                else{
  8.                        throw new ExceptionHandler(_(__CLASS__.': query error: '.$query),3);
  9.                        return FALSE;
  10.                }
  11.  }
  12. ?>


Jeśli w zapytaniu pojawi się błąd, np. zwykła literówka na zasadzie brak ', wtedy zamiast uzyskania błędu w przeglądarce, lub zapisania go przez ExceptionHandler, serwer wysyła mi pusty plik PHP do sićgnięcia przez przeglądarkę (plik typu: application/x-httpd-php).

Jeśli zarzucę obsługę błedów własną klasą i klasycznie zrobie tak:
  1. <?php
  2. public function execute($query){
  3.                $this->result = mysql_query($query) or die(mysql_error);
  4. ?>

Skrypt zachowuje się już w bardziej oczekiwany sposób, tj. wyrzuca błąd i zatrzymuje się.

Proszę o sugestie i z góry dziękuję.
bazyliszek83
Wklej proszę troche wiecej kodu. M.in. kod klasy "ExceptionHandler" i jakiś prosty przykład użycia funkcji execute()...
albrzykowski
Hej,

No teraz zapytania nie wkleje ale przykładowo np w memencie gdy wyglądałoby tak (z błędnem)
  1. SELECT * FROM tabela WHERE id=3'
(błąd z ' )

Kod klasy do obsługi wyjatków jest taki:
  1. <?php
  2. /**
  3.  * Class to handle the exceptions
  4.  *
  5.  */
  6. class ExceptionHandler extends Exception{
  7.        /**
  8.          * @var string
  9.          */
  10.        protected $message;
  11.        /**
  12.          * Constructor
  13.          * @param $message
  14.          * @param $code
  15.          * @access public
  16.          */
  17.        public function __construct($message,$code=NULL){
  18.                parent::__construct($message,$code);
  19.                $this->log();
  20.        }
  21.        /**
  22.          * Method to return message
  23.          * @access public
  24.          * @return string
  25.          */
  26.        public function __toString(){
  27.                return $this->message;
  28.        }
  29.        /**
  30.          * Method to log the exceptions
  31.          * @access public();
  32.          */
  33.        public function log(){
  34.                $db = new Model();
  35.                $sql = 'INSERT into exception_logs (message,code,file,line) VALUES(';
  36.                $sql.= '''.$this->message.'',';
  37.                $sql.= $this->code.',';
  38.                $sql.='''.$this->file.'',';
  39.                $sql.=$this->line.')';
  40.                $db->execute($sql);
  41.        }
  42. }
  43. ?>


Dziękuję i pozdrawiam!
bazyliszek83
Spróbuj może to "zdebagować" i zamiast wyrzucać wyjątek, zrobić echo "Błąd!!!"; . Będziemy wtedy wiedzieli czy w ogóle dochodzi do tego momentu.
albrzykowski
Hej,

Przygotowałem specjalnie błąd:

w kontrolerze dodaje newsa:
  1. <?php
  2. $this->content->update('newses','title,excerpt,content,published','''.$newsTitle.'''::''.$newsExcerpt.''::''.$newsContent.''::''.$newsPublished.''',array('id'=>'='.$newsId));
  3. ?>

To :: rozgranicza pola dla metody update modelu (tylko dodaje żeby było wiadomo)
I błąd jest zaraz po $newsTitle o jeden pojedynczy cudzysłów za wiele.

metoda update wywołuje wewnetrzną metodę execute którą już wcześniej opisałem:
  1. <?php
  2. public function execute($query){
  3.        $this->result = mysql_query($query);    
  4.        if($this->result!=FALSE){
  5.            return $this->result;
  6.        }
  7.        else{
  8.            throw new ExceptionHandler(_(__CLASS__.': query error: '.$query),3);
  9.            return FALSE;
  10.        }
  11.    }
  12. ?>


I w momencie próby zapisania newsa skrypt nie zgłasza nic tylko dostaje do pobrania plik PHP... pusty.
Może powinienem obsłużyć lepiej raportpowanie i zamknąć odpowiednie partie kodu w try{} i catch{} tylko nie zabardzo wiem jak to ugryźć.

Dzięki i pozdrawiam!!
Noddi
Napisz w jaki sposób wyłapujesz ten wyjątek, bo narazie pokazałeś, że go tylko wyrzucasz.

Pozdrawiam.
albrzykowski
Hej,

Wyłapuje wyjątek w ten sposób:

  1. <?php
  2. public function select($table,$columns,$conditions=NULL)
  3.    {
  4.        $columns = $this->makeColumns($columns);
  5.        $sql = 'SELECT '.$columns;
  6.        $sql.= ' FROM '.$table;
  7.        if(!empty($conditions))
  8.        {
  9.            $sql.= $this->makeConditions($conditions);
  10.        }
  11.        $sql.=' ORDER BY 'id'';
  12.        if(isset($this->limit)){
  13.            $this->makePagination($table,$conditions);
  14.            $sql.= ' LIMIT '.$this->pagination['startFrom'].','.$this->pagination['limit'];
  15.        }
  16.        try{
  17.            $this->execute($sql);
  18.        }
  19.        catch(ExceptionHandler $e){continue;}
  20.    }
  21. ?>


Pozdrawiam.
Noddi
Pusta strona pojawia się dlatego, że nie masz włączonego raportowania błędów. Wyjątki wyłapujesz nieprawidłowo, continue możesz wykorzystywać tylko w pętlach. Zamiast continue albo wyświetl treść wyjątku, albo np. zapisz do pliku.
albrzykowski
Hej,

Napisze po kolei:

- 1 w configu, w wersji dev mam:
  1. <?php
  2. ini_set('display_errors',1);
  3. ?>


- 2 Jesli chodzi o continue, to rzeczywiście głupi błąd, z mojej strony, nie mniej nie pomogło mi w niczym jego usunięcie.
- 3 Wolałbym obsługę zapisywać w bazie a nie w pliku choć przyznam, że pod niektórymi względami plik może bardziej nadawałby się do tego...
- 4 Wyjątków nie chcę wyrzucać na ekran. Raportowane są tylko błędy "poważniejsze" np właśnie związane z DB i nie chce powiadamiać o nich, "zwykłych" userów.
Natomiast napisałeś ~Noddi, że nieprawidłowo wyłapuję wyjątki, byłbym wdzięczny jeśli byś to rozwiną i zasugerował inne rozwiązanie.

Z góry dzięki!!
Noddi
Błędu dopatrywałem właśnie w nie wyświetlaniu errorów, bo przy continue w bloku catch powinno wyświetlić error o nieprawidłowym zastosowaniu continue. Co do możliwości wyświetlania, zapisu do pliku/bazy danych to tylko i wyłącznie Twój wybór. Napisałem, że nieprawidłowo wyłapujesz wyjątki ze względu na umieszaczenie continue w catch.

PHP + Apache masz prawidłowo skonfigurowane, inne skrypty działają?

Pozdrawiam.
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.