[Php] php & mysql error handling

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb al een tijdje zitten spacen op www.php.net en got mbt het verwerken van errors die uit je scripts komen en wil daar een goede class voor bouwen zodat ik alle errors kan opslaan in een db indien een connectie gelukt is en zo niet in een bestand maar kon niet echt wijs worden uit voorbeeldjes die ik hier tegen kwam

oa:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
//error_reporting( E_ALL );
//ini_alter( 'register_globals', 0 );

function my_set_error_handler($callback_func)
{
if (!is_array($callback_func))
return set_error_handler($callback_func);

if (!is_object($callback_func[0]) ||
!method_exists($callback_func[0], $callback_func[1]))
return false;

$GLOBALS['_ERROR_HANDLER_OBJECT'] = &$callback_func[0];
$GLOBALS['_ERROR_HANDLER_METHOD'] = $callback_func[1];

function error_handler_passthru($errno, $errstr, $errfile, $errline,
$errcontext)
{
$GLOBALS['_ERROR_HANDLER_OBJECT']->
$GLOBALS['_ERROR_HANDLER_METHOD']($errno, $errstr, $errfile, $errline,
$errcontext);
}

return set_error_handler('error_handler_passthru');
}

class error_handler
{
    function error ($errno, $errstr, $errfile, $errline, $errcontext)
    {
        echo "<pre>errno: $errno\nerrstr: $errstr\nerrfile: $errfile\nerrline: $errline\n";
        // print_r($errcontext);
    }
}

$eh = new error_handler();
$oldhandler = my_set_error_handler(array( &$eh, 'error' ));

// let's see if error handler works
$i++;
?>


De vraag is nu echter hoe moet ik mijn functie defenieren want wat ik hier lees word ik echter niet wijs van en heb dus geen flauw idee hoe de errors getriggerd worden.

Heeft iemand tips mbt het zetten van een error handler en het verwerken ervan?

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

heb je dit al eens bekeken? De eerste link lijkt te zijn wat je zoekt :)

[ Voor 4% gewijzigd door Spider.007 op 09-03-2003 09:59 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01

Tux

Volgens mij zet PHP jouw errorhandler dan als standaard errorhandler in. PHP doet het dus voor je net zoals PHP normaal Notices, Warnings en Fatal Errors op je scherm gooit.

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb nu dit gevonden maar nu een paar kleine vraagjes.. :D

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
// custom error handler
function eh($type, $msg, $file, $line, $context)
{
    echo "<h1>Error!</h1>";
    echo "An error occurred while executing this script. Please
contact the <a href=mailto:webmaster@somedomain.com>webmaster</a> to
report this error.";
    echo "<p>";
    echo "Here is the information provided by the script:";
    echo "<hr><pre>";
    echo "Error code: $type<br>";
    echo "Error message: $message<br>";
    echo "Script name and line number of error: $file:$line<br>";
    echo "Variable state when error occurred: <br>";
    print_r($context);
    echo "</pre><hr>";
}

// define a custom error handler
set_error_handler("eh");

// string
$string = "Mary had a little lamb";

// this will generate an E_WARNING
join('', $string);
?>


hoe komt die functie aan zijn data? en kan ik dit goed veranderen zodat ik der ook mysql errors in kan verwerken dus 1 functie voor alle errors? dit antwoord kon ik niet op www.php.net vinden :{

Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01

Tux

PHP geeft alle errors door aan jouw errorhandler ipv zijn eigen interne errorhandler :)

PHP:
1
mysql_query ("BLAAT") or eh ("MySQL", mysql_error (), __FILE__, __LINE__, "contextje");

[ Voor 40% gewijzigd door Tux op 09-03-2003 10:16 ]

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ahhh dus met eh ("MySQL", mysql_error (), __FILE__, __LINE__, "contextje"); neem ik dit als ware over... tnx, ik kan weer even verder :D

Verder zou ik willen detecteren in mijn error handler of er een mysql connectie is, zo niet dan moet ie um weg schrijven in een bestand anders in de database of wat denken jullie gewoon standaard in een file of beide?

Nu heb ik het volgende

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?

class error
{
    // custom error handler
    function e($type, $msg, $file, $line)
    {

    $errorString = "Date       : " . date("d-m-Y H:i:s", mktime()) . "\n";

    switch($type)
    {
        // notice
        case E_NOTICE:
            $errorString .= "Error type : NOTICE\n";
            break;

        case E_WARNING:
            // report error
            $errorString .= "Error type : WARNING\n";
            break;

        case E_ERROR:
            // report error and die()
            $errorString .= "Error type : FATAL ERROR\n";
            break;
        default:
            $errorString .= "Error type : $type\n";
            break;
    }

    // construct the error string
    $errorString .= "Error msg  : $msg\n";
    $errorString .= "Script     : $file($line)\n";
    $errorString .= "Host       : " . $_SERVER['HTTP_HOST'] . "\n";
    $errorString .= "Client     : " . $_SERVER['HTTP_USER_AGENT'] . "\n";
    $errorString .= "Client IP  : " . $_SERVER['REMOTE_ADDR'] . "\n";
    $errorString .= "Request URI: " . $_SERVER['REQUEST_URI'] . "\n";
    $errorString .= "---------------------------------------------------------------\n";

    // write the error string to the specified log file
    $fp = fopen("error.log", "a+");
    fwrite($fp, $errorString);
    fclose($fp);
    }
}

// report warnings and fatal errors
error_reporting(E_ERROR | E_WARNING);

$err = new error();

// define a custom handler
set_error_handler($err->e);

// attempt a MySQL connection
$connection = @mysql_connect("localhost", "john", "doe") or $err->e("MySQL", mysql_error(), __FILE__, __LINE__);
mysql_select_db("content");

// generate and execute query
$query = "SELECT * FROM news ORDER BY timestamp DESC";
$result = mysql_query($query, $connection);
?>


Alleen is nu het probleem dat alleen de errors die ik zelf trigger gepakt worden door mijn class, en niet de errors die door PHP worden gegeven.

Hoe los ik dit op?

[ Voor 124% gewijzigd door Verwijderd op 09-03-2003 10:45 ]


Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
van php.net PHP: set_error_handler - Manual
Opmerking: The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR and E_COMPILE_WARNING.
Een deel kan je dus zo ie zo niet afvangen zoals die E_ERROR die ik wel in je code zie :)
van php.net PHP: set_error_handler - Manual
Opmerking: Instead of a function name, an array containing an object reference and a method name can also be supplied. (Since PHP 4.3.0)
En roep je hem wel goed aan :?

[ Voor 29% gewijzigd door martinvw op 09-03-2003 12:29 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
M4rt1nvW schreef op 09 March 2003 @ 12:26:

Een deel kan je dus zo ie zo niet afvangen zoals die E_ERROR die ik wel in je code zie :)

En roep je hem wel goed aan :?
Hoe bedoel je precies? mijn aanroep is zoals ik heb gezien in meerdere sources, maar deze werkt blijkbaar niet naar behoren en daar snap ik nix van :'(

Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
ze hebben het op php.net over een array die die object en een methode naam bevat dus moet het niet set_error_handler(array("error", "e")); of zie ik dat verkeerd tis toch een object en moet volgens dat php.net stukje dus anders aan worden geroepen, probeer het eens gewoon buiten de class dus alleen die functie en kijk eens wat de set_error_handle teruggeeft, daar kan je misschien ook wel afleiden of het goed gaat.

Die bronnen waren jij het over heb riepen die ook functie in een class aan of riepen zij gewoon een functie aan.

[ Voor 15% gewijzigd door martinvw op 09-03-2003 12:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
een functie gewoon zonder class en ik wil een functie in een class aanroepen :D

Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
dus moet het denk ik met een array, is dat al gelukt? :)

*vind het een interressant topic* :D

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
M4rt1nvW schreef op 09 March 2003 @ 13:13:
dus moet het denk ik met een array, is dat al gelukt? :)

*vind het een interressant topic* :D
nee dat heeft geen nut een normale functie werkt wel maar in een class weer niet terwijl de class gewoon gedefenieerd is :{

Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
maar er staat toch dat dat met die array moet, op php.net of heb je een andere php versie?

Ik zal vanavond ff bij mij testen en beetje spelen als ik geen zin meer heb om te leren :D

[ Voor 35% gewijzigd door martinvw op 09-03-2003 14:56 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
M4rt1nvW schreef op 09 March 2003 @ 14:56:
maar er staat toch dat dat met die array moet, op php.net of heb je een andere php versie?

Ik zal vanavond ff bij mij testen en beetje spelen als ik geen zin meer heb om te leren :D
zie dit

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function eh($type, $msg, $file, $line, $context)
{
    echo "<h1>Error!</h1>";
    echo "An error occurred while executing this script. Please
contact the <a href=mailto:webmaster@somedomain.com>webmaster</a> to
report this error.";
    echo "<p>";
    echo "Here is the information provided by the script:";
    echo "<hr><pre>";
    echo "Error code: $type<br>";
    echo "Error message: $message<br>";
    echo "Script name and line number of error: $file:$line<br>";
    echo "Variable state when error occurred: <br>";
    print_r($context);
    echo "</pre><hr>";
}

// define a custom error handler
set_error_handler("eh");


en dit

PHP:
1
2
3
4
5
6
// class weggelaten, zie vorige posting

$err = new error(); 

// define a custom handler 
set_error_handler($err->e);


;)

Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
okeej, als we jou functie buiten de class plaatsen werkt hij goed:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<? 

    // custom error handler 
    function e($type, $msg, $file, $line) 
    { 

    $errorString = "Date       : " . date("d-m-Y H:i:s", mktime()) . "\n"; 

    switch($type) 
    { 
        // notice 
        case E_NOTICE: 
            $errorString .= "Error type : NOTICE\n"; 
            break; 

        case E_WARNING: 
            // report error 
            $errorString .= "Error type : WARNING\n"; 
            break; 

        case E_ERROR: 
            // report error and die() 
            $errorString .= "Error type : FATAL ERROR\n"; 
            break; 
        default: 
            $errorString .= "Error type : $type\n"; 
            break; 
    } 

    // construct the error string 
    $errorString .= "Error msg  : $msg\n"; 
    $errorString .= "Script     : $file($line)\n"; 
    $errorString .= "Host       : " . $_SERVER['HTTP_HOST'] . "\n"; 
    $errorString .= "Client     : " . $_SERVER['HTTP_USER_AGENT'] . "\n"; 
    $errorString .= "Client IP  : " . $_SERVER['REMOTE_ADDR'] . "\n"; 
    $errorString .= "Request URI: " . $_SERVER['REQUEST_URI'] . "\n"; 
    $errorString .= "---------------------------------------------------------------\n"; 

    echo "<PRE>".$errorString."</PRE>";

    } 

// report warnings and fatal errors 
error_reporting(E_ALL); 

// define a custom handler 
set_error_handler("e"); 

// attempt a MySQL connection 
$connection = mysql_connect("localhost", "john", "doe") or trigger_error(mysql_error(), E_USER_ERROR); 
mysql_select_db("content"); 

// generate and execute query 
$query = "SELECT * FROM news ORDER BY timestamp DESC"; 
$result = mysql_query($query, $connection); 
?> 


dus het ligt aan de aanroep die moet dus met die array zoals php.net zegt, dat zal ik nou ff uitzoeken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
heel vaag, want je zou toch zweren dat ie die array gewoon zo houd? :X

Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
Verwijderd schreef op 09 March 2003 @ 16:53:
heel vaag, want je zou toch zweren dat ie die array gewoon zo houd? :X
wtf, welke array heb jij het over een object: zo'n ding met een -> is niet hetzelfde als een array :)

We lullen in ieder geval langs elkaar heen.

Van php.net heb ik een lapoplossing :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<? 

/*
Denk hier de reeds bekende class
*/

function passdoor($type, $msg, $file, $line, $context){
    $err = new error(); 
    $err->e($type, $msg, $file, $line, $context);
}
// report warnings and fatal errors 
error_reporting(E_ALL); 

// define a custom handler 
set_error_handler("passdoor"); 

// attempt a MySQL connection 
$connection = mysql_connect("localhost", "john", "doe"); 
mysql_select_db("content"); 

// generate and execute query 
$query = "SELECT * FROM news ORDER BY timestamp DESC"; 
$result = mysql_query($query, $connection); 
?> 


Nu heb ik het zo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<? 

/*
Bekende class
*/
// report warnings and fatal errors 
error_reporting(E_ALL); 

$err = new error();
// define a custom handler 
set_error_handler(array(&$err, "e"));

// attempt a MySQL connection 
$connection = mysql_connect("localhost", "john", "doe"); 
mysql_select_db("content"); 

// generate and execute query 
$query = "SELECT * FROM news ORDER BY timestamp DESC"; 
$result = mysql_query($query, $connection); 
?> 


Maar nu doet hij het de ene keer wel en de andere keer niet.

edit:
Na een beetje googlen lijkt het erop dat het een bug is want ik heb berichten van tal van mensen gevonden die het niet werkend krijgen.

[ Voor 88% gewijzigd door martinvw op 09-03-2003 19:13 ]


Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
niemand anders hier wat aan toe te voegen...?

Want ik vind het een beetje eng dat php de ene keer wel de class als error handler pakt en de andere keer niet.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Blijkbaar niet :{ dus een echte Errorclass is iets dat vrijwel onmogelijk is :{

Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
jah, vooral ook omdat classes vanaf versie 3.4.0 worden ondersteund als errorhandler en daarin bij mij iig niet (correct) werken. Misschien in een volgende versie :)
Pagina: 1