'.$message.'
PHP:'.$logtrace; discuz_error::write_error_log($messagesave); } if($show) { if(!defined('IN_MOBILE')) { discuz_error::show_error('system', "
  • $message
  • ", $showtrace, 0); } else { discuz_error::mobile_show_error('system', "
  • $message
  • ", $showtrace, 0); } } if($halt) { exit(); } else { return $message; } } public static function template_error($message, $tplname) { $message = lang('error', $message); $tplname = str_replace(DISCUZ_ROOT, '', $tplname); $message = $message.': '.$tplname; discuz_error::system_error($message); } public static function debug_backtrace() { $skipfunc[] = 'discuz_error->debug_backtrace'; $skipfunc[] = 'discuz_error->db_error'; $skipfunc[] = 'discuz_error->template_error'; $skipfunc[] = 'discuz_error->system_error'; $skipfunc[] = 'db_mysql->halt'; $skipfunc[] = 'db_mysql->query'; $skipfunc[] = 'DB::_execute'; $show = $log = ''; $debug_backtrace = debug_backtrace(); krsort($debug_backtrace); foreach ($debug_backtrace as $k => $error) { $file = str_replace(DISCUZ_ROOT, '', $error['file']); $func = isset($error['class']) ? $error['class'] : ''; $func .= isset($error['type']) ? $error['type'] : ''; $func .= isset($error['function']) ? $error['function'] : ''; if(in_array($func, $skipfunc)) { break; } $error[line] = sprintf('%04d', $error['line']); $show .= "
  • [Line: $error[line]]".$file."($func)
  • "; $log .= !empty($log) ? ' -> ' : '';$file.':'.$error['line']; $log .= $file.':'.$error['line']; } return array($show, $log); } public static function db_error($message, $sql) { global $_G; list($showtrace, $logtrace) = discuz_error::debug_backtrace(); $title = lang('error', 'db_'.$message); $title_msg = lang('error', 'db_error_message'); $title_sql = lang('error', 'db_query_sql'); $title_backtrace = lang('error', 'backtrace'); $title_help = lang('error', 'db_help_link'); $db = &DB::object(); $dberrno = $db->errno(); $dberror = str_replace($db->tablepre, '', $db->error()); $sql = dhtmlspecialchars(str_replace($db->tablepre, '', $sql)); $msg = '
  • [Type] '.$title.'
  • '; $msg .= $dberrno ? '
  • ['.$dberrno.'] '.$dberror.'
  • ' : ''; $msg .= $sql ? '
  • [Query] '.$sql.'
  • ' : ''; discuz_error::show_error('db', $msg, $showtrace, false); unset($msg, $phperror); $errormsg = ''.$title.''; $errormsg .= "[$dberrno]
    ERR: $dberror
    "; if($sql) { $errormsg .= 'SQL: '.$sql; } $errormsg .= "
    "; $errormsg .= 'PHP: '.$logtrace; discuz_error::write_error_log($errormsg); exit(); } public static function exception_error($exception) { if($exception instanceof DbException) { $type = 'db'; } else { $type = 'system'; } if($type == 'db') { $errormsg = '('.$exception->getCode().') '; $errormsg .= self::sql_clear($exception->getMessage()); if($exception->getSql()) { $errormsg .= '
    '; $errormsg .= self::sql_clear($exception->getSql()); $errormsg .= '
    '; } } else { $errormsg = $exception->getMessage(); } $trace = $exception->getTrace(); krsort($trace); $trace[] = array('file'=>$exception->getFile(), 'line'=>$exception->getLine(), 'function'=> 'break'); $phpmsg = array(); foreach ($trace as $error) { if(!empty($error['function'])) { $fun = ''; if(!empty($error['class'])) { $fun .= $error['class'].$error['type']; } $fun .= $error['function'].'('; if(!empty($error['args'])) { $mark = ''; foreach($error['args'] as $arg) { $fun .= $mark; if(is_array($arg)) { $fun .= 'Array'; } elseif(is_bool($arg)) { $fun .= $arg ? 'true' : 'false'; } elseif(is_int($arg)) { $fun .= (defined('DISCUZ_DEBUG') && DISCUZ_DEBUG) ? $arg : '%d'; } elseif(is_float($arg)) { $fun .= (defined('DISCUZ_DEBUG') && DISCUZ_DEBUG) ? $arg : '%f'; } else { $fun .= (defined('DISCUZ_DEBUG') && DISCUZ_DEBUG) ? '\''.dhtmlspecialchars(substr(self::clear($arg), 0, 10)).(strlen($arg) > 10 ? ' ...' : '').'\'' : '%s'; } $mark = ', '; } } $fun .= ')'; $error['function'] = $fun; } $phpmsg[] = array( 'file' => str_replace(array(DISCUZ_ROOT, '\\'), array('', '/'), $error['file']), 'line' => $error['line'], 'function' => $error['function'], ); } self::show_error($type, $errormsg, $phpmsg); exit(); } public static function show_error($type, $errormsg, $phpmsg = '', $typemsg = '') { global $_G; ob_end_clean(); $gzip = getglobal('gzipcompress'); ob_start($gzip ? 'ob_gzhandler' : null); $host = $_SERVER['HTTP_HOST']; $title = $type == 'db' ? 'Database' : 'System'; echo << $host - $title Error

    Discuz! $title Error

    $errormsg
    EOT; if(!empty($phpmsg)) { echo '
    '; echo '

    PHP Debug

    '; echo ''; if(is_array($phpmsg)) { echo ''; foreach($phpmsg as $k => $msg) { $k++; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } } else { echo ''; } echo '
    No.FileLineCode
    '.$k.''.$msg['file'].''.$msg['line'].''.$msg['function'].'
      '.$phpmsg.'
    '; } $helplink = ''; if($type == 'db') { $helplink = "http://faq.comsenz.com/?type=mysql&dberrno=".rawurlencode(DB::errno())."&dberror=".rawurlencode(str_replace(DB::object()->tablepre, '', DB::error())); $helplink = "Need Help?"; } $endmsg = lang('error', 'error_end_message', array('host'=>$host)); echo <<$endmsg. $helplink
    EOT; $exit && exit(); } public static function mobile_show_error($type, $errormsg, $phpmsg) { global $_G; ob_end_clean(); ob_start(); $host = $_SERVER['HTTP_HOST']; $phpmsg = trim($phpmsg); $title = 'Mobile '.($type == 'db' ? 'Database' : 'System'); echo << $host - $title Error EOT; echo << EOT; if(!empty($phpmsg) && $type == 'db') { echo << EOT; } $endmsg = lang('error', 'mobile_error_end_message', array('host'=>$host)); echo <<
    Discuz! $title Error

    Error messages:
      $errormsg
     
    Program messages:
      $phpmsg

    $endmsg
    EOT; $exit && exit(); } public static function clear($message) { return str_replace(array("\t", "\r", "\n"), " ", $message); } public static function sql_clear($message) { $message = self::clear($message); $message = str_replace(DB::object()->tablepre, '', $message); $message = dhtmlspecialchars($message); return $message; } public static function write_error_log($message) { $message = discuz_error::clear($message); $time = time(); $file = DISCUZ_ROOT.'./data/log/'.date("Ym").'_errorlog.php'; $hash = md5($message); $uid = getglobal('uid'); $ip = getglobal('clientip'); $user = 'User: uid='.intval($uid).'; IP='.$ip.'; RIP:'.$_SERVER['REMOTE_ADDR']; $uri = 'Request: '.dhtmlspecialchars(discuz_error::clear($_SERVER['REQUEST_URI'])); $message = "\t{$time}\t$message\t$hash\t$user $uri\n"; if($fp = @fopen($file, 'rb')) { $lastlen = 50000; $maxtime = 60 * 10; $offset = filesize($file) - $lastlen; if($offset > 0) { fseek($fp, $offset); } if($data = fread($fp, $lastlen)) { $array = explode("\n", $data); if(is_array($array)) foreach($array as $key => $val) { $row = explode("\t", $val); if($row[0] != '') continue; if($row[3] == $hash && ($row[1] > $time - $maxtime)) { return; } } } } error_log($message, 3, $file); } }