OSDN Git Service

[add]種族・職業・性格・領域のIDと名称を結びつける定義配列を得るメソッド
[hengband/web.git] / db_common.inc
index 0586ee4..c6e2935 100644 (file)
@@ -10,6 +10,21 @@ class ScoreDB
         $this->set_sort_mode(filter_input(INPUT_GET, 'sort'));
     }
 
+    public function get_defines()
+    {
+        $id_define_array = [];
+        $tables = [['race', 'races'], ['class', 'classes'], ['personality', 'personalities'], ['realm', 'realms']];
+        foreach ($tables as $t) {
+            $id_define_array[$t[0]] = [];
+            $stmt = $this->dbh->query("SELECT {$t[0]}_id, {$t[0]}_name FROM {$t[1]} ORDER BY {$t[0]}_id");
+            foreach ($stmt->fetchAll(PDO::FETCH_NUM) as $row) {
+                $id_define_array[$t[0]][intval($row[0])] = $row[1];
+            }
+        }
+
+        return $id_define_array;
+    }
+
     /**
      * スコア表示モードを設定する
      *
@@ -49,25 +64,47 @@ class ScoreDB
     /**
      * スコア検索の絞り込み用WHERE句を取得する
      *
-     * @return string スコア検索絞り込み用のWHERE句
+     * @return array スコア検索絞り込み用のWHERE句('where')とプレースホルダに渡すパラメータ配列('params')の連想配列
      */
-    private function get_where()
+    private function get_search_condition()
     {
         $last_days = filter_input(INPUT_GET, 'last_days', FILTER_VALIDATE_INT);
+        $params = [];
+
         if ($last_days > 0) {
             $wheres[] = "date >= datetime('now', 'localtime', '-{$last_days} days')";
         }
 
-        foreach (['race_id', 'class_id', 'personality_id'] as $id_str) {
-            $id = filter_input(INPUT_GET, $id_str, FILTER_VALIDATE_INT); 
-            if ($id > 0) {
-                $wheres[] = "{$id_str} = {$id}";
+        foreach (['race_id', 'class_id', 'personality_id'] as $key_column) {
+            $val = filter_input(INPUT_GET, $key_column, FILTER_VALIDATE_INT); 
+            if ($val > 0) {
+                $wheres[] = "{$key_column} = :{$key_column}";
+                $params[":{$key_column}"] = $val;
             }
         }
 
-        $where = isset($wheres) ? 'WHERE '.implode(' AND ', $wheres) : '';
+        foreach (['name'] as $key_column) {
+            $val = filter_input(INPUT_GET, $key_column);
+            if ($val !== NULL && strlen($val) > 0) {
+                $wheres[] = "{$key_column} = :{$key_column}";
+                $params[":{$key_column}"] = $val;
+            }
+        }
 
-        return $where;
+        foreach (['killer'] as $key_column) {
+            $val = filter_input(INPUT_GET, $key_column);
+            if ($val !== NULL && strlen($val) > 0) {
+                $wheres[] = "({$key_column} LIKE :{$key_column} OR {$key_column} = :{$key_column}1 OR {$key_column} = :{$key_column}2)";
+                $params[":{$key_column}"] = "%".$val."%";
+                $params[":{$key_column}1"] = "麻痺状態で".$val;
+                $params[":{$key_column}2"] = "彫像状態で".$val;
+            }
+        }
+
+        $result['where'] = isset($wheres) ? 'WHERE '.implode(' AND ', $wheres) : '';
+        $result['params'] = $params;
+
+        return $result;
     }
 
 
@@ -102,15 +139,37 @@ class ScoreDB
      */
     private function get_search_query($offset, $limit, $where, $order_by)
     {
-        switch ($this->sort_mode) {
-        case "score":
-            $query = "SELECT *, group_concat(realm_name) AS realms_name from (select * from scores ${where} {$order_by} LIMIT ${offset}, {$limit}) NATURAL JOIN races NATURAL JOIN classes NATURAL JOIN personalities NATURAL LEFT JOIN score_realms NATURAL LEFT JOIN realms GROUP BY score_id {$order_by}";
-            break;
-        case "newcome":
-            $query = "SELECT *, group_concat(realm_name) AS realms_name from (select * from scores ${where} {$order_by} LIMIT ${offset}, {$limit}) NATURAL JOIN races NATURAL JOIN classes NATURAL JOIN personalities NATURAL LEFT JOIN score_realms NATURAL LEFT JOIN realms GROUP BY score_id {$order_by}";
-            break;
-        }
-
+        $query = <<<EOM
+SELECT
+  *,
+  group_concat(realm_name) AS realms_name,
+  CASE
+    WHEN killer = 'ripe' THEN '勝利の後引退'
+    WHEN killer = 'Seppuku' THEN '勝利の後切腹'
+    ELSE killer || 'に殺された'
+  END AS death_reason
+FROM
+ (SELECT
+    *
+  FROM
+    scores
+  {$where}
+  {$order_by}
+  LIMIT {$offset}, {$limit}) AS s
+NATURAL INNER JOIN
+  races
+NATURAL INNER JOIN
+  classes
+NATURAL INNER JOIN
+  personalities
+NATURAL LEFT JOIN
+  score_realms
+NATURAL LEFT JOIN
+  realms
+GROUP BY
+  score_id
+{$order_by}
+EOM;
         return $query;
     }
 
@@ -121,9 +180,10 @@ class ScoreDB
      * @param string $where スコア検索に用いるWHERE句
      * @return integer スコア総件数
      */
-    private function get_query_data_count($where)
+    private function get_query_data_count($where, $params)
     {
-        $stmt = $this->dbh->query("SELECT count(*) AS data_count from scores {$where}");
+        $stmt = $this->dbh->prepare("SELECT count(*) AS data_count from scores {$where}");
+        $stmt->execute($params);
         $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
 
         return intval($res[0]['data_count']);
@@ -140,16 +200,17 @@ class ScoreDB
      */
     public function search_score($start_num, $count)
     {
-        $where = $this->get_where();
+        $cond = $this->get_search_condition();
         $order_by = $this->get_order_by();
-        $query_sql = $this->get_search_query(intval($start_num / $count) * $count, $count, $where, $order_by);
+        $query_sql = $this->get_search_query(intval($start_num / $count) * $count, $count, $cond['where'], $order_by);
 
         $search_start_time = microtime(true);
         $this->dbh->beginTransaction();
 
-        $score_stmt = $this->dbh->query($query_sql);
+        $score_stmt = $this->dbh->prepare($query_sql);
+        $score_stmt->execute($cond['params']);
         $result['scores'] = $score_stmt->fetchAll(PDO::FETCH_ASSOC);
-        $result['total_data_count'] = $this->get_query_data_count($where);
+        $result['total_data_count'] = $this->get_query_data_count($cond['where'], $cond['params']);
 
         $this->dbh->commit();
         $result['elapsed_time'] = microtime(true) - $search_start_time;