@'.$user['username'].''; } } }, $str); $referrers_list = array(); foreach ($referrers as $referrer => $val) { $referrers_list[] = $referrer; } return array($res, $referrers_list); } function uojFilePreview($file_name, $output_limit) { return strOmit(file_get_contents($file_name, false, null, -1, $output_limit + 4), $output_limit); } function uojIncludeView($name, $view_params = array()) { extract($view_params); include $_SERVER['DOCUMENT_ROOT'].'/app/views/'.$name.'.php'; } function redirectTo($url) { header('Location: '.$url); die(); } function permanentlyRedirectTo($url) { header("HTTP/1.1 301 Moved Permanently"); header('Location: '.$url); die(); } function redirectToLogin() { if (UOJContext::isAjax()) { die('please login'); } else { header('Location: '.HTML::url('/login')); die(); } } function becomeMsgPage($msg, $title = '消息') { if (UOJContext::isAjax()) { die($msg); } else { echoUOJPageHeader($title); echo $msg; echoUOJPageFooter(); die(); } } function become404Page() { header($_SERVER['SERVER_PROTOCOL'] . " 404 Not Found", true, 404); becomeMsgPage('
404

唔……未找到该页面……你是从哪里点进来的……>_<……

', '404'); } function become403Page() { header($_SERVER['SERVER_PROTOCOL'] . " 403 Forbidden", true, 403); becomeMsgPage('
403

禁止入内! T_T

', '403'); } function getUserLink($username, $rating = null) { if (validateUsername($username) && ($user = queryUser($username))) { if ($rating == null) { $rating = $user['rating']; } return ''.$username.''; } else { $esc_username = HTML::escape($username); return ''.$esc_username.''; } } function getProblemLink($problem, $problem_title = '!title_only') { if ($problem_title == '!title_only') { $problem_title = $problem['title']; } else if ($problem_title == '!id_and_title') { $problem_title = "#${problem['id']}. ${problem['title']}"; } return ''.$problem_title.''; } function getContestProblemLink($problem, $contest_id, $problem_title = '!title_only') { if ($problem_title == '!title_only') { $problem_title = $problem['title']; } else if ($problem_title == '!id_and_title') { $problem_title = "#{$problem['id']}. {$problem['title']}"; } return ''.$problem_title.''; } function getBlogLink($id) { if (validateUInt($id) && $blog = queryBlog($id)) { return ''.$blog['title'].''; } } function getClickZanBlock($type, $id, $cnt, $val = null) { if ($val == null) { $val = queryZanVal($id, $type, Auth::user()); } return '
'; } function getLongTablePageRawUri($page) { $path = strtok(UOJContext::requestURI(), '?'); $query_string = strtok('?'); parse_str($query_string, $param); $param['page'] = $page; if ($page == 1) unset($param['page']); if ($param) { return $path . '?' . http_build_query($param); } else { return $path; } } function getLongTablePageUri($page) { return HTML::escape(getLongTablePageRawUri($page)); } function echoLongTable($col_names, $table_name, $cond, $tail, $header_row, $print_row, $config) { $pag_config = $config; $pag_config['col_names'] = $col_names; $pag_config['table_name'] = $table_name; $pag_config['cond'] = $cond; $pag_config['tail'] = $tail; $pag = new Paginator($pag_config); $div_classes = isset($config['div_classes']) ? $config['div_classes'] : array('table-responsive'); $table_classes = isset($config['table_classes']) ? $config['table_classes'] : array('table', 'table-bordered', 'table-hover', 'table-striped', 'table-text-center'); echo '
'; echo ''; echo ''; echo $header_row; echo ''; echo ''; foreach ($pag->get() as $idx => $row) { if (isset($config['get_row_index'])) { $print_row($row, $idx); } else { $print_row($row); } } if ($pag->isEmpty()) { echo ''; } echo ''; echo '
'.UOJLocale::get('none').'
'; echo '
'; if (isset($config['print_after_table'])) { $fun = $config['print_after_table']; $fun(); } echo $pag->pagination(); } function getSubmissionStatusDetails($submission) { $html = ''; $out_status = explode(', ', $submission['status'])[0]; $fly = '小熊像超人一样飞'; $think = '小熊像在思考'; if ($out_status == 'Judged') { $status_text = 'Judged!'; $status_img = $fly; } else { if ($submission['status_details'] !== '') { $status_img = $fly; $status_text = HTML::escape($submission['status_details']); } else { $status_img = $think; $status_text = $out_status; } } $html .= '
' . $status_img . '
'; $html .= '
' . $status_text . '
'; $html .= ''; return $html; } function echoSubmission($submission, $config, $user) { $problem = queryProblemBrief($submission['problem_id']); $submitterLink = getUserLink($submission['submitter']); if ($submission['score'] == null) { $used_time_str = "/"; $used_memory_str = "/"; } else { $used_time_str = $submission['used_time'] . 'ms'; $used_memory_str = $submission['used_memory'] . 'kb'; } $status = explode(', ', $submission['status'])[0]; $show_status_details = Auth::check() && $submission['submitter'] === Auth::id() && $status !== 'Judged'; if (!$show_status_details) { echo ''; } else { echo ''; } if (!isset($config['id_hidden'])) { echo '#', $submission['id'], ''; } if (!isset($config['problem_hidden'])) { if ($submission['contest_id']) { echo '', getContestProblemLink($problem, $submission['contest_id'], '!id_and_title'), ''; } else { echo '', getProblemLink($problem, '!id_and_title'), ''; } } if (!isset($config['submitter_hidden'])) { echo '', $submitterLink, ''; } if (!isset($config['result_hidden'])) { echo ''; if ($status == 'Judged') { if ($submission['score'] == null) { echo '', $submission['result_error'], ''; } else { echo '', $submission['score'], ''; } } else { echo '', $status, ''; } echo ''; } if (!isset($config['used_time_hidden'])) echo '', $used_time_str, ''; if (!isset($config['used_memory_hidden'])) echo '', $used_memory_str, ''; echo '', '', $submission['language'], '', ''; if ($submission['tot_size'] < 1024) { $size_str = $submission['tot_size'] . 'b'; } else { $size_str = sprintf("%.1f", $submission['tot_size'] / 1024) . 'kb'; } echo '', $size_str, ''; if (!isset($config['submit_time_hidden'])) echo '', $submission['submit_time'], ''; if (!isset($config['judge_time_hidden'])) echo '', $submission['judge_time'], ''; echo ''; if ($show_status_details) { echo ''; echo getSubmissionStatusDetails($submission); echo ''; echo ''; } } function echoSubmissionsListOnlyOne($submission, $config, $user) { echo '
'; echo ''; echo ''; echo ''; if (!isset($config['id_hidden'])) echo ''; if (!isset($config['problem_hidden'])) echo ''; if (!isset($config['submitter_hidden'])) echo ''; if (!isset($config['result_hidden'])) echo ''; if (!isset($config['used_time_hidden'])) echo ''; if (!isset($config['used_memory_hidden'])) echo ''; echo ''; echo ''; if (!isset($config['submit_time_hidden'])) echo ''; if (!isset($config['judge_time_hidden'])) echo ''; echo ''; echo ''; echo ''; echoSubmission($submission, $config, $user); echo ''; echo '
ID'.UOJLocale::get('problems::problem').''.UOJLocale::get('problems::submitter').''.UOJLocale::get('problems::result').''.UOJLocale::get('problems::used time').''.UOJLocale::get('problems::used memory').''.UOJLocale::get('problems::language').''.UOJLocale::get('problems::file size').''.UOJLocale::get('problems::submit time').''.UOJLocale::get('problems::judge time').'
'; echo '
'; } function echoSubmissionsList($cond, $tail, $config, $user) { $header_row = ''; $col_names = array(); $col_names[] = 'submissions.status_details'; $col_names[] = 'submissions.status'; $col_names[] = 'submissions.result_error'; $col_names[] = 'submissions.score'; if (!isset($config['id_hidden'])) { $header_row .= 'ID'; $col_names[] = 'submissions.id'; } if (!isset($config['problem_hidden'])) { $header_row .= ''.UOJLocale::get('problems::problem').''; $col_names[] = 'submissions.problem_id'; $col_names[] = 'submissions.contest_id'; } if (!isset($config['submitter_hidden'])) { $header_row .= ''.UOJLocale::get('problems::submitter').''; $col_names[] = 'submissions.submitter'; } if (!isset($config['result_hidden'])) { $header_row .= ''.UOJLocale::get('problems::result').''; } if (!isset($config['used_time_hidden'])) { $header_row .= ''.UOJLocale::get('problems::used time').''; $col_names[] = 'submissions.used_time'; } if (!isset($config['used_memory_hidden'])) { $header_row .= ''.UOJLocale::get('problems::used memory').''; $col_names[] = 'submissions.used_memory'; } $header_row .= ''.UOJLocale::get('problems::language').''; $col_names[] = 'submissions.language'; $header_row .= ''.UOJLocale::get('problems::file size').''; $col_names[] = 'submissions.tot_size'; if (!isset($config['submit_time_hidden'])) { $header_row .= ''.UOJLocale::get('problems::submit time').''; $col_names[] = 'submissions.submit_time'; } if (!isset($config['judge_time_hidden'])) { $header_row .= ''.UOJLocale::get('problems::judge time').''; $col_names[] = 'submissions.judge_time'; } $header_row .= ''; $table_name = isset($config['table_name']) ? $config['table_name'] : 'submissions'; if (!isSuperUser($user)) { if ($user != null) { $permission_cond = "submissions.is_hidden = false or (submissions.is_hidden = true and submissions.problem_id in (select problem_id from problems_permissions where username = '{$user['username']}'))"; } else { $permission_cond = "submissions.is_hidden = false"; } if ($cond !== '1') { $cond = "($cond) and ($permission_cond)"; } else { $cond = $permission_cond; } } $table_config = isset($config['table_config']) ? $config['table_config'] : null; echoLongTable($col_names, $table_name, $cond, $tail, $header_row, function($submission) use($config, $user) { echoSubmission($submission, $config, $user); }, $table_config); } function echoSubmissionContent($submission, $requirement) { $zip_file = new ZipArchive(); $submission_content = json_decode($submission['content'], true); $zip_file->open(UOJContext::storagePath().$submission_content['file_name']); $config = array(); foreach ($submission_content['config'] as $config_key => $config_val) { $config[$config_val[0]] = $config_val[1]; } foreach ($requirement as $req) { if ($req['type'] == "source code") { $file_content = $zip_file->getFromName("{$req['name']}.code"); $file_content = uojTextEncode($file_content, array('allow_CR' => true, 'html_escape' => true)); $file_language = htmlspecialchars($config["{$req['name']}_language"]); $footer_text = UOJLocale::get('problems::source code').', '.UOJLocale::get('problems::language').': '.$file_language; switch ($file_language) { case 'C++': case 'C++11': $sh_class = 'sh_cpp'; break; case 'Python2.7': case 'Python3': $sh_class = 'sh_python'; break; case 'Java7': case 'Java8': $sh_class = 'sh_java'; break; case 'C': $sh_class = 'sh_c'; break; case 'Pascal': $sh_class = 'sh_pascal'; break; default: $sh_class = ''; break; } echo '
'; echo '
'; echo '

'.$req['name'].'

'; echo '
'; echo '
'; echo '
'.$file_content."\n".'
'; echo '
'; echo ''; echo '
'; } else if ($req['type'] == "text") { $file_content = $zip_file->getFromName("{$req['file_name']}", 504); $file_content = strOmit($file_content, 500); $file_content = uojTextEncode($file_content, array('allow_CR' => true, 'html_escape' => true)); $footer_text = UOJLocale::get('problems::text file'); echo '
'; echo '
'; echo '

'.$req['file_name'].'

'; echo '
'; echo '
'; echo '
'."\n".$file_content."\n".'
'; echo '
'; echo ''; echo '
'; } } $zip_file->close(); } class JudgementDetailsPrinter { private $name; private $styler; private $dom; private $subtask_num; private function _print_c($node) { foreach ($node->childNodes as $child) { if ($child->nodeName == '#text') { echo htmlspecialchars($child->nodeValue); } else { $this->_print($child); } } } private function _print($node) { if ($node->nodeName == 'error') { echo "
\n";
			$this->_print_c($node);
			echo "\n
"; } elseif ($node->nodeName == 'tests') { echo '
'; if ($this->styler->show_small_tip) { echo '
', '小提示:点击横条可展开更详细的信息', '
'; } $this->_print_c($node); echo '
'; } elseif ($node->nodeName == 'subtask') { $subtask_num = $node->getAttribute('num'); $subtask_score = $node->getAttribute('score'); $subtask_info = $node->getAttribute('info'); echo '
'; $accordion_parent = "{$this->name}_details_accordion"; $accordion_collapse = "{$accordion_parent}_collapse_subtask_{$subtask_num}"; $accordion_collapse_accordion = "{$accordion_collapse}_accordion"; echo '
'; echo '
'; echo '
'; echo '

', 'Subtask #', $subtask_num, ': ', '

'; echo '
'; if ($this->styler->show_score) { echo '
'; echo 'score: ', $subtask_score; echo '
'; echo '
'; echo htmlspecialchars($subtask_info); echo '
'; } else { echo '
'; echo htmlspecialchars($subtask_info); echo '
'; } echo '
'; echo '
'; echo '
'; echo '
'; echo '
'; $this->subtask_num = $subtask_num; $this->_print_c($node); $this->subtask_num = null; echo '
'; echo '
'; echo '
'; echo '
'; } elseif ($node->nodeName == 'test') { $test_info = $node->getAttribute('info'); $test_num = $node->getAttribute('num'); $test_score = $node->getAttribute('score'); $test_time = $node->getAttribute('time'); $test_memory = $node->getAttribute('memory'); echo '
'; $accordion_parent = "{$this->name}_details_accordion"; if ($this->subtask_num != null) { $accordion_parent .= "_collapse_subtask_{$this->subtask_num}_accordion"; } $accordion_collapse = "{$accordion_parent}_collapse_test_{$test_num}"; if (!$this->styler->shouldFadeDetails($test_info)) { echo '
'; } else { echo '
'; } echo '
'; echo '
'; if ($test_num > 0) { echo '

', 'Test #', $test_num, ': ', '

'; } else { echo '

', 'Extra Test:', '

'; } echo '
'; if ($this->styler->show_score) { echo '
'; echo 'score: ', $test_score; echo '
'; echo '
'; echo htmlspecialchars($test_info); echo '
'; } else { echo '
'; echo htmlspecialchars($test_info); echo '
'; } echo '
'; if ($test_time >= 0) { echo 'time: ', $test_time, 'ms'; } echo '
'; echo '
'; if ($test_memory >= 0) { echo 'memory: ', $test_memory, 'kb'; } echo '
'; echo '
'; echo '
'; if (!$this->styler->shouldFadeDetails($test_info)) { $accordion_collapse_class = 'panel-collapse collapse'; if ($this->styler->collapse_in) { $accordion_collapse_class .= ' in'; } echo '
'; echo '
'; $this->_print_c($node); echo '
'; echo '
'; } echo '
'; } elseif ($node->nodeName == 'custom-test') { $test_info = $node->getAttribute('info'); $test_time = $node->getAttribute('time'); $test_memory = $node->getAttribute('memory'); echo '
'; $accordion_parent = "{$this->name}_details_accordion"; $accordion_collapse = "{$accordion_parent}_collapse_custom_test"; if (!$this->styler->shouldFadeDetails($test_info)) { echo '
'; } else { echo '
'; } echo '
'; echo '
'; echo '

', 'Custom Test: ', '

'; echo '
'; echo '
'; echo htmlspecialchars($test_info); echo '
'; echo '
'; if ($test_time >= 0) { echo 'time: ', $test_time, 'ms'; } echo '
'; echo '
'; if ($test_memory >= 0) { echo 'memory: ', $test_memory, 'kb'; } echo '
'; echo '
'; echo '
'; if (!$this->styler->shouldFadeDetails($test_info)) { $accordion_collapse_class = 'panel-collapse collapse'; if ($this->styler->collapse_in) { $accordion_collapse_class .= ' in'; } echo '
'; echo '
'; $this->_print_c($node); echo '
'; echo '
'; echo '
'; } } elseif ($node->nodeName == 'in') { echo "

input:

\n";
			$this->_print_c($node);
			echo "\n
"; } elseif ($node->nodeName == 'out') { echo "

output:

\n";
			$this->_print_c($node);
			echo "\n
"; } elseif ($node->nodeName == 'res') { echo "

result:

\n";
			$this->_print_c($node);
			echo "\n
"; } else { echo '<', $node->nodeName; foreach ($node->attributes as $attr) { echo ' ', $attr->name, '="', htmlspecialchars($attr->value), '"'; } echo '>'; $this->_print_c($node); echo 'nodeName, '>'; } } public function __construct($details, $styler, $name) { $this->name = $name; $this->styler = $styler; $this->details = $details; $this->dom = new DOMDocument(); if (!$this->dom->loadXML($this->details)) { throw new Exception("XML syntax error"); } $this->details = ''; } public function printHTML() { $this->subtask_num = null; $this->_print($this->dom->documentElement); } } function echoJudgementDetails($raw_details, $styler, $name) { try { $printer = new JudgementDetailsPrinter($raw_details, $styler, $name); $printer->printHTML(); } catch (Exception $e) { echo 'Failed to show details'; } } class SubmissionDetailsStyler { public $show_score = true; public $show_small_tip = true; public $collapse_in = false; public $fade_all_details = false; public function getTestInfoClass($info) { if ($info == 'Accepted' || $info == 'Extra Test Passed') { return 'panel-uoj-accepted'; } elseif ($info == 'Time Limit Exceeded') { return 'panel-uoj-tle'; } elseif ($info == 'Acceptable Answer') { return 'panel-uoj-acceptable-answer'; } else { return 'panel-uoj-wrong'; } } public function shouldFadeDetails($info) { return $this->fade_all_details || $info == 'Extra Test Passed'; } } class CustomTestSubmissionDetailsStyler { public $show_score = true; public $show_small_tip = false; public $collapse_in = true; public $fade_all_details = false; public function getTestInfoClass($info) { if ($info == 'Success') { return 'panel-uoj-accepted'; } elseif ($info == 'Time Limit Exceeded') { return 'panel-uoj-tle'; } elseif ($info == 'Acceptable Answer') { return 'panel-uoj-acceptable-answer'; } else { return 'panel-uoj-wrong'; } } public function shouldFadeDetails($info) { return $this->fade_all_details; } } class HackDetailsStyler { public $show_score = false; public $show_small_tip = false; public $collapse_in = true; public $fade_all_details = false; public function getTestInfoClass($info) { if ($info == 'Accepted' || $info == 'Extra Test Passed') { return 'panel-uoj-accepted'; } elseif ($info == 'Time Limit Exceeded') { return 'panel-uoj-tle'; } elseif ($info == 'Acceptable Answer') { return 'panel-uoj-acceptable-answer'; } else { return 'panel-uoj-wrong'; } } public function shouldFadeDetails($info) { return $this->fade_all_details; } } function echoSubmissionDetails($submission_details, $name) { echoJudgementDetails($submission_details, new SubmissionDetailsStyler(), $name); } function echoCustomTestSubmissionDetails($submission_details, $name) { echoJudgementDetails($submission_details, new CustomTestSubmissionDetailsStyler(), $name); } function echoHackDetails($hack_details, $name) { echoJudgementDetails($hack_details, new HackDetailsStyler(), $name); } function echoHack($hack, $config, $user) { $problem = queryProblemBrief($hack['problem_id']); echo ''; if (!isset($config['id_hidden'])) echo '#', $hack['id'], ''; if (!isset($config['submission_hidden'])) echo '#', $hack['submission_id'], ''; if (!isset($config['problem_hidden'])) { if ($hack['contest_id']) { echo '', getContestProblemLink($problem, $hack['contest_id'], '!id_and_title'), ''; } else { echo '', getProblemLink($problem, '!id_and_title'), ''; } } if (!isset($config['hacker_hidden'])) echo '', getUserLink($hack['hacker']), ''; if (!isset($config['owner_hidden'])) echo '', getUserLink($hack['owner']), ''; if (!isset($config['result_hidden'])) { if($hack['judge_time'] == null) { echo 'Waiting'; } elseif ($hack['success'] == null) { echo 'Judging'; } elseif ($hack['success']) { echo 'Success!'; } else { echo 'Failed.'; } } else echo 'Hidden'; if (!isset($config['submit_time_hidden'])) echo '', $hack['submit_time'], ''; if (!isset($config['judge_time_hidden'])) echo '', $hack['judge_time'], ''; echo ''; } function echoHackListOnlyOne($hack, $config, $user) { echo '
'; echo ''; echo ''; echo ''; if (!isset($config['id_hidden'])) echo ''; if (!isset($config['submission_id_hidden'])) echo ''; if (!isset($config['problem_hidden'])) echo ''; if (!isset($config['hacker_hidden'])) echo ''; if (!isset($config['owner_hidden'])) echo ''; if (!isset($config['result_hidden'])) echo ''; if (!isset($config['submit_time_hidden'])) echo ''; if (!isset($config['judge_time_hidden'])) echo ''; echo ''; echo ''; echo ''; echoHack($hack, $config, $user); echo ''; echo '
ID'.UOJLocale::get('problems::submission id').''.UOJLocale::get('problems::problem').''.UOJLocale::get('problems::hacker').''.UOJLocale::get('problems::owner').''.UOJLocale::get('problems::result').''.UOJLocale::get('problems::submit time').''.UOJLocale::get('problems::judge time').'
'; echo '
'; } function echoHacksList($cond, $tail, $config, $user) { $header_row = ''; $col_names = array(); $col_names[] = 'id'; $col_names[] = 'success'; $col_names[] = 'judge_time'; if (!isset($config['id_hidden'])) { $header_row .= 'ID'; } if (!isset($config['submission_id_hidden'])) { $header_row .= ''.UOJLocale::get('problems::submission id').''; $col_names[] = 'submission_id'; } if (!isset($config['problem_hidden'])) { $header_row .= ''.UOJLocale::get('problems::problem').''; $col_names[] = 'problem_id'; } if (!isset($config['hacker_hidden'])) { $header_row .= ''.UOJLocale::get('problems::hacker').''; $col_names[] = 'hacker'; } if (!isset($config['owner_hidden'])) { $header_row .= ''.UOJLocale::get('problems::owner').''; $col_names[] = 'owner'; } if (!isset($config['result_hidden'])) { $header_row .= ''.UOJLocale::get('problems::result').''; } if (!isset($config['submit_time_hidden'])) { $header_row .= ''.UOJLocale::get('problems::submit time').''; $col_names[] = 'submit_time'; } if (!isset($config['judge_time_hidden'])) { $header_row .= ''.UOJLocale::get('problems::judge time').''; } $header_row .= ''; if (!isSuperUser($user)) { if ($user != null) { $permission_cond = "is_hidden = false or (is_hidden = true and problem_id in (select problem_id from problems_permissions where username = '{$user['username']}'))"; } else { $permission_cond = "is_hidden = false"; } if ($cond !== '1') { $cond = "($cond) and ($permission_cond)"; } else { $cond = $permission_cond; } } echoLongTable($col_names, 'hacks', $cond, $tail, $header_row, function($hacks) use($config, $user) { echoHack($hacks, $config, $user); }, null); } function echoBlog($blog, $config = array()) { $default_config = array( 'blog' => $blog, 'show_title_only' => false, 'is_preview' => false ); foreach ($default_config as $key => $val) { if (!isset($config[$key])) { $config[$key] = $val; } } uojIncludeView('blog-preview', $config); } function echoBlogTag($tag) { echo '', HTML::escape($tag), ''; } function echoUOJPageHeader($page_title, $extra_config = array()) { global $REQUIRE_LIB; $config = UOJContext::pageConfig(); $config['REQUIRE_LIB'] = $REQUIRE_LIB; $config['PageTitle'] = $page_title; $config = array_merge($config, $extra_config); uojIncludeView('page-header', $config); } function echoUOJPageFooter($config = array()) { uojIncludeView('page-footer', $config); } function echoRanklist($config = array()) { $header_row = ''; $header_row .= ''; $header_row .= '#'; $header_row .= ''.UOJLocale::get('username').''; $header_row .= ''.UOJLocale::get('motto').''; $header_row .= ''.UOJLocale::get('rating').''; $header_row .= ''; $users = array(); $print_row = function($user, $now_cnt) use(&$users) { if (!$users) { $rank = DB::selectCount("select count(*) from user_info where rating > {$user['rating']}") + 1; } else if ($user['rating'] == $users[count($users) - 1]['rating']) { $rank = $users[count($users) - 1]['rank']; } else { $rank = $now_cnt; } $user['rank'] = $rank; echo ''; echo '' . $user['rank'] . ''; echo '' . getUserLink($user['username']) . ''; echo '' . HTML::escape($user['motto']) . ''; echo '' . $user['rating'] . ''; echo ''; $users[] = $user; }; $col_names = array('username', 'rating', 'motto'); $tail = 'order by rating desc, username asc'; if (isset($config['top10'])) { $tail .= ' limit 10'; } $config['get_row_index'] = ''; echoLongTable($col_names, 'user_info', '1', $tail, $header_row, $print_row, $config); }