Seltsamer Fatal Error

Tim Bureck

Erfahrenes Mitglied
Hallo zusammen ;)

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? :confused:
 
So ganz gefallen tut mir dieser Umstand nicht.. aber muss ich wohl mit leben. :) Nehme ich das throw $se; aus SessionHandler->write() raus, ist der Fehler wieder weg. Stattdessen habe ich jetzt mal, bis ich vielleicht eine andere Lösung finde return false; hinzugefügt...

Vielen Dank für die Antwort :)
 
Zurück