[PHP] Blokada pokazywania warningów

0

Witam
Czy jest możliwość zastosowania pojedyńczej funkcji która zapobiega wyświetlaniu wszystkich komunikatów, błędów, ostrzeżeń i innych pierdół parsera?? Tzn standardowo jest tak że jeśli coś jest źle to wyskakuje "warning...", i można to ominąć przez stawianie @ przed funkcją.. Tylko to działa dla pojedyńczego polecenia. Ja bym chciał coś takiego dla całej strony zastosować.

//pozdrawiam pinokio999

0

error_reporting() + manual

0

Jak wspomniał madmike, ale... zamiast tego lepiej poprawić kod, by nie było powodu do warningów ;]

0

Błędów nie ma, ale to taki drobny cms, i nigdy nie wiadomo kiedy wyskoczy jakiś błąd..

0

To lepiej ukrywać bład niż wyświetlić i mieć później jakieś zgłoszenie? Ukrywając nie masz szans na wykrycie błędów w pewnych sytuacjach, których nie przewidziałeś.

0

Nie no, to akurat dobre działanie. Ukrycie błędów dla ludzi, logowanie do pliku.
W firmie z tego korzystamy ;)
// to się robi ustawiając display_errors = Off, zmiana error_reporting na 0 powoduje niezapisywanie się błędów do errorloga. - n

0

Mam tak napisaną stronę że widać że coś jest nie tak ,anwet gdy warningów NIE MA, a strona dla znajomej, i nie zawsze można będzie mnie szybko poprosić o poprawienie jak coś będzie nie tak:)

0

To nie najlepsza ta strona skoro dziala zle nawet jak bledow/ostrzezen nie pokazuje ;)

0

Nie oto chodziło:) po prostu jestem początkujący, i jakoś tak wyszło:) ale wiesz, przynajmniej użytkownikom warningi oka nie psują, tego błędu grafiki nie widza co się wtedy pojawia, a ja wiem że coś jest nie tak i na sekunde warningi włączam i sprawdzam:)

0

Aaaa, o to chodzilo. To zrob tak jak radzi Marooned. Logowanie mozesz oprzec na wykorzystaniu tej funkcji: http://pl.php.net/manual/pl/function.set-error-handler.php

0

Ale poco jakieś logowanie zrobić?? tzn co mi to da?

0

To, że będziesz wiedział co jest nie tak, ale oszczędzisz tej wiedzy użytkownikowi i potencjonalnemu włamywaczowi.

Swoją drogą mam pytanie związane z tematem. Czy złe jest pisanie kodu w stylu

if ( $zmienna ) zamiast używania isset i empty?

W zasadzie jeśli zmienna nie istnieje, to warunek nie zostaje spełniony. Tak samo gdy długość zmiennej = 0. Oczywiście używając takiej konstrukcji zakładam również ukrywanie błędów i warningów przed użytkownikami.

0

Ja tak robiłem ,jednak gdy przestawiłem na pokazywanie wszystkich komunikatów parsera, pokazało że to błąd:)

0

Aaa takie logowanie:) do logów:) rozumiem:P A ktoś może mi wytłumaczyć jak to działa, bo z manualka nie rozumiem zbytnio- za słaby jestem ^^

0

Mógłby ktoś mi napisać taki drobny skrypt który nie pokazuje zawartości warningów tylko zapisuje je do pliku, dodając datę?? Byłbym wielce wdzięczny

0

a ja polecam zgłaszanie błędów jako wyjątków (wtedy mamy gratis ścieżkę wywołań, czy jak to się zwie), a zapisywanie na dysku już przechwyconych wyjątków - od razu z zapisanymi danymi z $_POST, $_GET itp

0

Błed typu "echoc" nie sa standardowo wyświetlane. Pokazuje za to błąd jeśłi wpiszę echoc()
Ten skrypt loguje tylko te błędy które nie są standardowo wyświetlane na monitorze. A te któ¶e wyświetla, nie są w pliku zapisane. Chciałbym aby się żadne błędy nie wyświetlały, za to aby się wszystkie zapisywały do pliku(najlepiej w standardowych formach)

PS zdaje się fatal errors są wyświetlane, i nie dodawane

0

Dobra, mam takie coś:

<?php
function my_error_handler($errno, $errstr, $errfile, $errline){
    $errno = $errno & error_reporting();
    if($errno == 0) return;
    if(!defined('E_STRICT'))            define('E_STRICT', 2048);
    if(!defined('E_RECOVERABLE_ERROR')) define('E_RECOVERABLE_ERROR', 4096);
    switch($errno){
        case E_ERROR:               $print= $print."Error";                  break;
        case E_WARNING:            $print= $print."Warning";                break;
        case E_PARSE:               $print= $print."Parse Error";            break;
        case E_NOTICE:             $print= $print."Notice";                 break;
        case E_CORE_ERROR:   $print= $print."Core Error";             break;
        case E_CORE_WARNING:       $print= $print."Core Warning";           break;
        case E_COMPILE_ERROR:       $print= $print."Compile Error";          break;
        case E_COMPILE_WARNING:     $print= $print."Compile Warning";        break;
        case E_USER_ERROR:          $print= $print."User Error";             break;
        case E_USER_WARNING:     $print= $print."User Warning";           break;
        case E_USER_NOTICE:         $print= $print."User Notice";            break;
        case E_STRICT:             $print= $print."Strict Notice";          break;
        case E_RECOVERABLE_ERROR:   $print= $print."Recoverable Error";      break;
        default:                    $print= $print."Unknown error ($errno)"; break;
    }
    $print= $print. ":$errstr in $errfile on line $errline\n";
    $log_file='./res/log.txt';
    $fd = fopen($log_file, 'a');
    if($fd)
    {
			fwrite($fd, date('Y-m-d H:i:s').$print);
        fclose($fd);
    }
    
    
    if(function_exists('debug_backtrace')){
        $backtrace = debug_backtrace();
        array_shift($backtrace);
        foreach($backtrace as $i=>$l){
            print "[$i] in function <b>{$l['class']}{$l['type']}{$l['function']}</b>";
            if($l['file']) print " in <b>{$l['file']}</b>";
            if($l['line']) print " on line <b>{$l['line']}</b>";
            print "\n";
        }
    }
    if(isset($GLOBALS['error_fatal'])){
        if($GLOBALS['error_fatal'] & $errno) die('fatal');
    }
}

function error_fatal($mask = NULL){
    if(!is_null($mask)){
        $GLOBALS['error_fatal'] = $mask;
    }else if(!isset($GLOBALS['die_on'])){
        $GLOBALS['error_fatal'] = 0;
    }
    return $GLOBALS['error_fatal'];
}
 

zaincludowane do pliku, oraz w pliku głównym

error_reporting(E_ALL);     
set_error_handler('my_error_handler');
error_fatal(E_ALL^E_NOTICE); 

I dodaje mi do pliku, lecz nadal wyświetla na ekranie. Jak usunąć to z ekranu, ale żeby nadal dodawało do pliku??

0
   if(function_exists('debug_backtrace')){
        $backtrace = debug_backtrace();
        array_shift($backtrace);
        foreach($backtrace as $i=>$l){
            print "[$i] in function <b>{$l['class']}{$l['type']}{$l['function']}</b>";
            if($l['file']) print " in <b>{$l['file']}</b>";
            if($l['line']) print " on line <b>{$l['line']}</b>";
            print "\n";
        }
    }

usunąłem to z fukncji, i teraz już nie pokazuje wszystkiego, lecz jeszcze

Notice: Undefined variable: print in /var/www/www/res/error.php on line 11

A 11 linia to:

case E_NOTICE: $print= $print."Notice"; break;

1 użytkowników online, w tym zalogowanych: 0, gości: 1