2 /* vim: set expandtab sw=4 ts=4 sts=4: */
4 * Holds class PMA_Error
13 require_once './libraries/Message.class.php';
20 class PMA_Error
extends PMA_Message
27 static public $errortype = array (
29 E_WARNING
=> 'Warning',
30 E_PARSE
=> 'Parsing Error',
32 E_CORE_ERROR
=> 'Core Error',
33 E_CORE_WARNING
=> 'Core Warning',
34 E_COMPILE_ERROR
=> 'Compile Error',
35 E_COMPILE_WARNING
=> 'Compile Warning',
36 E_USER_ERROR
=> 'User Error',
37 E_USER_WARNING
=> 'User Warning',
38 E_USER_NOTICE
=> 'User Notice',
39 E_STRICT
=> 'Runtime Notice',
40 E_DEPRECATED
=> 'Deprecation Notice',
41 E_RECOVERABLE_ERROR
=> 'Catchable Fatal Error',
49 static public $errorlevel = array (
51 E_WARNING
=> 'warning',
54 E_CORE_ERROR
=> 'error',
55 E_CORE_WARNING
=> 'warning',
56 E_COMPILE_ERROR
=> 'error',
57 E_COMPILE_WARNING
=> 'warning',
58 E_USER_ERROR
=> 'error',
59 E_USER_WARNING
=> 'warning',
60 E_USER_NOTICE
=> 'notice',
62 E_DEPRECATED
=> 'notice',
63 E_RECOVERABLE_ERROR
=> 'error',
67 * The file in which the error occured
71 protected $_file = '';
74 * The line in which the error occured
81 * Holds any variables defined in the context where the error occured
82 * f. e. $this if the error occured in an object method
86 protected $_context = array();
89 * Holds the backtrace for this error
93 protected $_backtrace = array();
100 protected $_hash = null;
105 * @uses debug_backtrace()
106 * @uses PMA_Error::setNumber()
107 * @uses PMA_Error::setMessage()
108 * @uses PMA_Error::setFile()
109 * @uses PMA_Error::setLine()
110 * @uses PMA_Error::setContext()
111 * @uses PMA_Error::setBacktrace()
112 * @param integer $errno
113 * @param string $errstr
114 * @param string $errfile
115 * @param integer $errline
116 * @param array $errcontext
118 public function __construct($errno, $errstr, $errfile, $errline, $errcontext)
120 $this->setNumber($errno);
121 $this->setMessage($errstr, false);
122 $this->setFile($errfile);
123 $this->setLine($errline);
124 $this->setContext($errcontext);
126 $backtrace = debug_backtrace();
127 // remove last two calls: debug_backtrace() and handleError()
128 unset($backtrace[0]);
129 unset($backtrace[1]);
131 $this->setBacktrace($backtrace);
135 * sets PMA_Error::$_backtrace
137 * @uses PMA_Error::$_backtrace to set it
138 * @param array $backtrace
140 public function setBacktrace($backtrace)
142 $this->_backtrace
= $backtrace;
146 * sets PMA_Error::$_context
148 * @uses PMA_Error::$_context to set it
149 * @param array $context
151 public function setContext($context)
153 $this->_context
= $context;
157 * sets PMA_Error::$_line
159 * @uses PMA_Error::$_line to set it
160 * @param integer $line
162 public function setLine($line)
164 $this->_line
= $line;
168 * sets PMA_Error::$_file
170 * @uses PMA_Error::$_file to set it
171 * @uses PMA_Error::relPath()
172 * @param string $file
174 public function setFile($file)
176 $this->_file
= PMA_Error
::relPath($file);
181 * returns unique PMA_Error::$_hash, if not exists it will be created
183 * @uses PMA_Error::$_hash as return value and to set it if required
184 * @uses PMA_Error::getNumber()
185 * @uses PMA_Error::getMessage()
186 * @uses PMA_Error::getFile()
187 * @uses PMA_Error::getLine()
188 * @uses PMA_Error::getBacktrace()
190 * @param string $file
191 * @return string PMA_Error::$_hash
193 public function getHash()
195 if (null === $this->_hash
) {
198 $this->getMessage() .
201 $this->getBacktrace()
209 * returns PMA_Error::$_backtrace
211 * @uses PMA_Error::$_backtrace as return value
212 * @return array PMA_Error::$_backtrace
214 public function getBacktrace()
216 return $this->_backtrace
;
220 * returns PMA_Error::$_file
222 * @uses PMA_Error::$_file as return value
223 * @return string PMA_Error::$_file
225 public function getFile()
231 * returns PMA_Error::$_line
233 * @uses PMA_Error::$_line as return value
234 * @return integer PMA_Error::$_line
236 public function getLine()
242 * returns type of error
244 * @uses PMA_Error::$errortype
245 * @uses PMA_Error::getNumber()
246 * @return string type of error
248 public function getType()
250 return PMA_Error
::$errortype[$this->getNumber()];
254 * returns level of error
256 * @uses PMA_Error::$$errorlevel
257 * @uses PMA_Error::getNumber()
258 * @return string level of error
260 public function getLevel()
262 return PMA_Error
::$errorlevel[$this->getNumber()];
266 * returns title prepared for HTML Title-Tag
268 * @uses PMA_Error::getTitle()
269 * @uses htmlspecialchars()
271 * @return string HTML escaped and truncated title
273 public function getHtmlTitle()
275 return htmlspecialchars(substr($this->getTitle(), 0, 100));
279 * returns title for error
281 * @uses PMA_Error::getType()
282 * @uses PMA_Error::getMessage()
285 public function getTitle()
287 return $this->getType() . ': ' . $this->getMessage();
291 * Display HTML backtrace
293 * @uses PMA_Error::getBacktrace()
294 * @uses PMA_Error::relPath()
295 * @uses PMA_Error::displayArg()
298 public function displayBacktrace()
300 foreach ($this->getBacktrace() as $step) {
301 echo PMA_Error
::relPath($step['file']) . '#' . $step['line'] . ': ';
302 if (isset($step['class'])) {
303 echo $step['class'] . $step['type'];
305 echo $step['function'] . '(';
306 if (isset($step['args']) && (count($step['args']) > 1)) {
308 foreach ($step['args'] as $arg) {
310 $this->displayArg($arg, $step['function']);
311 echo ',' . "<br />\n";
313 } elseif (isset($step['args']) && (count($step['args']) > 0)) {
314 foreach ($step['args'] as $arg) {
315 $this->displayArg($arg, $step['function']);
318 echo ')' . "<br />\n";
323 * Display a single function argument
324 * if $function is one of include/require the $arg is converted te relative path
326 * @uses PMA_Error::relPath()
330 * @param string $function
332 protected function displayArg($arg, $function)
334 $include_functions = array(
341 if (in_array($function, $include_functions)) {
342 echo PMA_Error
::relPath($arg);
343 } elseif (is_scalar($arg)) {
344 echo gettype($arg) . ' ' . $arg;
351 * Displays the error in HTML
353 * @uses PMA_Error::getLevel()
354 * @uses PMA_Error::getType()
355 * @uses PMA_Error::getMessage()
356 * @uses PMA_Error::displayBacktrace()
357 * @uses PMA_Error::isDisplayed()
359 public function display()
361 echo '<div class="' . $this->getLevel() . '">';
362 if (! $this->isUserError()) {
363 echo '<strong>' . $this->getType() . '</strong>';
364 echo ' in ' . $this->getFile() . '#' . $this->getLine();
367 echo $this->getMessage();
368 if (! $this->isUserError()) {
371 echo "<strong>Backtrace</strong><br />\n";
373 echo $this->displayBacktrace();
376 $this->isDisplayed(true);
380 * whether this error is a user error
382 * @uses E_USER_WARNING
384 * @uses E_USER_NOTICE
385 * @uses PMA_Error::getNumber()
388 public function isUserError()
390 return $this->getNumber() & (E_USER_WARNING | E_USER_ERROR | E_USER_NOTICE
);
394 * return short relative path to phpMyAdmin basedir
396 * prevent path disclusore in error message,
397 * and make users feel save to submit error reports
409 * @uses str_replace()
410 * @param string $dest path to be shorten
411 * @return string shortened path
413 static function relPath($dest)
415 $dest = realpath($dest);
417 if (substr(PHP_OS
, 0, 3) == 'WIN') {
418 $path_separator = '\\';
420 $path_separator = '/';
423 $Ahere = explode($path_separator, realpath(dirname(__FILE__
) . $path_separator . '..'));
424 $Adest = explode($path_separator, $dest);
427 // && count ($Adest)>0 && count($Ahere)>0 )
428 while (implode($path_separator, $Adest) != implode($path_separator, $Ahere)) {
429 if (count($Ahere) > count($Adest)) {
431 $result .= $path_separator . '..';
436 $path = $result . str_replace(implode($path_separator, $Adest), '', $dest);
437 return str_replace($path_separator . $path_separator, $path_separator, $path);