vreemd gedrag in object oriented php5 code

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Tom

Tom

13/08/2006 03:08:00
Quote Anchor link
Op dit mooie nachtelijke uur nog een denkertje:

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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.';
}


?>
Gewijzigd op 01/01/1970 01:00:00 door Tom
 
PHP hulp

PHP hulp

24/11/2024 10:33:37
 
Remco van Arkelen

Remco van Arkelen

13/08/2006 03:30:00
Quote Anchor link
if(CoreErrorHandler::hasErrors())

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 :)
 
Tom

Tom

13/08/2006 10:04:00
Quote Anchor link
Nee dat is het niet. Ik had de functie hasErrors ook al aangepast om een bool terug te geven, maar dat loste niets op.
 
Jan Koehoorn

Jan Koehoorn

13/08/2006 10:19:00
Quote Anchor link
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.
 
Roy Bongers

Roy Bongers

13/08/2006 10:44:00
Quote Anchor link
Je static class werkt perfect hoor. Ik even je class een beetje aan moeten passen omdat ik geen mysqli heb.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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.';
}


?>


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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
ini_set('display_errors' ,1);
error_reporting(E_ALL);
?>
Gewijzigd op 01/01/1970 01:00:00 door Roy Bongers
 
Tom

Tom

13/08/2006 13:38:00
Quote Anchor link
Ja ik had bovenaan staan:

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.