2 /* vim: set expandtab sw=4 ts=4 sts=4: */
4 * Holds class PMA_Error_Handler
13 require_once './libraries/Error.class.php';
20 class PMA_Error_Handler
23 * holds errors to be displayed or reported later ...
25 * @var array of PMA_Error
27 protected $_errors = array();
30 * Constructor - set PHP error handler
32 * @uses set_error_handler()
34 public function __construct()
36 set_error_handler(array($this, 'handleError'));
42 * stores errors in session
44 * @uses $_SESSION['errors']
46 * @uses PMA_Error_Handler::$_errors
47 * @uses PMA_Error::isDisplayed()
49 public function __destruct()
51 if (isset($_SESSION)) {
52 if (! isset($_SESSION['errors'])) {
53 $_SESSION['errors'] = array();
56 if ($GLOBALS['cfg']['Error_Handler']['gather']) {
57 // remember all errors
58 $_SESSION['errors'] = array_merge($_SESSION['errors'], $this->_errors
);
60 // remember only not displayed errors
61 foreach ($this->_errors
as $key => $error) {
62 if (($error instanceof PMA_Error
) && ! $error->isDisplayed()) {
63 $_SESSION['errors'][$key] = $error;
71 * returns array with all errors
73 * @uses PMA_Error_Handler::$_errors as return value
74 * @uses PMA_Error_Handler::_checkSavedErrors()
75 * @return array PMA_Error_Handler::$_errors
77 protected function getErrors()
79 $this->_checkSavedErrors();
80 return $this->_errors
;
84 * Error handler - called when errors are triggered/occured
86 * The following error types cannot be handled with a user defined function:
87 * E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR,
89 * and most of E_STRICT raised in the file where set_error_handler() is called.
92 * @uses E_USER_WARNING
96 * @uses E_CORE_WARNING
97 * @uses E_COMPILE_WARNING
102 * @uses E_COMPILE_ERROR
103 * @uses E_RECOVERABLE_ERROR
105 * @uses PMA_Error_Handler::$_errors
106 * @uses PMA_Error_Handler::_dispFatalError()
107 * @uses PMA_Error::getHash()
108 * @uses PMA_Error::getNumber()
109 * @param integer $errno
110 * @param string $errstr
111 * @param string $errfile
112 * @param integer $errline
113 * @param array $errcontext
115 public function handleError($errno, $errstr, $errfile, $errline, $errcontext)
117 // create error object
118 $error = new PMA_Error($errno, $errstr, $errfile, $errline, $errcontext);
120 // do not repeat errors
121 $this->_errors
[$error->getHash()] = $error;
123 switch ($error->getNumber()) {
131 case E_COMPILE_WARNING
:
133 case E_RECOVERABLE_ERROR
:
134 // just collect the error
135 // display is called from outside
140 case E_COMPILE_ERROR
:
142 // FATAL error, dislay it and exit
143 $this->_dispFatalError($error);
150 * log error to configured log facility
153 * @uses PMA_Error::getMessage()
155 * @param PMA_Error $error
157 protected function _logError($error)
159 return error_log($error->getMessage());
163 * trigger a custom error
165 * @uses trigger_error()
166 * @param string $errorInfo
167 * @param integer $errorNumber
168 * @param string $file
169 * @param integer $line
171 public function triggerError($errorInfo, $errorNumber = null, $file = null, $line = null)
173 // we could also extract file and line from backtrace and call handleError() directly
174 trigger_error($errorInfo, $errorNumber);
178 * display fatal error and exit
180 * @uses headers_sent()
181 * @uses PMA_Error::display()
182 * @uses PMA_Error_Handler::_dispPageStart()
183 * @uses PMA_Error_Handler::_dispPageEnd()
184 * @param PMA_Error $error
186 protected function _dispFatalError($error)
188 if (! headers_sent()) {
189 $this->_dispPageStart($error);
192 $this->_dispPageEnd();
197 * display the whole error page with all errors
199 * @uses headers_sent()
200 * @uses PMA_Error_Handler::dispAllErrors()
201 * @uses PMA_Error_Handler::_dispPageStart()
202 * @uses PMA_Error_Handler::_dispPageEnd()
204 public function dispErrorPage()
206 if (! headers_sent()) {
207 $this->_dispPageStart();
209 $this->dispAllErrors();
210 $this->_dispPageEnd();
214 * display user errors not displayed
216 * @uses PMA_Error_Handler::getErrors()
217 * @uses PMA_Error::isDisplayed()
218 * @uses PMA_Error::isUserError()
219 * @uses PMA_Error::display()
221 public function dispUserErrors()
223 foreach ($this->getErrors() as $error) {
224 if ($error->isUserError() && ! $error->isDisplayed()) {
231 * display HTML header
233 * @uses PMA_Error::getTitle()
234 * @param PMA_error $error
236 protected function _dispPageStart($error = null)
238 echo '<html><head><title>';
240 echo $error->getTitle();
242 echo 'phpMyAdmin error reporting page';
244 echo '</title></head>';
248 * display HTML footer
251 protected function _dispPageEnd()
253 echo '</body></html>';
257 * display all errors regardless already displayed or user errors
259 * @uses PMA_Error_Handler::getErrors()
260 * @uses PMA_Error::display()
262 public function dispAllErrors()
264 foreach ($this->getErrors() as $error) {
270 * display errors not displayed
272 * @uses $cfg['Error_Handler']['display']
273 * @uses PMA_Error_Handler::getErrors()
274 * @uses PMA_Error_Handler::dispUserErrors()
275 * @uses PMA_Error::isDisplayed()
276 * @uses PMA_Error::display()
278 public function dispErrors()
280 if ($GLOBALS['cfg']['Error_Handler']['display']) {
281 foreach ($this->getErrors() as $error) {
282 if ($error instanceof PMA_Error
) {
283 if (! $error->isDisplayed()) {
291 $this->dispUserErrors();
296 * look in session for saved errors
298 * @uses $_SESSION['errors']
299 * @uses PMA_Error_Handler::$_errors
300 * @uses array_merge()
302 protected function _checkSavedErrors()
304 if (isset($_SESSION['errors'])) {
306 // restore saved errors
307 foreach ($_SESSION['errors'] as $hash => $error) {
308 if ($error instanceof PMA_Error
&& ! isset($this->_errors
[$hash])) {
309 $this->_errors
[$hash] = $error;
312 //$this->_errors = array_merge($_SESSION['errors'], $this->_errors);
314 // delet stored errors
315 $_SESSION['errors'] = array();
316 unset($_SESSION['errors']);
321 * return count of errors
323 * @uses PMA_Error_Handler::getErrors()
325 * @return integer number of errors occoured
327 public function countErrors()
329 return count($this->getErrors());
333 * return count of user errors
335 * @uses PMA_Error_Handler::countErrors()
336 * @uses PMA_Error_Handler::getErrors()
337 * @uses PMA_Error::isUserError()
338 * @return integer number of user errors occoured
340 public function countUserErrors()
343 if ($this->countErrors()) {
344 foreach ($this->getErrors() as $error) {
345 if ($error->isUserError()) {
355 * whether use errors occured or not
357 * @uses PMA_Error_Handler::countUserErrors()
360 public function hasUserErrors()
362 return (bool) $this->countUserErrors();
366 * whether errors occured or not
368 * @uses PMA_Error_Handler::countErrors()
371 public function hasErrors()
373 return (bool) $this->countErrors();
377 * number of errors to be displayed
379 * @uses $cfg['Error_Handler']['display']
380 * @uses PMA_Error_Handler::countErrors()
381 * @uses PMA_Error_Handler::countUserErrors()
382 * @return integer number of errors to be displayed
384 public function countDisplayErrors()
386 if ($GLOBALS['cfg']['Error_Handler']['display']) {
387 return $this->countErrors();
389 return $this->countUserErrors();
394 * whether there are errors to display or not
396 * @uses PMA_Error_Handler::countDisplayErrors()
399 public function hasDisplayErrors()
401 return (bool) $this->countDisplayErrors();