[PHP] fouten onderdrukken in een class icm set_error_handler

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste tweakers

Ik ben bezig met een eigen error handler.

Het idee is alsvolgt:

1. Er treedt een fout op
2. Probeer een connectie te maken naar een database en zet het foutenrapport in de db
Als dit gelukt is, bekijk of er een mailtje naar de webmaster gestuurd moet worden of niet
3. Als de database connectie mislukt, moet de fout weggeschreven worden naar een text file.

Voor het connecten naar de database gebruik ik mijn database class. Het is dus van belang dat mysql_connect, mysql_query etc etc geen foutmeldingen weergeven en deze wilde ik dus onderdrukken met '@'.

Als er tijdens het connecten naar de database iets fout gaat wil ik dat er een E_USER_ERROR getriggerd wordt, dit dacht ik zo op te lossen:

Deel uit database class
PHP:
1
2
3
4
5
#Try to connect to the database server, on failure report this error;
        if(!$this->sLinkID = @mysql_connect($this->sHost.':'.$this->iPort_nr,$this->sUsername,$sPassword)){
            $this->setSQLError(mysql_error(), mysql_errno());
            trigger_error('database foutje: '.$this->getErrorMsg(),E_USER_ERROR);
        }


Nu heb ik het volgende probleem, als ik mijn eigen error handler defineer dan lijkt het of het effect van het '@' ongedaan gemaakt wordt.

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
#This is a parent file
define('cIsParent',1);

session_start();

include_once("../includes/configuration.inc.php");
require_once("languages/language.php");
require_once("../includes/error_reporting.inc.php");

#Set error reporting to E_ALL and use our own error reporting system
//set_error_handler('testErrorHandler');
error_reporting(E_ALL);



if($_SERVER['REQUEST_METHOD'] == "POST"){
    require_once("../includes/database.class.php");
    require_once("includes/hash.inc.php");
    
    #Connect to the database(s)
    $dp = new database();
    $dp->connect("localhost","visstick","xxx",""); //visstick is dus geen geldige gebruiker
    $dp->setDatabase('ploegedb1','');

    //rest van het script


Dit geeft de foutmelding die ik wil namelijk:
Fatal error: database foutje: Access denied for user 'visstick'@'localhost' (using password: YES) in C:\Program Files\Apache Group\Apache2\cms\0.1\includes\database.class.php on line 84

Maar, als ik de '//' voor set_error_handler("testErrorHandler") weghaal (Dus mijn eigen error handler ga gebruiken), dan krijg ik:
11-23-2005 00:11:20 2 Warning mysql_connect() [function.mysql-connect]: Access denied for user 'visstick'@'localhost' (using password: YES) C:\Program Files\Apache Group\Apache2\cms\0.1\includes\database.class.php 82

Dit is dus de foutmelding die gegenereerd wordt door mysql_connect, maar die had ik onderdrukt :?

Dit is mijn error_handler functie:

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
#Make sure this page is included by a parent file
defined('cIsParent') or exit();

#The array with error types
$errortype = array (
    E_ERROR => "Error",
    E_WARNING => "Warning",
    E_PARSE => "Parsing Error",
    E_NOTICE => "Notice",
    E_CORE_ERROR => "Core Error",
    E_CORE_WARNING => "Core Warning",
    E_COMPILE_ERROR=> "Compile Error",
    E_COMPILE_WARNING => "Compile Warning",
    E_USER_ERROR => "User Error",
    E_USER_WARNING => "User Warning",
    E_USER_NOTICE => "User Notice"
);
    
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);


function testErrorHandler($type, $msg, $file, $line, $vars){
            global $errortype, $user_errors;
            
            if($type != E_STRICT){
                $err = "<errorentry>\n";
                $err .= "\t<datetime>".date('m-d-Y H:m:i')."</datetime>\n";
                $err .= "\t<errornum>".$type."</errornum>\n";
                $err .= "\t<errortype>".$errortype[$type]. "</errortype>\n";
                $err .= "\t<errormsg>".$msg."</errormsg>\n";
                $err .= "\t<scriptname>".$file."</scriptname>\n";
                $err .= "\t<scriptlinenum>".$line."</scriptlinenum>\n";
                
                if (in_array($type, $user_errors)) {
                    $err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
                }
                $err .= "</errorentry>\n\n";
                
                echo $err;
                exit('exit in errorhandler');
            }
}


Weet iemand waarom ik met mijn eigen error handler niet de foutmelding krijg die ik wil?

Alvast bedankt

Justin

Acties:
  • 0 Henk 'm!

  • ShadowLord
  • Registratie: Juli 2000
  • Laatst online: 18-09 22:12
Van de PHP handleiding:
It is important to remember that the standard PHP error handler is completely bypassed. error_reporting() settings will have no effect and your error handler will be called regardless - however you are still able to read the current value of error_reporting and act appropriately. Of particular note is that this value will be 0 if the statement that caused the error was prepended by the @ error-control operator.
De error zal als je een eigen error handler hebt gemaakt dus toch gewoon getriggerd worden, alleen wordt het error_level tijdelijk even naar 0 geset.

Nu is het ook zo dat als er een fout optreed in de error handler PHP terugvalt op de normale handler. Het zou dus kunnen zijn dat deze error altijd weergegeven wordt, wat je ook doet. Probeer er eens achter te komen of de error door de erro_handler zelf wordt getriggerd of door het 'normale' script.

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt ShadowdLord
De error zal als je een eigen error handler hebt gemaakt dus toch gewoon getriggerd worden, alleen wordt het error_level tijdelijk even naar 0 geset.
Dit deed het hem, ik laat de error handler eerst controleren op welk niveau error_reporting() staat. Bij error_reporting(0) geef ik een return false.

Stukje code voor mensen die mogelijk tegen eenzelfde probleem aanfietsen:

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
function testErrorHandler($type, $msg, $file, $line, $vars){
            global $errortype, $user_errors;
            
            if(error_reporting() == 0){
                return false;
            }
            
            if($type != E_STRICT){
                $err = "<errorentry>\n";
                $err .= "\t<datetime>".date('m-d-Y H:m:i')."</datetime>\n";
                $err .= "\t<errornum>".$type."</errornum>\n";
                $err .= "\t<errortype>".$errortype[$type]. "</errortype>\n";
                $err .= "\t<errormsg>".$msg."</errormsg>\n";
                $err .= "\t<scriptname>".$file."</scriptname>\n";
                $err .= "\t<scriptlinenum>".$line."</scriptlinenum>\n";
                
                if (in_array($type, $user_errors)) {
                    $err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
                }
                $err .= "</errorentry>\n\n";
                
                echo $err;
                
                //exit('exit in errorhandler');
            }
}