OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / m / quizk / include / db / quizkDb.php
1 <?php
2 /**
3  * DBクラス
4  *
5  * PHP versions 5
6  *
7  * LICENSE: This source file is licensed under the terms of the GNU General Public License.
8  *
9  * @package    Magic3 Framework
10  * @author     平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
11  * @copyright  Copyright 2006-2009 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id: quizkDb.php 1934 2009-05-28 11:09:45Z fishbone $
14  * @link       http://www.magic3.org
15  */
16 require_once($gEnvManager->getDbPath() . '/baseDb.php');
17
18 class quizkDb extends BaseDb
19 {
20         /**
21          * 設定値を取得
22          *
23          * @param string $key           キーとなる項目値
24          * @return string $value        値
25          */
26         function getConfig($key)
27         {
28                 $retValue = '';
29                 $queryStr = 'SELECT qc_value FROM quiz_config ';
30                 $queryStr .=  'WHERE qc_id  = ?';
31                 $ret = $this->selectRecord($queryStr, array($key), $row);
32                 if ($ret) $retValue = $row['qc_value'];
33                 return $retValue;
34         }
35         /**
36          * 設定値を更新
37          *
38          * @param string $key           キーとなる項目値
39          * @param string $value         値
40          * @return                                      true = 正常、false=異常
41          */
42         function updateConfig($key, $value)
43         {
44                 // トランザクションスタート
45                 $this->startTransaction();
46                 
47                 // データの確認
48                 $queryStr = 'SELECT qc_value FROM quiz_config ';
49                 $queryStr .=  'WHERE qc_id  = ?';
50                 $ret = $this->isRecordExists($queryStr, array($key));
51                 if ($ret){
52                         $queryStr = "UPDATE quiz_config SET qc_value = ? WHERE qc_id = ?";
53                         $this->execStatement($queryStr, array($value, $key));
54                 } else {
55                         $queryStr = "INSERT INTO quiz_config (qc_id, qc_value) VALUES (?, ?)";
56                         $this->execStatement($queryStr, array($key, $value));
57                 }
58                 
59                 // トランザクション終了
60                 $ret = $this->endTransaction();
61                 return $ret;
62         }
63         /**
64          * 定義セットIDリスト取得
65          *
66          * @param function $callback    コールバック関数
67          * @return                                              なし
68          */
69         function getAllSetId($callback)
70         {
71                 $queryStr  = 'SELECT * FROM quiz_set_id ';
72                 $queryStr .=   'WHERE qs_deleted = false ';             // 未削除
73                 $queryStr .=   'ORDER BY qs_index';
74                 $this->selectLoop($queryStr, array(), $callback);
75         }
76         /**
77          * 定義セットID情報取得
78          *
79          * @param string        $id                             定義セットID
80          * @param array         $row                    取得レコード
81          * @return                                                      true=取得、false=取得せず
82          */
83         function getSetId($id, &$row)
84         {
85                 $queryStr  = 'SELECT * FROM quiz_set_id ';
86                 $queryStr .=   'WHERE qs_deleted = false ';             // 未削除
87                 $queryStr .=   'AND qs_id  = ? ';
88                 $ret = $this->selectRecord($queryStr, array($id), $row);
89                 return $ret;
90         }
91         /**
92          * 定義セットIDを更新
93          *
94          * @param string        $id                             定義セットID
95          * @param date          $totalDate              集計日付
96          * @return                                                      true = 正常、false=異常
97          */
98         function updateSetId($id, $totalDate)
99         {
100                 // トランザクションスタート
101                 $this->startTransaction();
102                 
103                 // データの確認
104                 $queryStr = 'SELECT * FROM quiz_set_id ';
105                 $queryStr .=  'WHERE qs_id  = ? ';
106                 $ret = $this->selectRecord($queryStr, array($id), $row);
107                 if ($ret){
108                         $queryStr  = 'UPDATE quiz_set_id ';
109                         $queryStr .=   'SET qs_total_date = ? ';
110                         $queryStr .=   'WHERE qs_id = ?';
111                         $ret = $this->execStatement($queryStr, array($totalDate, $id));                 
112                 } else {
113                         $queryStr = 'INSERT INTO quiz_set_id (';
114                         $queryStr .=  'qs_id, ';
115                         $queryStr .=  'qs_total_date ';
116                         $queryStr .=  ') VALUES (';
117                         $queryStr .=  '?, ?';
118                         $queryStr .=  ')';
119                         $ret = $this->execStatement($queryStr, array($id, $totalDate));
120                 }
121                 // トランザクション終了
122                 $ret = $this->endTransaction();
123                 return $ret;
124         }
125         /**
126          * すべてのクイズ定義を取得
127          *
128          * @param string $setId                 パターンセットID
129          * @param function      $callback       コールバック関数
130          * @return                      なし
131          */
132         function getAllItems($setId, $callback)
133         {
134                 $queryStr  = 'SELECT * FROM quiz_item_def ';
135                 $queryStr .=   'WHERE qd_deleted = false ';             // 未削除
136                 $queryStr .=     'AND qd_set_id = ? ';
137                 $queryStr .=   'ORDER BY qd_id';
138                 $this->selectLoop($queryStr, array($setId), $callback);
139         }
140         /**
141          * クイズ定義を取得
142          *
143          * @param string $setId         パターンセットID
144          * @param string $id            クイズ項目ID
145          * @param array  $row           取得レコード
146          * @return bool                         true=取得、false=取得せず
147          */
148         function getItem($setId, $id, &$row)
149         {
150                 $queryStr  = 'SELECT * FROM quiz_item_def ';
151                 $queryStr .=   'WHERE qd_deleted = false ';             // 未削除
152                 $queryStr .=     'AND qd_set_id = ? ';
153                 $queryStr .=     'AND qd_id = ? ';
154                 $ret = $this->selectRecord($queryStr, array($setId, $id), $row);
155                 return $ret;
156         }
157         /**
158          * すべてのクイズ定義を削除
159          *
160          * @param string $setId                 パターンセットID
161          * @return                                              true=成功、false=失敗
162          */
163         function deleteAllItems($setId)
164         {
165                 $now = date("Y/m/d H:i:s");     // 現在日時
166                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
167                 
168                 // トランザクションスタート
169                 $startTran = false;                     // この関数でトランザクションを開始したかどうか
170                 if (!$this->isInTransaction()){
171                         $this->startTransaction();
172                         $startTran = true;
173                 }
174                 
175                 // レコードを削除
176                 $queryStr  = 'UPDATE quiz_item_def ';
177                 $queryStr .=   'SET qd_deleted = true, ';       // 削除
178                 $queryStr .=     'qd_update_user_id = ?, ';
179                 $queryStr .=     'qd_update_dt = ? ';
180                 $queryStr .=   'WHERE qd_set_id = ? AND qd_deleted = false';
181                 $ret = $this->execStatement($queryStr, array($userId, $now, $setId));
182
183                 // トランザクション確定
184                 if ($startTran) $ret = $this->endTransaction();
185                 return $ret;
186         }
187         /**
188          * クイズ定義項目が存在しているかチェック
189          *
190          * @param string $setId                 定義セットID
191          * @param string $id                    ID
192          * @return bool                                 true=存在する、false=存在しない
193          */
194         function isExistsItem($setId, $id)
195         {
196                 $queryStr = 'SELECT * FROM quiz_item_def ';
197                 $queryStr .=  'WHERE qd_deleted = false ';              // 未削除
198                 $queryStr .=     'AND qd_set_id = ? ';
199                 $queryStr .=     'AND qd_id = ? ';
200                 return $this->isRecordExists($queryStr, array($setId, $id));
201         }
202         /**
203          * 次の問題を取得
204          *
205          * @param string $setId                 定義セットID
206          * @param string $mobileId              携帯ID
207          * @param array         $row            取得レコード
208          * @return bool                                 true=取得、false=取得せず
209          */
210         function getNextQuestion($setId, $mobileId, &$row)
211         {
212                 $queryStr  = 'SELECT * FROM quiz_item_def LEFT JOIN quiz_user_post ON qd_set_id = qp_set_id AND qd_id = qp_question_id AND qd_type = 0 AND qp_mobile_id = ? ';
213                 $queryStr .=   'WHERE qd_deleted = false ';             // 未削除
214                 $queryStr .=     'AND qd_set_id = ? ';
215                 $queryStr .=     'AND qd_type = 0 ';            // 問題
216                 $queryStr .=     'AND qd_visible = true ';              // 表示
217                 $queryStr .=     'AND qp_mobile_id IS NULL ';
218                 $queryStr .=   'ORDER BY qd_index';
219                 $ret = $this->selectRecord($queryStr, array($mobileId, $setId), $row);
220                 return $ret;
221         }
222         /**
223          * 問題数を取得
224          *
225          * @param string $setId                 定義セットID
226          * @param bool $visibleOnly             表示項目のみかどうか
227          * @return int                                  問題数
228          */
229         function getQuestionCount($setId, $visibleOnly = true)
230         {
231                 $queryStr = 'SELECT * FROM quiz_item_def ';
232                 $queryStr .=  'WHERE qd_deleted = false ';              // 未削除
233                 $queryStr .=     'AND qd_set_id = ? ';
234                 $queryStr .=     'AND qd_visible = true ';
235                 return $this->selectRecordCount($queryStr, array($setId));
236         }
237         /**
238          * クイズ回答を取得
239          *
240          * @param string $setId                 定義セットID
241          * @param array $answerIdArray  回答の配列
242          * @param array         $rows           取得レコード
243          * @return bool                                 true=取得、false=取得せず
244          */
245         function getAnswers($setId, $answerIdArray, &$rows)
246         {
247                 if (count($answerIdArray) == 0) return false;
248                 
249                 $answerStr = '';
250                 for ($i = 0; $i < count($answerIdArray); $i++){
251                         $answerStr .= '\'' . addslashes($answerIdArray[$i]) . '\',';
252                 }
253                 $answerStr = trim($answerStr, ',');
254                 
255                 // CASE文作成
256                 $caseStr = 'CASE qd_id ';
257                 for ($i = 0; $i < count($answerIdArray); $i++){
258                         $caseStr .= 'WHEN \'' . addslashes($answerIdArray[$i]) . '\' THEN ' . $i . ' ';
259                 }
260                 $caseStr .= 'END AS no';
261
262                 $queryStr  = 'SELECT *, ' . $caseStr . ' FROM quiz_item_def ';
263                 $queryStr .=   'WHERE qd_visible = true ';
264                 $queryStr .=     'AND qd_deleted = false ';             // 削除されていない
265                 $queryStr .=     'AND qd_type = 1 ';            // 回答
266                 $queryStr .=     'AND qd_id in (' . $answerStr . ') ';
267                 $queryStr .=     'AND qd_set_id = ? ';
268                 $queryStr .=   'ORDER BY no';
269                 $retValue = $this->selectRecords($queryStr, array($setId), $rows);
270                 return $retValue;
271         }
272         /**
273          * クイズ定義項目の更新
274          *
275          * @param string $setId                 定義セットID
276          * @param string $id                    項目ID
277          * @param int $type                             項目タイプ
278          * @param int $index                    項目順
279          * @param string $selAnswer             選択用回答
280          * @param string $answer                回答値
281          * @param string $title                 タイトル
282          * @param string $content               内容
283          * @param bool $visible                 表示制御
284          * @param int $newSerial                新規シリアル番号
285          * @return bool                                 true = 成功、false = 失敗
286          */
287         function updateItem($setId, $id, $type, $index, $selAnswer, $answer, $title, $content, $visible, &$newSerial)
288         {
289                 $now = date("Y/m/d H:i:s");     // 現在日時
290                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
291                 
292                 // トランザクション開始
293                 //$this->startTransaction();
294                 
295                 // 指定のレコードの履歴インデックス取得
296                 $historyIndex = 0;              // 履歴番号
297                 $queryStr  = 'SELECT * FROM quiz_item_def ';
298                 $queryStr .=   'WHERE qd_set_id = ? ';
299                 $queryStr .=     'AND qd_id = ? ';
300                 $queryStr .=  'ORDER BY qd_history_index DESC ';
301                 $ret = $this->selectRecord($queryStr, array($setId, $id), $row);
302                 if ($ret){
303                         $historyIndex = $row['qd_history_index'] + 1;
304                 
305                         // レコードが削除されていない場合は削除
306                         if (!$row['qd_deleted']){
307                                 // 古いレコードを削除
308                                 $queryStr  = 'UPDATE quiz_item_def ';
309                                 $queryStr .=   'SET qd_deleted = true, ';       // 削除
310                                 $queryStr .=     'qd_update_user_id = ?, ';
311                                 $queryStr .=     'qd_update_dt = ? ';
312                                 $queryStr .=   'WHERE qd_serial = ?';
313                                 $ret = $this->execStatement($queryStr, array($userId, $now, $row['qd_serial']));
314                                 if (!$ret) return false;
315                         }
316                 }
317                 
318                 // 新規レコード追加
319                 $queryStr  = 'INSERT INTO quiz_item_def (';
320                 $queryStr .=   'qd_set_id, ';
321                 $queryStr .=   'qd_id, ';
322                 $queryStr .=   'qd_history_index, ';
323                 $queryStr .=   'qd_type, ';
324                 $queryStr .=   'qd_select_answer_id, ';
325                 $queryStr .=   'qd_answer_id, ';
326                 $queryStr .=   'qd_title, ';
327                 $queryStr .=   'qd_content, ';
328                 $queryStr .=   'qd_index, ';
329                 $queryStr .=   'qd_visible, ';
330                 $queryStr .=   'qd_create_user_id, ';
331                 $queryStr .=   'qd_create_dt ';
332                 $queryStr .=   ') VALUES ';
333                 $queryStr .=   '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
334                 $ret =$this->execStatement($queryStr, array($setId, $id, $historyIndex, $type, $selAnswer, $answer, $title, $content, $index, intval($visible), $userId, $now));
335                 if (!$ret) return false;
336                 
337                 // 新規のシリアル番号取得
338                 $queryStr = 'SELECT MAX(qd_serial) AS ns FROM quiz_item_def ';
339                 $ret = $this->selectRecord($queryStr, array(), $row);
340                 if ($ret) $newSerial = $row['ns'];
341                 
342                 // トランザクション確定
343                 //$ret = $this->endTransaction();
344                 return $ret;
345         }
346         /**
347          * 回答データを追加
348          *
349          * @param string        $mobileId               携帯ID
350          * @param string        $setId                  パターンセットID
351          * @param string        $id                             回答ID
352          * @param string        $value                  入力値
353          * @param bool      $result                     回答結果
354          * @param int           $logSerial              アクセスログシリアル番号
355          * @return                                                      true = 正常、false=異常
356          */
357         function addPostData($mobileId, $setId, $id, $value, $result, $logSerial)
358         {
359                 $now = date("Y/m/d H:i:s");     // 現在日時
360                 
361                 // トランザクションスタート
362                 $this->startTransaction();
363                 
364                 // 既に登録されている場合はエラー
365                 $queryStr = 'SELECT * FROM quiz_user_post ';
366                 $queryStr .=  'WHERE qp_mobile_id = ? ';
367                 $queryStr .=     'AND qp_set_id = ? ';
368                 $queryStr .=     'AND qp_question_id = ? ';
369                 $ret = $this->isRecordExists($queryStr, array($mobileId, $setId, $id));
370                 if ($ret){
371                         // トランザクション終了
372                         $ret = $this->endTransaction();
373                         return false;
374                 }
375                 
376                 $queryStr = 'INSERT INTO quiz_user_post (';
377                 $queryStr .=  'qp_mobile_id, ';
378                 $queryStr .=  'qp_set_id, ';
379                 $queryStr .=  'qp_question_id, ';
380                 $queryStr .=  'qp_answer_id, ';
381                 $queryStr .=  'qp_result, ';
382                 $queryStr .=  'qp_access_log_serial, ';
383                 $queryStr .=  'qp_dt ';
384                 $queryStr .=  ') VALUES (';
385                 $queryStr .=  '?, ?, ?, ?, ?, ?, ?';
386                 $queryStr .=  ')';
387                 $ret = $this->execStatement($queryStr, array($mobileId, $setId, $id, $value, intval($result), $logSerial, $now));
388                 
389                 // トランザクション終了
390                 $ret = $this->endTransaction();
391                 return $ret;
392         }
393         /**
394          * 回答状況を取得
395          *
396          * @param string $setId                 定義セットID
397          * @param string $mobileId              携帯ID
398          * @param array         $rows           取得レコード
399          * @return bool                                 true=取得、false=取得せず
400          */
401         function getAnswerResult($setId, $mobileId, &$rows)
402         {
403                 $queryStr  = 'SELECT * FROM quiz_item_def LEFT JOIN quiz_user_post ON qd_set_id = qp_set_id AND qd_id = qp_question_id AND qd_type = 0 AND qp_mobile_id = ? ';
404                 $queryStr .=   'WHERE qd_deleted = false ';             // 未削除
405                 $queryStr .=     'AND qd_set_id = ? ';
406                 $queryStr .=     'AND qd_type = 0 ';            // 問題
407                 $queryStr .=     'AND qd_visible = true ';              // 表示
408                 $queryStr .=     'AND qp_mobile_id IS NOT NULL ';
409                 $queryStr .=   'ORDER BY qd_index';
410                 $retValue = $this->selectRecords($queryStr, array($mobileId, $setId), $rows);
411                 return $retValue;
412         }
413 }
414 ?>