vreemd gedrag in object oriented php5 code
Volgende code probeert verbinding te maken met een MySql database. Aangezien de meegegeven parameters voor de login niet correct zijn, zet de functie CustomErrorHandler de warning om naar een exception.
Die exception slaat een foutmelding op in een algemene class voor errorhandling (regel 79). De class voor errorhandling is voorlopig nog héél erg simpel gehouden.
Als je regel 95 van de code bekijkt zou je dus de melding 'Errors gevonden' op je scherm verwachten. Toch krijg ik een blank scherm te zien.
Bijkomende info:
php versie = 5.1.4
Code (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
function CustomErrorHandler($errno, $errstr, $errfile, $errline, $errcontext)
{
// echo '<p><b>Error '.$errno.'</b><br><font color=\'red\'><i>'.$errstr.'<br>'.$errfile.' line '.$errline.'</i></font></p>';
throw new Exception($errstr);
}
set_error_handler('CustomErrorHandler');
final class CoreErrorHandler
{
private static $errors = array();
public static function addError($errmsg)
{
self::$errors[] = $errmsg;
}
public static function getErrors()
{
return self::$errors;
}
public static function hasErrors()
{
return count(self::$errors);
}
}
final class CoreDatabase
{
private static $dbInstance;
private $dbHandler;
private $dbHost;
private $dbUser;
private $dbPass;
private $dbName;
public static function singleton($dbHost='', $dbUser='', $dbPass='', $dbName='')
{
if (!self::$dbInstance)
{
self::$dbInstance = new CoreDatabase($dbHost, $dbUser, $dbPass, $dbName);
}
return self::dbInstance;
}
private function __construct($dbHost, $dbUser, $dbPass, $dbName)
{
$this->dbHost = $dbHost;
$this->dbUser = $dbUser;
$this->dbPass = $dbPass;
$this->dbName = $dbName;
$this->connect();
}
private function __destruct()
{
unset($this->dbHost);
unset($this->dbUser);
unset($this->dbPass);
unset($this->dbName);
$this->disconnect();
}
private function connect()
{
try
{
$this->dbHandler = new mysqli($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName);
}
catch(Exception $e)
{
CoreErrorHandler::addError($e->getMessage());
}
}
private function disconnect()
{
$this->dbHandler->close();
unset($this->dbHandler);
}
}
$db = CoreDatabase::singleton('localhost', 'username', 'password', 'database');
if(CoreErrorHandler::hasErrors())
{
//print_r(CoreErrorHandler::getErrors());
echo 'Errors gevonden';
}
else
{
echo 'De pagina is foutloos geladen.';
}
?>
function CustomErrorHandler($errno, $errstr, $errfile, $errline, $errcontext)
{
// echo '<p><b>Error '.$errno.'</b><br><font color=\'red\'><i>'.$errstr.'<br>'.$errfile.' line '.$errline.'</i></font></p>';
throw new Exception($errstr);
}
set_error_handler('CustomErrorHandler');
final class CoreErrorHandler
{
private static $errors = array();
public static function addError($errmsg)
{
self::$errors[] = $errmsg;
}
public static function getErrors()
{
return self::$errors;
}
public static function hasErrors()
{
return count(self::$errors);
}
}
final class CoreDatabase
{
private static $dbInstance;
private $dbHandler;
private $dbHost;
private $dbUser;
private $dbPass;
private $dbName;
public static function singleton($dbHost='', $dbUser='', $dbPass='', $dbName='')
{
if (!self::$dbInstance)
{
self::$dbInstance = new CoreDatabase($dbHost, $dbUser, $dbPass, $dbName);
}
return self::dbInstance;
}
private function __construct($dbHost, $dbUser, $dbPass, $dbName)
{
$this->dbHost = $dbHost;
$this->dbUser = $dbUser;
$this->dbPass = $dbPass;
$this->dbName = $dbName;
$this->connect();
}
private function __destruct()
{
unset($this->dbHost);
unset($this->dbUser);
unset($this->dbPass);
unset($this->dbName);
$this->disconnect();
}
private function connect()
{
try
{
$this->dbHandler = new mysqli($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName);
}
catch(Exception $e)
{
CoreErrorHandler::addError($e->getMessage());
}
}
private function disconnect()
{
$this->dbHandler->close();
unset($this->dbHandler);
}
}
$db = CoreDatabase::singleton('localhost', 'username', 'password', 'database');
if(CoreErrorHandler::hasErrors())
{
//print_r(CoreErrorHandler::getErrors());
echo 'Errors gevonden';
}
else
{
echo 'De pagina is foutloos geladen.';
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Tom
Daar return je dus die count(), maar je if-constructie verwacht een bool...misschien helpt het als je zegt:
if(CoreErrorHandler::hasErrors() > 0)
? Geen idee hoor, ik pak nog even een biertje :)
Nee dat is het niet. Ik had de functie hasErrors ook al aangepast om een bool terug te geven, maar dat loste niets op.
Binnen je Class CoreDatabase roep je een memberfunctie van je error-class aan. Kun je niet beter een nieuwe errorclass instantieren in de construct van je coredatebase? En die dan vullen met de eventuele errors.
Code (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
function CustomErrorHandler($errno, $errstr, $errfile, $errline, $errcontext)
{
// echo '<p><b>Error '.$errno.'</b><br><font color=\'red\'><i>'.$errstr.'<br>'.$errfile.' line '.$errline.'</i></font></p>';
//throw new Exception($errstr);
}
set_error_handler('CustomErrorHandler');
final class CoreErrorHandler
{
private static $errors = array();
public static function addError($errmsg)
{
self::$errors[] = $errmsg;
}
public static function getErrors()
{
return self::$errors;
}
public static function hasErrors()
{
return count(self::$errors);
}
}
final class CoreDatabase
{
private static $dbInstance = null;
private $dbHandler;
private $dbHost;
private $dbUser;
private $dbPass;
private $dbName;
public static function singleton($dbHost='', $dbUser='', $dbPass='', $dbName='')
{
if (self::$dbInstance == null)
{
self::$dbInstance = new CoreDatabase($dbHost, $dbUser, $dbPass, $dbName);
}
return self::$dbInstance;
}
private function __construct($dbHost, $dbUser, $dbPass, $dbName)
{
$this->dbHost = $dbHost;
$this->dbUser = $dbUser;
$this->dbPass = $dbPass;
$this->dbName = $dbName;
$this->connect();
}
private function __destruct()
{
unset($this->dbHost);
unset($this->dbUser);
unset($this->dbPass);
unset($this->dbName);
$this->disconnect();
}
private function connect()
{
try
{
new Throwable();
}
catch(Exception $e)
{
CoreErrorHandler::addError($e->getMessage());
}
}
private function disconnect()
{
$this->dbHandler->close();
unset($this->dbHandler);
}
}
class Throwable
{
public function __construct()
{
throw new Exception('Exception thrown');
}
}
$db = CoreDatabase::singleton('localhost', 'username', 'password', 'database');
if(CoreErrorHandler::hasErrors())
{
print_r(CoreErrorHandler::getErrors());
echo 'Errors gevonden';
}
else
{
echo 'De pagina is foutloos geladen.';
}
?>
function CustomErrorHandler($errno, $errstr, $errfile, $errline, $errcontext)
{
// echo '<p><b>Error '.$errno.'</b><br><font color=\'red\'><i>'.$errstr.'<br>'.$errfile.' line '.$errline.'</i></font></p>';
//throw new Exception($errstr);
}
set_error_handler('CustomErrorHandler');
final class CoreErrorHandler
{
private static $errors = array();
public static function addError($errmsg)
{
self::$errors[] = $errmsg;
}
public static function getErrors()
{
return self::$errors;
}
public static function hasErrors()
{
return count(self::$errors);
}
}
final class CoreDatabase
{
private static $dbInstance = null;
private $dbHandler;
private $dbHost;
private $dbUser;
private $dbPass;
private $dbName;
public static function singleton($dbHost='', $dbUser='', $dbPass='', $dbName='')
{
if (self::$dbInstance == null)
{
self::$dbInstance = new CoreDatabase($dbHost, $dbUser, $dbPass, $dbName);
}
return self::$dbInstance;
}
private function __construct($dbHost, $dbUser, $dbPass, $dbName)
{
$this->dbHost = $dbHost;
$this->dbUser = $dbUser;
$this->dbPass = $dbPass;
$this->dbName = $dbName;
$this->connect();
}
private function __destruct()
{
unset($this->dbHost);
unset($this->dbUser);
unset($this->dbPass);
unset($this->dbName);
$this->disconnect();
}
private function connect()
{
try
{
new Throwable();
}
catch(Exception $e)
{
CoreErrorHandler::addError($e->getMessage());
}
}
private function disconnect()
{
$this->dbHandler->close();
unset($this->dbHandler);
}
}
class Throwable
{
public function __construct()
{
throw new Exception('Exception thrown');
}
}
$db = CoreDatabase::singleton('localhost', 'username', 'password', 'database');
if(CoreErrorHandler::hasErrors())
{
print_r(CoreErrorHandler::getErrors());
echo 'Errors gevonden';
}
else
{
echo 'De pagina is foutloos geladen.';
}
?>
Dit geeft mooi:
Array ( [0] => Exception thrown ) Errors gevonden
Verder zat er nog een bug in je functie CustomErrorHandler. Je kan namelijk alleen exceptions throw-en als je IN een class zit. In normale functies werkt dit dus niet.
edit: ooh en bij je return instance had je nog een $-teken vergeten. Nu vraag ik me dus wel af of je error_reporting wel aan hebt staan. Anders was je deze meldingen ook wel tegen gekomen lijkt me.
Door deze code boven aan je script te zetten staat error reporting in iedergeval zeker aan.
Gewijzigd op 01/01/1970 01:00:00 door Roy Bongers
ini_set('error_reporting', E_ALL & E_STRICT);
ini_set('display_errors', true);
Bedankt voor je reactie, hier kan ik wel mee aan de slag. :D