Improvements in handling exceptions, database now showing all errors through exceptions.

This commit is contained in:
ohartl 2016-05-10 00:11:09 +02:00
parent 1f44769030
commit 410fe43330
4 changed files with 93 additions and 53 deletions

View file

@ -27,15 +27,26 @@ class Database
protected $lastQuery;
/**
* @param string $host
* @param string $user
* @param string $password
* @param string $database
*
* @throws Exception
*/
protected function __construct($host, $user, $password, $database)
{
if(!static::isInitialized()){
$this->config = $database;
$this->db = new mysqli($host, $user, $password, $database);
if($this->db->connect_errno > 0){
$this->db = null;
die('Unable to connect to database ['.$this->db->connect_error.']');
try{
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$this->db = new mysqli($host, $user, $password, $database);
}
catch(mysqli_sql_exception $e){
throw new Exception('Unable to connect to database', 0, $e);
}
}
}
@ -48,9 +59,15 @@ class Database
/**
* @return Database
*
* @throws Exception
*/
public static function getInstance()
{
if(!static::isInitialized()){
throw new Exception('Database must be initialized before using it (see Database::init).');
}
return static::$instance;
}
@ -105,46 +122,14 @@ class Database
}
/**
*
*/
public static function mustBeInitialized()
{
if(!static::isInitialized()){
die('Database has not been initialized.');
}
}
/**
* Die with error and executed sql query
*
* @param string $errorMessage
* @param string|null $sql
*/
public function dieOnDatabaseError($errorMessage, $sql = null)
{
die('There was an error running the query ['.$errorMessage.']'.(!is_null($sql) ? ' with statement "'.$sql.'"' : ''));
}
/**
* Die if query not successful
*/
public function mustBeSuccessful()
{
if($this->db->errno !== 0){
$this->dieOnDatabaseError($this->db->error, $this->lastQuery);
}
}
/**
* Execute query
*
* @param string $query
*
* @return bool|mysqli_result
*
* @throws DatabaseException
*/
public function query($query)
{
@ -152,7 +137,15 @@ class Database
$result = $this->db->query($query);
$this->mustBeSuccessful();
if($this->db->errno !== 0){
$ex = new DatabaseException('There was an error running the query ['.$this->db->error.']');
if(!is_null($this->lastQuery)){
$ex->setQuery($this->lastQuery);
}
throw $ex;
}
return $result;
}

View file

@ -0,0 +1,31 @@
<?php
class DatabaseException extends Exception
{
/** @var string */
protected $query;
/**
* Set the executed SQL query
*
* @param string $query
*
* @return $this
*/
public function setQuery($query)
{
$this->query = $query;
return $this;
}
/**
* Get the executed SQL query
*
* @return string
*/
public function getQuery()
{
return $this->query;
}
}

View file

@ -5,18 +5,26 @@
* Add message to logfile
*
* @param string $text
*
* @throws Exception
*/
function writeLog($text)
{
if(Config::get('options.enable_logging', false) && Config::has('log_path')){
$logdestination = realpath(Config::get('log_path')).DIRECTORY_SEPARATOR."webmum.log";
$logDestination = realpath(Config::get('log_path')).DIRECTORY_SEPARATOR."webmum.log";
if(is_writable(Config::get('log_path'))){
$logfile = fopen($logdestination, "a") or die("Unable to create or open logfile \"".$logdestination."\" in root directory!");
fwrite($logfile, date('M d H:i:s').": ".$text."\n");
fclose($logfile);
if($logfile = fopen($logDestination, "a")){
fwrite($logfile, date('M d H:i:s').": ".$text."\n");
fclose($logfile);
}
else{
throw new Exception('Unable to create or open logfile "'.$logDestination.'" in root directory!');
}
}
else{
die("Directory \"".Config::get('log_path')."\" isn't writable");
throw new Exception('Directory "'.Config::get('log_path').'" isn\'t writable');
}
}
}

View file

@ -1,15 +1,23 @@
<?php
/**
* Loading system
*/
require_once 'include/php/default.inc.php';
try {
/**
* Loading system
*/
require_once 'include/php/default.inc.php';
/**
* Handle request
*/
$content = Router::executeCurrentRequest();
/**
* Handle request
*/
$content = Router::executeCurrentRequest();
}
catch(DatabaseException $e){
$content = '<div class="notification notification-fail">Faulty database query: "'.$e->getQuery().'".</div>';
}
catch(Exception $e){
$content = '<div class="notification notification-fail">'.$e->getMessage().'</div>';
}
if(defined('USING_OLD_CONFIG')){
$content = '<div class="notification notification-fail"><strong>Your WebMUM installation is still using the old deprecated config style!</strong><br><br>Please update your config to the new style (an example config can be found in <cite>config.php.example</cite>)<br>and delete your old <cite>config.inc.php</cite> and <cite>config.inc.php.example</cite>.</div>'.$content;