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

<?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.';
}

?>
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 :)
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.
Je static class werkt perfect hoor. Ik even je class een beetje aan moeten passen omdat ik geen mysqli heb.

<?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.
<?php
ini_set('display_errors' ,1);
error_reporting(E_ALL);
?>
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

Reageren