OSDN Git Service

[fix]REQUEST_URIをSCRIPT_NAMEに変更した時にQUERY_STRINGが失われていた問題を修正
[hengband/web.git] / score_ranking.php
1 <?php
2 //ini_set('display_errors', 'On');
3
4 ini_set('log_errors', 'On');
5 ini_set('error_log', 'errors/'.pathinfo(__FILE__, PATHINFO_FILENAME).'.log');
6
7 require_once "db_common.inc";
8 require_once "dump_file.inc";
9
10 ini_set('zlib.output_compression', 'On');
11
12
13 /**
14  * ページ情報を計算する
15  *
16  * @param integer $total_data_count 全データ件数
17  * @param integer $start_num GETパラメータで渡された開始データ番号
18  * @param integer $data_count_per_page 1ページあたりのデータ件数
19  *
20  * @return array 計算したページ情報を保持する連想配列
21  */
22 function calc_page_info($total_data_count, $start_num, $data_count_per_page)
23 {
24     $current_page = intval($start_num / $data_count_per_page);
25     $last_page = intval(($total_data_count - 1) / $data_count_per_page);
26     $navi_page_range_start = ($current_page - 5) > 0 ? $current_page - 5: 0;
27     $navi_page_range_count = max(0, min(9, $last_page - $navi_page_range_start));
28     $navi_page_list = range($navi_page_range_start, $navi_page_range_start + $navi_page_range_count);
29
30     $pageinfo['current'] = $current_page;
31     $pageinfo['last'] = $last_page;
32     $pageinfo['navi_list'] = $navi_page_list;
33
34     $pageinfo['total_data_count'] = $total_data_count;
35     $pageinfo['data_count_per_page'] = $data_count_per_page;
36
37     return $pageinfo;
38 }
39
40
41 /**
42  * ページナビゲーションテーブルを表示する
43  *
44  * @param array $pageinfo calc_page_info()関数で取得したページ情報を保持する連想配列
45  */
46 function print_navi_page_table($pageinfo)
47 {
48     if (count($pageinfo['navi_list']) <= 1) return;
49
50     $href_base = filter_input(INPUT_SERVER, 'SCRIPT_NAME')."?"
51                .preg_replace('/(&?start=\w+)/', '', filter_input(INPUT_SERVER, 'QUERY_STRING'));
52     if (strpos($href_base, "?") === FALSE) {
53         $href_base .= "?";
54     }
55
56     echo "<table align='center'>\n"
57         ."<tr>";
58
59     if ($pageinfo['current'] > 0) {
60         $href = $href_base . "&start=". ($pageinfo['current'] - 1) * $pageinfo['data_count_per_page'];
61         echo "<td><a href={$href}>&lt; 前へ</a></td>";
62     }
63
64     foreach ($pageinfo['navi_list'] as $page) {
65         $page_num = $page + 1;
66         $href = $href_base . "&start=". $page * $pageinfo['data_count_per_page'];
67         if ($page === $pageinfo['current']) {
68             echo "<td>$page_num</td>";
69         } else {
70             echo "<td><a href={$href}>$page_num</a></td>";
71         }
72     }
73
74     if ($pageinfo['current'] < $pageinfo['last']) {
75         $href = $href_base . "&start=". ($pageinfo['current'] + 1) * $pageinfo['data_count_per_page'];
76         echo "<td><a href={$href}>次へ &gt;</a></td>";
77     }
78
79     echo "</tr>\n"
80         ."</table>\n";
81 }
82
83
84 /**
85  * スコアランキングテーブルを表示する
86  *
87  * @param array $scores スコア
88  * @param integer $rank_start 順位の開始番号(0オリジン)
89  */
90 function print_score_table($scores, $rank_start)
91 {
92     echo <<<EOM
93 <table align='center' border=1>
94 <tr>
95 <th>順位</th>
96 <th>スコア</th>
97 <th>日付</th>
98 <th>名前</th>
99 <th>種族</th>
100 <th>職業</th>
101 <th>性別</th>
102 <th>死因</th>
103 </tr>
104
105 EOM;
106
107     foreach($scores as $idx => $score) {
108         $rank = $rank_start + $idx + 1;
109         $date = substr($score['date'], 0, 10); // 日時から日付部分を取り出す
110         $sex_str = $score['sex'] ? "男" : "女";
111         $depth = !$score['winner'] ? $score['depth']."階, " : "";
112         $realms = isset($score['realms_name']) ? "(".$score['realms_name'].")" : "";
113         $dumpfile = new DumpFile($score['score_id']);
114
115         echo "<tr>\n";
116         if ($dumpfile->exists('dumps', 'txt')) {
117             $name = "<a href=\"show_dump.php?score_id={$score['score_id']}\">{$score['personality_name']}{$score['name']}</a>\n";
118         } else {
119             $name = "{$score['personality_name']}{$score['name']}";
120         }
121         echo <<<EOM
122 <td>$rank</td>
123 <td align="right">{$score['score']}</td>
124 <td><nobr>$date</nobr></td>
125 <td>$name</td>
126 <td>{$score['race_name']}</td>
127 <td>{$score['class_name']}$realms</td>
128 <td>$sex_str</td>
129
130 EOM;
131         if ($dumpfile->exists('screens', 'html')) {
132             echo "<td><a href=\"show_screen.php?score_id={$score['score_id']}\">{$score['death_reason']}</a>";
133         } else {
134             echo "<td>{$score['death_reason']}";
135         }
136         echo "<br>({$depth}{$score['version']})</td>\n";
137         echo "</tr>\n";
138     }
139     echo "</table>\n";
140 }
141
142 $db = new ScoreDB();
143
144 $start_num = filter_input(INPUT_GET, 'start', FILTER_VALIDATE_INT) ?: 0;
145 $search_result = $db->search_score($start_num, 50);
146
147 $pageinfo = calc_page_info($search_result['total_data_count'], $start_num, 50);
148 ?>
149
150 <!DOCTYPE html>
151
152 <html>
153 <head>
154 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
155 <meta name="ROBOTS" content="NOINDEX, NOFOLLOW" />
156 <title>変愚蛮怒 スコア ランキング</title>
157 <link rel="alternate" title="変愚蛮怒 新着スコア" href="feed/newcome-atom.xml" type="application/atom+xml" />
158 </head>
159
160 <body>
161 <h1>変愚蛮怒 歴代スコア (<?php echo $db->get_sort_mode_name(); ?>)</h1>
162 <!--3日以内のスコアは<font color=red>赤</font>、10日以内のスコアは<font color=blue>青</font>で表示されます。<br>-->
163 <!--10日以内のスコアは<strong>強調表示</strong>されます。-->
164 <div align="right">
165 <a href ="feed/newcome-atom.xml"><img src="feed/feed-icon-14x14.png">新着スコア購読</a>
166 <!--<small>…スコア受信時に自動生成します。URLをRSSリーダー等に登録すると新着スコアをチェックできます。</small>-->
167 </div>
168
169 <hr>
170 <small>
171 <?php
172 echo sprintf("件数 %d 件 (%.2f 秒)", $search_result['total_data_count'], $search_result['elapsed_time']);
173 ?>
174 </small>
175
176 <?php
177 print_navi_page_table($pageinfo);
178 print_score_table($search_result['scores'], $pageinfo['current'] * $pageinfo['data_count_per_page']);
179 print_navi_page_table($pageinfo);
180 ?>