Autor Zpráva
Orlando
Profil *
Ahoj, na začátku stránky php mám tohle

error_reporting(E_ALL);
ini_set("display_errors", 1);

Jde to místo zobrazení na display, uložit do proměnné kterou bych si vypsal níže? Děkuji za řešení.
aqua
Profil
Zkus toto:
function FCE_errorLog($errno, $errstr, $errfile, $errline){
   echo "<b>Chyba:</b> [$errno] $errstr<br />";
   echo " Na radku: $errline v souboru <strong>".basename($errfile)."</strong><br />";
} 

set_error_handler("FCE_errorLog",E_ALL);
error_reporting(E_ALL | E_STRICT);
Orlando
Profil *
Obávám se, že echo neřeší muj dotaz :-(
aqua
Profil
Co brání tomu, to celé obalit DIVem a pomocí CSS jej zobrazit kdekoliv na stránce. Pokud tedy dotazu rozumím správně.
Orlando
Profil *
Můj dotaz zněl: Jde to místo zobrazení na display, uložit do proměnné kterou bych si vypsal níže?

Co má společného css s naplněním proměnné :-) Potřebuji s tím dále pracovat...
candiess
Profil
Orlando:
Jde to místo zobrazení na display, uložit do proměnné kterou bych si vypsal níže?
A co takhle místo echa si to hodit např do objektu a nebo zapisovat do souboru, session....

Nejlepší budeš mít udělat si objekt:

<?php
class err {

var $main = "";

function add($str="") {
$this->main.=$str;
}

function out() {
return $this->main;
}

}
//no a pak jak mát tu funkci..

$err = new err();

function FCE_errorLog($errno, $errstr, $errfile, $errline){
  $err->add("<b>Chyba:</b> [$errno] $errstr<br />");
  $err->add("Na radku: $errline v souboru <strong>".basename($errfile)."</strong><br />");
}
?>

Je to surový kód, dále si to uprav podle libosti :)
DarkMeni
Profil
Do proměnné to můžeš uložit, když ji v tom kódě, co napsal aqua zavoláš globalem.
<?php
set_error_handler('error_logging');
error_reporting(E_ALL);
$error_log = array();
function error_logging($number, $report, $file, $line){
  global $error_log;
  $error_log[] = array(
    'fullreport' => "Error [$number]: $report.\nLocation: $file (line: $line).",
    'errorno': => $number
  );
  return true;
}
echo $a; //Vygeneruje chybu, $a není nikde v kódě nadefinovaný
var_dump($error_log);
?>
candiess
Profil
EDIT: no a pak si ten error vytáhneš do proměnné přes $vystup = $err->out();
Tori
Profil
Orlando:
Můžete to ukládat do session (tak budete vědět i o chybách, ke kterým došlo např.mezi zpracováním údajů z formuláře a přesměrováním). Nebo si napsat třídu a ukládat to do členské proměnné - zároveň s tím můžete přidat i další metodu jako exception handler. Anebo logovat do souboru a občas do něj kouknout (nebo ho nechat vypsat někde na stránce). Nevím, jestli to je jen pro vás (= preferovala bych logování do souboru), nebo to mají vidět i uživatelé.

candiess
tak pozdě, pardon. Akorát by se jako error handler mohla rovnou registrovat metoda err::add().
Keeehi
Profil
Orlando:
aqua měl na mysli nejspíše pozicování -> zobrazení kdekoliv na stránce.

Jinak aqua ti ukázal způsob, jak "přesměrovat" výpis chyby do uživatelem definované funkce. To co si s tím v té fu aquakci uděláš, je už jen tvoje věc. aqua to rovnou vypisuje, ale předělat to na ukládání do proměnné snad není problém.
candiess
Profil
Tori:
Abych řekl pravdu, nemám vůbec praxi se zápisem tohoto typu, preferuji -> :)
Keeehi
Profil
Případně se dá převést error na exception a hrát si pak s tím.

Důležitá je však funkce set_error_handler(). Zpracování je už pak na Orlandovi. Způsobů je hodně.
Orlando
Profil *
Asi jsem začal od špatného konce, možná bude lepší napsat, co přesně potřebuji, je tady spoustu odborníků, a jistě mají lepší řešení než já.

1) Potřebuji zachytit veškeré úrovně chyb, E_ERROR, E_WARNING, E_PARSE, E_NOTICE atd.. atd.. atd..
2) Veškeré takto "odchycené" chyby potřebuji na konci celého scriptu odeslat emailem
3) žádný výpis se nesmí dostat na screen

Děkuji.
candiess
Profil
Orlando:
Tak zapoj hlavu, my udělali řešení a práce s proměnnýma přece není tak těžká, natož když vygoogliš funkci mail() tak si pohodově pošleš mejl kam potřebuješ..

Budu pracovat s tím mým objektem:
- f-ci + objekt máš vytvořeno výše
- pak jen
$data = $err->out();
$message = "Chybové hlášení: ".$data;
mail($mejla,$subject,$message);
Keeehi
Profil
candiess:
Řekl bych, že uvnitř funkce tvůj objekt neexistuje, jelikož $err uvnitř a vně funkce jsou jiné proměnné.

Toto je funkční:
class Err
{
    private static $instance;
    private $message;

    private function __construct()
    {
        self::clear();
    }

    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            self::$instance = new Err;
        }
        return self::$instance;
    }

    public function add($text)
    {
        $this->message .= $text;
    }

    public function get()
    {
        return $message;
    }
    
    public function clear()
    {
        $this->message = "";
    }
}

Jediný rozdíl oproti používání tvojí funkce je to, že se objekt nevytváří pomocí new ale pomocí tohoto:
$err = Err::getInstance();

+ je potřeba vytvořit instanci objektu i uvnitř té funkce.


Orlando:
Tímto si docela zaspamuješ email. Při každém načtení nějakého chybového scriptu se odešle email. Pokud to bude nějaký hodně používaný, to bude emailů. Doporučil bych to udělat podobně jako to je v nette. Budeš mít soubor, kam se ti boudou logovat errory. Errory se budou postupně přidávat ke konci. No a pokud se bude něco mít zapsat do toho souboru, tak pokud bude prázdný, tak se odešle upozorňující email. Tudíž: Mám prázdný soubor -> vyskytne se chyba -> zjistí se, že je soubor přázdný = pošle se email a chyba se zapíše do toho souboru -> vyskytne se další chyba -> soubor není prázdný = email se neposílá, ale chyba se do souboru zapíše; ____ Všimneš si upozorňujícího emailu -> koukneš do souboru, co bylo za chyby -> ty opravíš -> soubor vyprázdníš ==> Vše je zase připraveno a jakmile se objeví nová chyba, soubor je prázdný = odesílá se upozornění > ...
Orlando
Profil *
Díky všem moc za pomoc a vyčerpávající informace ;)
_construct
Profil *
error_reporting(0);
function shutdown(){
    print_r(error_get_last());
}
register_shutdown_function('shutdown');

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: