Vergleich inc/class_error.php - 1.8.5 - 1.8.29

  Keine Änderungen   Hinzugefügt   Modifiziert   Entfernt
Zeile 116Zeile 116
	 * @var boolean
*/
public $has_errors = false;

	 * @var boolean
*/
public $has_errors = false;

 

/**
* Display errors regardless of related settings (useful during initialization stage)
*
* @var boolean
*/
public $force_display_errors = false;


/**
* Initializes the error handler


/**
* Initializes the error handler

Zeile 130Zeile 137
			$error_types = $error_types & ~$bit;
}
error_reporting($error_types);

			$error_types = $error_types & ~$bit;
}
error_reporting($error_types);

		set_error_handler(array(&$this, "error"), $error_types);














		set_error_handler(array(&$this, "error_callback"), $error_types);
}

/**
* Passes relevant arguments for error processing.
*
* @param string $type The error type (i.e. E_ERROR, E_FATAL)
* @param string $message The error message
* @param string $file The error file
* @param integer $line The error line
*/
function error_callback($type, $message, $file=null, $line=0)
{
return $this->error($type, $message, $file, $line);

	}

/**

	}

/**

	 * Parses a error for processing.

	 * Processes an error.

	 *

	 *

	 * @param string The error type (i.e. E_ERROR, E_FATAL)
* @param string The error message
* @param string The error file
* @param integer The error line


	 * @param string $type The error type (i.e. E_ERROR, E_FATAL)
* @param string $message The error message
* @param string $file The error file
* @param integer $line The error line
* @param boolean $allow_output Whether or not output is permitted

	 * @return boolean True if parsing was a success, otherwise assume a error
*/

	 * @return boolean True if parsing was a success, otherwise assume a error
*/

	function error($type, $message, $file=null, $line=0)

	function error($type, $message, $file=null, $line=0, $allow_output=true)

	{
global $mybb;


	{
global $mybb;


		// Error reporting turned off (either globally or by @ before erroring statement)
if(error_reporting() == 0)

		// Error reporting turned off for this type
if((error_reporting() & $type) == 0)

		{
return true;
}

if(in_array($type, $this->ignore_types))

		{
return true;
}

if(in_array($type, $this->ignore_types))

		{

		{

			return true;
}

			return true;
}





		$file = str_replace(MYBB_ROOT, "", $file);

$this->has_errors = true;

		$file = str_replace(MYBB_ROOT, "", $file);

$this->has_errors = true;





		// For some reason in the installer this setting is set to "<"
$accepted_error_types = array('both', 'error', 'warning', 'none');

		// For some reason in the installer this setting is set to "<"
$accepted_error_types = array('both', 'error', 'warning', 'none');

		if(!in_array($mybb->settings['errortypemedium'], $accepted_error_types))














		if(isset($mybb->settings['errortypemedium']) && in_array($mybb->settings['errortypemedium'], $accepted_error_types))
{
$errortypemedium = $mybb->settings['errortypemedium'];
}
else
{
$errortypemedium = "none";
}

if(isset($mybb->settings['errorlogmedium']))
{
$errorlogmedium = $mybb->settings['errorlogmedium'];
}
else

		{

		{

			$mybb->settings['errortypemedium'] = "both";

			$errorlogmedium = 'none';

		}

if(defined("IN_TASK"))

		}

if(defined("IN_TASK"))

Zeile 174Zeile 208

require_once MYBB_ROOT."inc/functions_task.php";



require_once MYBB_ROOT."inc/functions_task.php";


 
			$filestr = '';

			if($file)
{
$filestr = " - Line: $line - File: $file";
}

add_task_log($task, "{$this->error_types[$type]} - [$type] ".var_export($message, true)."{$filestr}");

			if($file)
{
$filestr = " - Line: $line - File: $file";
}

add_task_log($task, "{$this->error_types[$type]} - [$type] ".var_export($message, true)."{$filestr}");

		}


		}


		// Saving error to log file.

		// Saving error to log file.

		if($mybb->settings['errorlogmedium'] == "log" || $mybb->settings['errorlogmedium'] == "both")

		if($errorlogmedium == "log" || $errorlogmedium == "both")

		{
$this->log_error($type, $message, $file, $line);

		{
$this->log_error($type, $message, $file, $line);

		}


		}


		// Are we emailing the Admin a copy?

		// Are we emailing the Admin a copy?

		if($mybb->settings['errorlogmedium'] == "mail" || $mybb->settings['errorlogmedium'] == "both")

		if($errorlogmedium == "mail" || $errorlogmedium == "both")

		{
$this->email_error($type, $message, $file, $line);

		{
$this->email_error($type, $message, $file, $line);

		}

// SQL Error
if($type == MYBB_SQL)
{
$this->output_error($type, $message, $file, $line);
}
else

		}

if($allow_output === true)






		{

		{

			// Do we have a PHP error?
if(my_strpos(my_strtolower($this->error_types[$type]), 'warning') === false)

			// SQL Error
if($type == MYBB_SQL)

			{
$this->output_error($type, $message, $file, $line);
}
// PHP Error

			{
$this->output_error($type, $message, $file, $line);
}
// PHP Error

			else

			elseif(strpos(strtolower($this->error_types[$type]), 'warning') === false)

			{

			{

				if($mybb->settings['errortypemedium'] == "none" || $mybb->settings['errortypemedium'] == "error")
{
echo "<div class=\"php_warning\">MyBB Internal: One or more warnings occurred. Please contact your administrator for assistance.</div>";
}










				$this->output_error($type, $message, $file, $line);
}
// PHP Warning
elseif(in_array($errortypemedium, array('warning', 'both')))
{
global $templates;

$warning = "<strong>{$this->error_types[$type]}</strong> [$type] $message - Line: $line - File: $file PHP ".PHP_VERSION." (".PHP_OS.")<br />\n";
if(is_object($templates) && method_exists($templates, "get") && !defined("IN_ADMINCP"))
{
$this->warnings .= $warning;
$this->warnings .= $this->generate_backtrace();
}

				else
{

				else
{

					global $templates;

$warning = "<strong>{$this->error_types[$type]}</strong> [$type] $message - Line: $line - File: $file PHP ".PHP_VERSION." (".PHP_OS.")<br />\n";
if(is_object($templates) && method_exists($templates, "get") && !defined("IN_ADMINCP"))
{
$this->warnings .= $warning;
$this->warnings .= $this->generate_backtrace();
}
else
{
echo "<div class=\"php_warning\">{$warning}".$this->generate_backtrace()."</div>";
}

					echo "<div class=\"php_warning\">{$warning}".$this->generate_backtrace()."</div>";












				}
}

				}
}

		}


		}


		return true;
}

/**
* Returns all the warnings
*

		return true;
}

/**
* Returns all the warnings
*

	 * @return string The warnings

	 * @return string|bool The warnings or false if no warnings exist

	 */
function show_warnings()
{

	 */
function show_warnings()
{

Zeile 249Zeile 277
		}

// Incase a template fails and we're receiving a blank page.

		}

// Incase a template fails and we're receiving a blank page.

		if(MANUAL_WARNINGS)

		if(MANUAL_WARNINGS)

		{
echo $this->warnings."<br />";
}

		{
echo $this->warnings."<br />";
}

Zeile 262Zeile 290
		$template_exists = false;

if(!is_object($templates) || !method_exists($templates, 'get'))

		$template_exists = false;

if(!is_object($templates) || !method_exists($templates, 'get'))

		{

		{

			if(@file_exists(MYBB_ROOT."inc/class_templates.php"))
{
@require_once MYBB_ROOT."inc/class_templates.php";
$templates = new templates;
$template_exists = true;

			if(@file_exists(MYBB_ROOT."inc/class_templates.php"))
{
@require_once MYBB_ROOT."inc/class_templates.php";
$templates = new templates;
$template_exists = true;

			}
}

			}
}

		else
{
$template_exists = true;
}


		else
{
$template_exists = true;
}


 
		$warning = '';

		if($template_exists == true)
{
eval("\$warning = \"".$templates->get("php_warnings")."\";");

		if($template_exists == true)
{
eval("\$warning = \"".$templates->get("php_warnings")."\";");

Zeile 282Zeile 311

return $warning;
}


return $warning;
}





	/**
* Triggers a user created error
* Example: $error_handler->trigger("Some Warning", E_USER_ERROR);
*

	/**
* Triggers a user created error
* Example: $error_handler->trigger("Some Warning", E_USER_ERROR);
*

	 * @param string Message
* @param string Type

	 * @param string $message Message
* @param string|int $type Type

	 */
function trigger($message="", $type=E_USER_ERROR)
{

	 */
function trigger($message="", $type=E_USER_ERROR)
{

Zeile 296Zeile 325

if(!$message)
{


if(!$message)
{

			$message = $lang->unknown_user_trigger;








			if(isset($lang->unknown_user_trigger))
{
$message = $lang->unknown_user_trigger;
}
else
{
$message .= 'An unknown error has been triggered.';
}

		}

if(in_array($type, $this->mybb_error_types))
{
$this->error($type, $message);

		}

if(in_array($type, $this->mybb_error_types))
{
$this->error($type, $message);

		}
else
{

		}
else
{

			trigger_error($message, $type);
}
}

/**
* Logs the error in the specified error log file.

			trigger_error($message, $type);
}
}

/**
* Logs the error in the specified error log file.

	 *
* @param string Warning type
* @param string Warning message
* @param string Warning file
* @param integer Warning line

	 *
* @param string $type Warning type
* @param string $message Warning message
* @param string $file Warning file
* @param integer $line Warning line

	 */
function log_error($type, $message, $file, $line)
{

	 */
function log_error($type, $message, $file, $line)
{

Zeile 328Zeile 364

// Do not log something that might be executable
$message = str_replace('<?', '< ?', $message);


// Do not log something that might be executable
$message = str_replace('<?', '< ?', $message);











$back_trace = $this->generate_backtrace(false, 2);

if($back_trace)
{
$back_trace = "\t<back_trace>{$back_trace}</back_trace>\n";
}


		$error_data = "<error>\n";
$error_data .= "\t<dateline>".TIME_NOW."</dateline>\n";
$error_data .= "\t<script>".$file."</script>\n";

		$error_data = "<error>\n";
$error_data .= "\t<dateline>".TIME_NOW."</dateline>\n";
$error_data .= "\t<script>".$file."</script>\n";

Zeile 336Zeile 379
		$error_data .= "\t<type>".$type."</type>\n";
$error_data .= "\t<friendly_type>".$this->error_types[$type]."</friendly_type>\n";
$error_data .= "\t<message>".$message."</message>\n";

		$error_data .= "\t<type>".$type."</type>\n";
$error_data .= "\t<friendly_type>".$this->error_types[$type]."</friendly_type>\n";
$error_data .= "\t<message>".$message."</message>\n";

 
		$error_data .= $back_trace;

		$error_data .= "</error>\n\n";


		$error_data .= "</error>\n\n";


		if(trim($mybb->settings['errorloglocation']) != "")

		if(isset($mybb->settings['errorloglocation']) && trim($mybb->settings['errorloglocation']) != "")

		{
@error_log($error_data, 3, $mybb->settings['errorloglocation']);
}

		{
@error_log($error_data, 3, $mybb->settings['errorloglocation']);
}

Zeile 351Zeile 395
	/**
* Emails the error in the specified error log file.
*

	/**
* Emails the error in the specified error log file.
*

	 * @param string Warning type
* @param string Warning message
* @param string Warning file
* @param integer Warning line


	 * @param string $type Warning type
* @param string $message Warning message
* @param string $file Warning file
* @param integer $line Warning line
* @return bool returns false if no admin email is set

	 */
function email_error($type, $message, $file, $line)
{
global $mybb;


	 */
function email_error($type, $message, $file, $line)
{
global $mybb;


		if(!$mybb->settings['adminemail'])

		if(empty($mybb->settings['adminemail']))

		{
return false;
}

		{
return false;
}


if($type == MYBB_SQL)
{
$message = "SQL Error: {$message['error_no']} - {$message['error']}\nQuery: {$message['query']}";
}

$message = "Your copy of MyBB running on {$mybb->settings['bbname']} ({$mybb->settings['bburl']}) has experienced an error. Details of the error include:\n---\nType: $type\nFile: $file (Line no. $line)\nMessage\n$message";
















if($type == MYBB_SQL)
{
$message = "SQL Error: {$message['error_no']} - {$message['error']}\nQuery: {$message['query']}";
}

if(function_exists('debug_backtrace'))
{
ob_start();
debug_print_backtrace();
$trace = ob_get_contents();
ob_end_clean();

$back_trace = "\nBack Trace: {$trace}";
}
else
{
$back_trace = '';
}

$message = "Your copy of MyBB running on {$mybb->settings['bbname']} ({$mybb->settings['bburl']}) has experienced an error. Details of the error include:\n---\nType: $type\nFile: $file (Line no. $line)\nMessage\n$message{$back_trace}";


@my_mail($mybb->settings['adminemail'], "MyBB error on {$mybb->settings['bbname']}", $message, $mybb->settings['adminemail']);


@my_mail($mybb->settings['adminemail'], "MyBB error on {$mybb->settings['bbname']}", $message, $mybb->settings['adminemail']);

 

return true;

	}


	}


 
	/**
* @param string $type
* @param string $message
* @param string $file
* @param int $line
*/

	function output_error($type, $message, $file, $line)
{

	function output_error($type, $message, $file, $line)
{

		global $mybb, $parser;

		global $mybb, $parser, $lang;





		if(!$mybb->settings['bbname'])

		if(isset($mybb->settings['bbname']))

		{

		{

			$mybb->settings['bbname'] = "MyBB";
















			$bbname = $mybb->settings['bbname'];
}
else
{
$bbname = "MyBB";
}

// For some reason in the installer this setting is set to "<"
$accepted_error_types = array('both', 'error', 'warning', 'none');
if(isset($mybb->settings['errortypemedium']) && in_array($mybb->settings['errortypemedium'], $accepted_error_types))
{
$errortypemedium = $mybb->settings['errortypemedium'];
}
else
{
$errortypemedium = "none";

		}

		}

 

$show_details = (
$this->force_display_errors ||
in_array($errortypemedium, array('both', 'error')) ||
defined("IN_INSTALL") ||
defined("IN_UPGRADE")
);


if($type == MYBB_SQL)
{
$title = "MyBB SQL Error";
$error_message = "<p>MyBB has experienced an internal SQL error and cannot continue.</p>";


if($type == MYBB_SQL)
{
$title = "MyBB SQL Error";
$error_message = "<p>MyBB has experienced an internal SQL error and cannot continue.</p>";

			if($mybb->settings['errortypemedium'] == "both" || $mybb->settings['errortypemedium'] == "error" || defined("IN_INSTALL") || defined("IN_UPGRADE"))

			if($show_details)

			{
$message['query'] = htmlspecialchars_uni($message['query']);
$message['error'] = htmlspecialchars_uni($message['error']);

			{
$message['query'] = htmlspecialchars_uni($message['query']);
$message['error'] = htmlspecialchars_uni($message['error']);

Zeile 405Zeile 494
		{
$title = "MyBB Internal Error";
$error_message = "<p>MyBB has experienced an internal error and cannot continue.</p>";

		{
$title = "MyBB Internal Error";
$error_message = "<p>MyBB has experienced an internal error and cannot continue.</p>";

			if($mybb->settings['errortypemedium'] == "both" || $mybb->settings['errortypemedium'] == "error" || defined("IN_INSTALL") || defined("IN_UPGRADE"))

			if($show_details)

			{
$error_message .= "<dl>\n";
$error_message .= "<dt>Error Type:</dt>\n<dd>{$this->error_types[$type]} ($type)</dd>\n";

			{
$error_message .= "<dl>\n";
$error_message .= "<dt>Error Type:</dt>\n<dd>{$this->error_types[$type]} ($type)</dd>\n";

Zeile 498Zeile 587
		{
$charset = 'UTF-8';
}

		{
$charset = 'UTF-8';
}

 

$contact_site_owner = '';
$is_in_contact = defined('THIS_SCRIPT') && THIS_SCRIPT === 'contact.php';
if(
!empty($mybb->settings['contactlink']) &&
(
!empty($mybb->settings['contact']) &&
!$is_in_contact &&
(
$mybb->settings['contactlink'] == "contact.php" &&
(
!isset($mybb->user['uid']) ||
($mybb->settings['contact_guests'] != 1 && $mybb->user['uid'] == 0) ||
$mybb->user['uid'] > 0
)
) ||
$mybb->settings['contactlink'] != "contact.php"
)
)
{
if(
!my_validate_url($mybb->settings['contactlink'], true, true) &&
my_substr($mybb->settings['contactlink'], 0, 7) != 'mailto:'
)
{
$mybb->settings['contactlink'] = $mybb->settings['bburl'].'/'.$mybb->settings['contactlink'];
}

$contact_site_owner = <<<HTML
If this problem persists, please <a href="{$mybb->settings['contactlink']}">contact the site owner</a>.
HTML;
}

$additional_name = '';
$docs_link = 'https://docs.mybb.com';
$common_issues_link = 'https://docs.mybb.com/1.8/faq/';
$support_link = 'https://community.mybb.com/';

if(isset($lang->settings['docs_link']))
{
$docs_link = $lang->settings['docs_link'];
}

if(isset($lang->settings['common_issues_link']))
{
$common_issues_link = $lang->settings['common_issues_link'];
}

if(isset($lang->settings['support_link']))
{
$support_link = $lang->settings['support_link'];
}


if(isset($lang->settings['additional_name']))
{
$additional_name = $lang->settings['additional_name'];
}

$contact = <<<HTML
<p>
<strong>If you're a visitor of this website</strong>, please wait a few minutes and try again.{$contact_site_owner}
</p>

<p>
<strong>If you are the site owner</strong>, please check the <a href="{$docs_link}">MyBB{$additional_name} Documentation</a> for help resolving <a href="{$common_issues_link}">common issues</a>, or get technical help on the <a href="{$support_link}">MyBB{$additional_name} Community Forums</a>.
</p>
HTML;


if(!headers_sent() && !defined("IN_INSTALL") && !defined("IN_UPGRADE"))
{


if(!headers_sent() && !defined("IN_INSTALL") && !defined("IN_UPGRADE"))
{

Zeile 505Zeile 662
			@header('Status: 503 Service Temporarily Unavailable');
@header('Retry-After: 1800');
@header("Content-type: text/html; charset={$charset}");

			@header('Status: 503 Service Temporarily Unavailable');
@header('Retry-After: 1800');
@header("Content-type: text/html; charset={$charset}");

			$_SERVER['PHP_SELF'] = htmlspecialchars_uni($_SERVER['PHP_SELF']);











$file_name = basename($_SERVER['SCRIPT_FILENAME']);
if(function_exists('htmlspecialchars_uni'))
{
$file_name = htmlspecialchars_uni($file_name);
}
else
{
$file_name = htmlspecialchars($file_name);
}


echo <<<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


echo <<<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

	<title>{$mybb->settings['bbname']} - Internal Error</title>

	<title>{$bbname} - Internal Error</title>

	<style type="text/css">
body { background: #efefef; color: #000; font-family: Tahoma,Verdana,Arial,Sans-Serif; font-size: 12px; text-align: center; line-height: 1.4; }
a:link { color: #026CB1; text-decoration: none; }
a:visited { color: #026CB1; text-decoration: none; }
a:hover, a:active { color: #000; text-decoration: underline; }
#container { width: 600px; padding: 20px; background: #fff; border: 1px solid #e4e4e4; margin: 100px auto; text-align: left; -moz-border-radius: 6px; -webkit-border-radius: 6px; border-radius: 6px; }

	<style type="text/css">
body { background: #efefef; color: #000; font-family: Tahoma,Verdana,Arial,Sans-Serif; font-size: 12px; text-align: center; line-height: 1.4; }
a:link { color: #026CB1; text-decoration: none; }
a:visited { color: #026CB1; text-decoration: none; }
a:hover, a:active { color: #000; text-decoration: underline; }
#container { width: 600px; padding: 20px; background: #fff; border: 1px solid #e4e4e4; margin: 100px auto; text-align: left; -moz-border-radius: 6px; -webkit-border-radius: 6px; border-radius: 6px; }

		h1 { margin: 0; background: url({$_SERVER['PHP_SELF']}?action=mybb_logo) no-repeat;	height: 82px; width: 248px; }

		h1 { margin: 0; background: url({$file_name}?action=mybb_logo) no-repeat;	height: 82px; width: 248px; }

		#content { border: 1px solid #026CB1; background: #fff; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; }
h2 { font-size: 12px; padding: 4px; background: #026CB1; color: #fff; margin: 0; }
.invisible { display: none; }

		#content { border: 1px solid #026CB1; background: #fff; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; }
h2 { font-size: 12px; padding: 4px; background: #026CB1; color: #fff; margin: 0; }
.invisible { display: none; }

Zeile 531Zeile 697
<body>
<div id="container">
<div id="logo">

<body>
<div id="container">
<div id="logo">

			<h1><a href="http://www.mybb.com/" title="MyBB"><span class="invisible">MyBB</span></a></h1>
</div>

			<h1><a href="https://mybb.com/" title="MyBB"><span class="invisible">MyBB</span></a></h1>
</div>


<div id="content">
<h2>{$title}</h2>

<div id="error">
{$error_message}


<div id="content">
<h2>{$title}</h2>

<div id="error">
{$error_message}

				<p id="footer">Please contact the <a href="http://www.mybb.com">MyBB Group</a> for technical support.</p>

				<p id="footer">{$contact}</p>

			</div>
</div>
</div>
</body>
</html>

			</div>
</div>
</div>
</body>
</html>

EOF;
}

EOF;
}

		else
{
echo <<<EOF

		else
{
echo <<<EOF

Zeile 564Zeile 730
		<h2>{$title}</h2>
<div id="mybb_error_error">
{$error_message}

		<h2>{$title}</h2>
<div id="mybb_error_error">
{$error_message}

			<p id="mybb_error_footer">Please contact the <a href="http://www.mybb.com">MyBB Group</a> for technical support.</p>

			<p id="mybb_error_footer">{$contact}</p>

		</div>
</div>
EOF;
}

		</div>
</div>
EOF;
}

 


		exit(1);
}


		exit(1);
}


Zeile 577Zeile 744
	 *
* @return string The generated backtrace
*/

	 *
* @return string The generated backtrace
*/

	function generate_backtrace()

	function generate_backtrace($html=true, $strip=1)

	{

	{

 
		$backtrace = '';

		if(function_exists("debug_backtrace"))
{

		if(function_exists("debug_backtrace"))
{

			$trace = debug_backtrace();
$backtrace = "<table style=\"width: 100%; margin: 10px 0; border: 1px solid #aaa; border-collapse: collapse; border-bottom: 0;\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
$backtrace .= "<thead><tr>\n";
$backtrace .= "<th style=\"border-bottom: 1px solid #aaa; background: #ccc; padding: 4px; text-align: left; font-size: 11px;\">File</th>\n";
$backtrace .= "<th style=\"border-bottom: 1px solid #aaa; background: #ccc; padding: 4px; text-align: left; font-size: 11px;\">Line</th>\n";
$backtrace .= "<th style=\"border-bottom: 1px solid #aaa; background: #ccc; padding: 4px; text-align: left; font-size: 11px;\">Function</th>\n";
$backtrace .= "</tr></thead>\n<tbody>\n";

// Strip off this function from trace
array_shift($trace);







			$trace = debug_backtrace(1<<1 /* DEBUG_BACKTRACE_IGNORE_ARGS */);

if($html)
{
$backtrace = "<table style=\"width: 100%; margin: 10px 0; border: 1px solid #aaa; border-collapse: collapse; border-bottom: 0;\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
$backtrace .= "<thead><tr>\n";
$backtrace .= "<th style=\"border-bottom: 1px solid #aaa; background: #ccc; padding: 4px; text-align: left; font-size: 11px;\">File</th>\n";
$backtrace .= "<th style=\"border-bottom: 1px solid #aaa; background: #ccc; padding: 4px; text-align: left; font-size: 11px;\">Line</th>\n";
$backtrace .= "<th style=\"border-bottom: 1px solid #aaa; background: #ccc; padding: 4px; text-align: left; font-size: 11px;\">Function</th>\n";
$backtrace .= "</tr></thead>\n<tbody>\n";
}

// Strip off calls from trace
$trace = array_slice($trace, $strip);

$i = 0;


foreach($trace as $call)


foreach($trace as $call)

			{

			{

				if(empty($call['file'])) $call['file'] = "[PHP]";

				if(empty($call['file'])) $call['file'] = "[PHP]";

				if(empty($call['line'])) $call['line'] = "&nbsp;";

				if(empty($call['line'])) $call['line'] = " ";

				if(!empty($call['class'])) $call['function'] = $call['class'].$call['type'].$call['function'];
$call['file'] = str_replace(MYBB_ROOT, "/", $call['file']);

				if(!empty($call['class'])) $call['function'] = $call['class'].$call['type'].$call['function'];
$call['file'] = str_replace(MYBB_ROOT, "/", $call['file']);

				$backtrace .= "<tr>\n";
$backtrace .= "<td style=\"font-size: 11px; padding: 4px; border-bottom: 1px solid #ccc;\">{$call['file']}</td>\n";
$backtrace .= "<td style=\"font-size: 11px; padding: 4px; border-bottom: 1px solid #ccc;\">{$call['line']}</td>\n";
$backtrace .= "<td style=\"font-size: 11px; padding: 4px; border-bottom: 1px solid #ccc;\">{$call['function']}</td>\n";
$backtrace .= "</tr>\n";

















if($html)
{
$backtrace .= "<tr>\n";
$backtrace .= "<td style=\"font-size: 11px; padding: 4px; border-bottom: 1px solid #ccc;\">{$call['file']}</td>\n";
$backtrace .= "<td style=\"font-size: 11px; padding: 4px; border-bottom: 1px solid #ccc;\">{$call['line']}</td>\n";
$backtrace .= "<td style=\"font-size: 11px; padding: 4px; border-bottom: 1px solid #ccc;\">{$call['function']}</td>\n";
$backtrace .= "</tr>\n";
}
else
{
$backtrace .= "#{$i} {$call['function']}() called at [{$call['file']}:{$call['line']}]\n";
}

$i++;
}

if($html)
{
$backtrace .= "</tbody></table>\n";

			}

			}

			$backtrace .= "</tbody></table>\n";

 
		}
return $backtrace;
}

		}
return $backtrace;
}