7 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
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
16 require_once($gEnvManager->getDbPath() . '/baseDb.php');
18 class quizkDb extends BaseDb
23 * @param string $key キーとなる項目値
24 * @return string $value 値
26 function getConfig($key)
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'];
38 * @param string $key キーとなる項目値
39 * @param string $value 値
40 * @return true = 正常、false=異常
42 function updateConfig($key, $value)
45 $this->startTransaction();
48 $queryStr = 'SELECT qc_value FROM quiz_config ';
49 $queryStr .= 'WHERE qc_id = ?';
50 $ret = $this->isRecordExists($queryStr, array($key));
52 $queryStr = "UPDATE quiz_config SET qc_value = ? WHERE qc_id = ?";
53 $this->execStatement($queryStr, array($value, $key));
55 $queryStr = "INSERT INTO quiz_config (qc_id, qc_value) VALUES (?, ?)";
56 $this->execStatement($queryStr, array($key, $value));
60 $ret = $this->endTransaction();
66 * @param function $callback コールバック関数
69 function getAllSetId($callback)
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);
79 * @param string $id 定義セットID
80 * @param array $row 取得レコード
81 * @return true=取得、false=取得せず
83 function getSetId($id, &$row)
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);
94 * @param string $id 定義セットID
95 * @param date $totalDate 集計日付
96 * @return true = 正常、false=異常
98 function updateSetId($id, $totalDate)
101 $this->startTransaction();
104 $queryStr = 'SELECT * FROM quiz_set_id ';
105 $queryStr .= 'WHERE qs_id = ? ';
106 $ret = $this->selectRecord($queryStr, array($id), $row);
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));
113 $queryStr = 'INSERT INTO quiz_set_id (';
114 $queryStr .= 'qs_id, ';
115 $queryStr .= 'qs_total_date ';
116 $queryStr .= ') VALUES (';
119 $ret = $this->execStatement($queryStr, array($id, $totalDate));
122 $ret = $this->endTransaction();
128 * @param string $setId パターンセットID
129 * @param function $callback コールバック関数
132 function getAllItems($setId, $callback)
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);
143 * @param string $setId パターンセットID
144 * @param string $id クイズ項目ID
145 * @param array $row 取得レコード
146 * @return bool true=取得、false=取得せず
148 function getItem($setId, $id, &$row)
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);
160 * @param string $setId パターンセットID
161 * @return true=成功、false=失敗
163 function deleteAllItems($setId)
165 $now = date("Y/m/d H:i:s"); // 現在日時
166 $userId = $this->gEnv->getCurrentUserId(); // 現在のユーザ
169 $startTran = false; // この関数でトランザクションを開始したかどうか
170 if (!$this->isInTransaction()){
171 $this->startTransaction();
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));
184 if ($startTran) $ret = $this->endTransaction();
188 * クイズ定義項目が存在しているかチェック
190 * @param string $setId 定義セットID
191 * @param string $id ID
192 * @return bool true=存在する、false=存在しない
194 function isExistsItem($setId, $id)
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));
205 * @param string $setId 定義セットID
206 * @param string $mobileId 携帯ID
207 * @param array $row 取得レコード
208 * @return bool true=取得、false=取得せず
210 function getNextQuestion($setId, $mobileId, &$row)
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);
225 * @param string $setId 定義セットID
226 * @param bool $visibleOnly 表示項目のみかどうか
229 function getQuestionCount($setId, $visibleOnly = true)
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));
240 * @param string $setId 定義セットID
241 * @param array $answerIdArray 回答の配列
242 * @param array $rows 取得レコード
243 * @return bool true=取得、false=取得せず
245 function getAnswers($setId, $answerIdArray, &$rows)
247 if (count($answerIdArray) == 0) return false;
250 for ($i = 0; $i < count($answerIdArray); $i++){
251 $answerStr .= '\'' . addslashes($answerIdArray[$i]) . '\',';
253 $answerStr = trim($answerStr, ',');
256 $caseStr = 'CASE qd_id ';
257 for ($i = 0; $i < count($answerIdArray); $i++){
258 $caseStr .= 'WHEN \'' . addslashes($answerIdArray[$i]) . '\' THEN ' . $i . ' ';
260 $caseStr .= 'END AS no';
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);
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 = 失敗
287 function updateItem($setId, $id, $type, $index, $selAnswer, $answer, $title, $content, $visible, &$newSerial)
289 $now = date("Y/m/d H:i:s"); // 現在日時
290 $userId = $this->gEnv->getCurrentUserId(); // 現在のユーザ
293 //$this->startTransaction();
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);
303 $historyIndex = $row['qd_history_index'] + 1;
305 // レコードが削除されていない場合は削除
306 if (!$row['qd_deleted']){
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;
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;
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'];
343 //$ret = $this->endTransaction();
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=異常
357 function addPostData($mobileId, $setId, $id, $value, $result, $logSerial)
359 $now = date("Y/m/d H:i:s"); // 現在日時
362 $this->startTransaction();
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));
372 $ret = $this->endTransaction();
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 .= '?, ?, ?, ?, ?, ?, ?';
387 $ret = $this->execStatement($queryStr, array($mobileId, $setId, $id, $value, intval($result), $logSerial, $now));
390 $ret = $this->endTransaction();
396 * @param string $setId 定義セットID
397 * @param string $mobileId 携帯ID
398 * @param array $rows 取得レコード
399 * @return bool true=取得、false=取得せず
401 function getAnswerResult($setId, $mobileId, &$rows)
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);