Tim Bureck
Erfahrenes Mitglied
Hallo zusammen
heute habe ich mal einen ganz seltsamen Fehler, hier mal die komplette Ausgabe des Programms:
Nach dem String "Letzter Text" sollte eigentlich Schluss sein. Hier die komplette index.php:
Der Fehler trat erst auf, nachdem ich die Klasse SessionHandler eingebaut habe. Diese baut auf der Klasse von Catull auf:
Ich bin im Moment mit meinem Latein am Ende.. hat vielleicht jemand eine Idee woran das liegen könnte?
heute habe ich mal einen ganz seltsamen Fehler, hier mal die komplette Ausgabe des Programms:
CSMTools Testpage!
Letzter Text
Fatal error: Exception thrown without a stack frame in Unknown on line 0
Nach dem String "Letzter Text" sollte eigentlich Schluss sein. Hier die komplette index.php:
PHP:
<?php
require_once 'global.csmtools.php';
try {
$app = Application::createApplication(CSMTOOLS_APP, CSMTOOLS_CFG);
$app->getSession()->setAttribute("test", "Tim");
$app->getTpl()->assign("sitename", "CSMTools Testpage!");
$app->getTpl()->assign("array", array("Erster Text", "Zweiter Text",
"Letzter Text"));
$app->getTpl()->display("test");
} catch (SessionException $se) {
echo "<strong>Runtime session error:</strong> ".$se->getMessage()." ".
"in <em>".$se->getFile()."</em> on line <em>".$se->getLine().
"</em>";
if ($se->getNestedException() instanceof DatabaseException) {
$de = $se->getNestedException();
echo "<br >";
echo "A database error occurred: \"".$de->getMessage()."\"<br />";
echo "Query: <br /><pre>".$de->getQuery()."</pre><br />";
echo "Error: ".$de->getSQLError()." (".$de->getSQLErrorNumber().")";
}
echo "<pre>".$se->getTraceAsString()."</pre>";
} catch (Exception $e) {
echo "<strong>Runtime error:</strong> ".$e->getMessage()." in <em>".
$e->getFile()."</em> line <em>".$e->getLine()."</em>";
}
/**
*
* @param string $dir the root directory to search from
* @param string $className the class name to search for
* @return boolean true, if the file of $className has been found
*/
function searchClass($dir, $className) {
if (!is_dir($dir)) {
return false;
}
$dirInputHandler = opendir($dir);
$dirContent = scandir($dir);
while (($dirElement = readdir($dirInputHandler)) !== false) {
if($dirElement != "." && $dirElement != ".."
&& $dirElement != ".svn"
&& is_dir($dir."/".$dirElement)) {
if (searchClass($dir."/".$dirElement, $className)) {
return true;
}
} elseif($dirElement != "." && $dirElement != "..") {
// TODO optimize compare operation
// http://www.tutorials.de/forum/php/339795-autoloading.html#post1756680
if (preg_match("@/".$className.".class.php$@",
$dir."/".$dirElement) > 0) {
require_once $dir."/".$dirElement;
return true;
}
}
}
closedir($dirInputHandler);
return false;
}
function __autoload($className) {
if (!searchClass(CSMTOOLS_DIR.'/library', $className)) {
throw new ClassNotFoundException("The class '".$className."' ".
"could not be resolved.");
}
}
?>
Der Fehler trat erst auf, nachdem ich die Klasse SessionHandler eingebaut habe. Diese baut auf der Klasse von Catull auf:
PHP:
<?php
/**
*
*/
/**
*
* @author Tim Bureck
* @author Andreas Wilhelm
*/
class SessionHandler {
private $db;
private $timeout;
private $zeroNumber;
public function __construct(Database $dbHandler, $timeout, $number) {
if ($dbHandler === null) {
throw new SessionException("No database connection has been "
."provided.");
}
$this->db = $dbHandler;
$this->timeout = $timeout;
$this->zeroNumber = $number;
session_set_save_handler(
array($this, 'open'),
array($this, 'close'),
array($this, 'read'),
array($this, 'write'),
array($this, 'destroy'),
array($this, 'gc')
);
session_start();
register_shutdown_function('session_write_close');
}
public function open($savePath, $name) {
return true;
}
public function close() {
$this->gc(5);
return true;
}
public function read($sessId) {
$sql = "SELECT * "
."FROM zero".$this->zeroNumber."_session "
."WHERE sessionID = '".$sessId."' "
."LIMIT 1";
try {
$result = $this->db->query($sql, false);
if ($result->num_rows > 0) {
$return = $this->db->fetchRow($array);
return $return["data"];
}
} catch (DatabaseException $de) {
$se = new SessionException("Could not load session data from "
."database.");
$se->setNestedException($de);
throw $se;
}
return '';
}
public function write($sessId, $data) {
if ($data === null) {
return true;
}
$time = time();
$update = "UPDATE zero".$this->zeroNumber."_session "
."SET lastUpdate = '".$time."', "
."data = '".$data."' "
."WHERE sessionID = '".$sessId ."'";
$insert = "INSERT INTO zero".$this->zeroNumber."_session "
."('".$sessId."', '".$time."', '".$time."', '".$data."')";
try {
$this->db->query($update);
if ($this->db->getAffectedRows() > 0) {
return true;
}
$result = $this->db->query($insert);
return $result;
} catch (DatabaseException $de) {
$se = new SessionException("Could not load session data from "
."database.");
$se->setNestedException($de);
throw $se;
}
}
public function destroy($sessId) {
$delete = "DELETE FROM zero".$this->zeroNumber."_session "
."WHERE sessionID = '".$sessId."'";
return $this->db->query($delete, false);
}
public function gc($lifetime) {
$timeout = strtotime("-".$lifetime." minutes");
if ($this->timeout !== null) {
$timeout = strtotime("-".$this->timeout." minutes");
}
$delete = "DELETE FROM zero".$this->zeroNumber."_session "
."WHERE lastUpdate < '".$timeout."'";
return $this->db->query($delete, false);
}
}
?>
Ich bin im Moment mit meinem Latein am Ende.. hat vielleicht jemand eine Idee woran das liegen könnte?