Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Niewystarczająca informacja o błędzie
Forum PHP.pl > Forum > Przedszkole
sslackware
Witam,

PHP zajmuję się od kilku dni i niestety w tym czasie natrafiłem na bardzo denerwujący mnie problem. Pomimo włączonego error_reportingu
  1. ini_set('display_errors',1);

odnoszę nieodparte wrażenie, że nie o wszystkich błędach z którymi mam do czynienia jestem odpowiednio informowany.

Chociażby w tym wypadku:
  1. <?php
  2. require('error.php');
  3.  
  4. class Strona{
  5.  
  6. private $a;
  7. private $width;
  8.  
  9. public function setA($dane){
  10. $this->a = $dane;
  11. $this->width=100/count($this->a);
  12. }
  13.  
  14. public function getA(){
  15. return $this->a;
  16. }
  17.  
  18. public function menu(){
  19. echo "<table><tr>";
  20. foreach($this->a as $k => $v){
  21. echo "<td width=$this->width bgcolor=\"red\" align=\"center\" ><a href=$v>$k</a></td>";
  22. }
  23. echo "</tr></table>";
  24. }
  25.  
  26. /*public function test(){
  27. echo "test NIEprzeciazony";
  28. }
  29.  
  30. public function test($dane){
  31. echo "test PRZECIAZONY";
  32. }
  33. */
  34. }
  35.  
  36. $b = new Strona();
  37. $b->setA(array("Ala" => "ala.php", "Ola" => "ola.php"));
  38. $b->menu();
  39.  
  40. ?>


Wystarczy, że pola $a, bądź $width pozbawię "przedroska" private i już zamiast oczekiwanego rezultatu wyświetla mi się blank page. Żadnej informacji dotyczącej popełnionego błędu niestety nie otrzymuje, pomimo tego że nieokreślenie widoczności pola danej klasy oznacza chyba że jest ono typu protected ? (strzelam, bo tak jest w Javie winksmiley.jpg ).

To samo dotyczy zakomentowanej przeze mnie metody test. Chciałem sprawdzić jak PHP radzi sobie z przeciązaniem funkcji i ponownie zamiast informacji dotyczącej błędu wyskakuje blank page.

Czy w PHP tego typu rzeczy to standard ? Nie będę bowiem ukrywał, że dojście do błędu (w przypadku określania widoczności pola $a) zajęło mi naprawdę sporo czasu. Dotychczas miałem, przez całe swoje życie, do czynienia z J2SE i J2ME i z sytuacjami takiego typu nigdy się nie spotkałem ...

Z góry bardzo dziękuję za odpowiedź.

Pozdrawiam
Lars_18
No to na pewno nie jest standard - PHP zwykle wyświetla wszystkie błędy. Sprawdź jeszcze ustawienia w php.ini - powinno być error_reporting = E_ALL.
sslackware
Dzięki za odp.

Niestety, ale w php.ini jest error_reporting = E_ALL jest "włączony".
O tyle dobrze, że uspokoiłeś mnie z tymi błędami, bo po wrzuceniu na prywatny serwer (dotychczas sprawdzałem na localhoscie) rzeczywiście te błędy wyskakują. Niestety Localhost bez problemu obsługuje błędy typu warning, notice niestety nie radzi sobie zupełnie z fatal errorami ...

Czy jest coś w takim wypadku co jeszcze mogę zrobić aby te błędy były również widoczne u mnie ?
mls
Kod
error_reporting  =  E_ALL
display_errors = On
display_startup_errors = On
yevaud
wrzuc
i sprawdz czy na pewno error_reporting sie wlaczylo
mortus
Cytat
(Strzelam, bo tak jest w Javie)

Chybiłeś. W Javie takie pole ma zasięg pakietowy i w przeciwieństwie do pola protected nie jest ono dziedziczone.
W PHP pól $a i $width nie można "pozbawić przedrostka", jeżeli już to należy go zastąpić słówkiem var. Oczywiście wpisaniu
  1. class A {
  2. ...
  3. $a;
  4. $b;
  5. ...
  6. }

powinien towarzyszyć błąd. Domyślnie pola w klasie PHP mają dostęp publiczny (przynajmniej w obecnych wersjach). Pola opatrzone słówkiem var, to również pola publiczne.

Cytat
Nie będę bowiem ukrywał, że dojście do błędu (w przypadku określania widoczności pola $a) zajęło mi naprawdę sporo czasu.

Sporo czasu... i nadal nie doszedłeś.

Niestety w PHP nie można przeciążać metod danej klasy w taki sposób. Rozwiązaniem jest stworzenie metody z parametrem, który domyślnie jest pusty
  1. public test($dane = null) {
  2. }
Taki zapis oznacza, że podczas wywoływania metody test nie musimy podawać jej parametru. Niestety w ciele metody wypadałoby jednak sprawdzić, czy parametr ten został podany. Oczywiście takie rozwiązanie ma swoje ograniczenia.

Odnośnie wyświetlania i raportowania błędów. Spróbuj zastąpić require('error.php'); kodem, o którym już wiesz:
  1. ini_set('display_errors',1);

Możesz nam również pokazać plik error.php, ale uprzednio sprawdź, co pokazuje phpinfo().
sslackware
Witam,

Dziękuję wszystkim za odpowiedź i już piszę, gdzie był błąd - może przyda się innym winksmiley.jpg.

Szukając w Internecie serwera mającego zarówno PHP jak i MySQL znalazłem WampServer. To przy jego pomocy edytowałem plik php.ini, który jak się właśnie okazało wcale nie był "oczekiwanym" plikiem. Mianowicie, podczas przeszukiwania dysku w celu znalezienia php.ini odnalazłem go między innymi w Program Files/PHP. Oczywiście plik ten w ogóle nie posiadał wprowadzonych przeze mnie wcześniej zmian. Po ich wprowadzeniu wszystko działa już zgodnie z oczekiwaniami winksmiley.jpg. WampServer edytował plik znajdujący się w C:\wamp\bin\php\php5.2.8, a odwoływał się do tego z Program Files/PHP.

Jeszcze raz dzięki, bo naprowadziliście mnie do znalezienia błędu.

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.