7 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
10 * @author 株式会社 毎日メディアサービス
11 * @copyright Copyright 2010-2013 株式会社 毎日メディアサービス.
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
13 * @version SVN: $Id: custom_searchDb.php 5969 2013-04-29 13:16:04Z fishbone $
14 * @link http://www.m-media.co.jp
16 require_once($gEnvManager->getDbPath() . '/baseDb.php');
18 class custom_searchDb extends BaseDb
23 * @param string $langId 言語ID
24 * @param array $rows 取得レコード
25 * @return true=取得、false=取得せず
27 function getAllCategory($langId, &$rows)
30 $queryStr = 'SELECT * FROM user_content_category ';
31 $queryStr .= 'WHERE ua_deleted = false '; // 削除されていない
32 $queryStr .= 'AND ua_item_id = ? ';
33 $queryStr .= 'AND ua_language_id = ? ';
34 $queryStr .= 'ORDER BY ua_index';
35 $retValue = $this->selectRecords($queryStr, array(''/*カテゴリ情報のみ*/, $langId), $rows);
41 * @param string $langId 言語ID
42 * @param array $categoryArray 取得するカテゴリID
43 * @param array $rows 取得レコード
44 * @return true=取得、false=取得せず
46 function getAllCategoryForMenu($langId, $categoryArray, &$rows)
48 if (count($categoryArray) <= 0) return false;
52 $caseStr = 'CASE ua_id ';
53 for ($i = 0; $i < count($categoryArray); $i++){
54 $id = '\'' . addslashes($categoryArray[$i]) . '\'';
55 $caseStr .= 'WHEN ' . $id . ' THEN ' . $i . ' ';
56 $categoryId .= $id . ',';
58 $caseStr .= 'END AS no,';
59 $categoryId = rtrim($categoryId, ',');
61 $caseStr .= 'CASE ua_item_id ';
62 $caseStr .= 'WHEN \'\' THEN 1 ';
63 $caseStr .= 'ELSE 0 ';
64 $caseStr .= 'END AS type ';
66 $queryStr = 'SELECT *, ' . $caseStr . ' FROM user_content_category ';
67 $queryStr .= 'WHERE ua_deleted = false '; // 削除されていない
68 $queryStr .= 'AND ua_language_id = ? ';
69 $queryStr .= 'AND ua_id in (' . $categoryId . ') ';
70 $queryStr .= 'ORDER BY no, type, ua_index';
71 $retValue = $this->selectRecords($queryStr, array($langId), $rows);
75 * コンテンツの項目数またはコンテンツを取得(表示用)
77 * @param int $limit 取得する項目数(0=項目数取得、0以外=レコードを取得)
78 * @param int $page 取得するページ(1~)
79 * @param array $keywords 検索キーワード
80 * @param array $categoryInfo 絞り込み用カテゴリ
81 * @param string $langId 言語
82 * @param bool $isAll すべてのデータを取得するか、ユーザ制限のないデータを取得するかを指定
83 * @param bool $isTargetContent 汎用コンテンツを検索対象とするかどうか
84 * @param bool $isTargetUser ユーザ作成コンテンツを検索対象とするかどうか
85 * @param bool $isTargetBlog ブログ記事を検索対象とするかどうか
86 * @param bool $isTargetProduct 商品情報を検索対象とするかどうか
87 * @param bool $isTargetEvent イベント情報を検索対象とするかどうか
88 * @param bool $isTargetBbs BBSを検索対象とするかどうか
89 * @param bool $isTargetPhoto フォトギャラリーを検索対象とするかどうか
90 * @param function $callback コールバック関数
91 * @return int,bool $limitが0のときintで項目数、$limitが0以外のときはbool(true=1行以上レコード取得、false=レコードなし)
93 function searchContentsByKeyword($limit, $page, $keywords, $categoryInfo, $langId, $isAll, $isTargetContent, $isTargetUser, $isTargetBlog,
94 $isTargetProduct, $isTargetEvent, $isTargetBbs, $isTargetPhoto, $callback = NULL)
96 $offset = $limit * ($page -1);
97 if ($offset < 0) $offset = 0;
98 $initDt = $this->gEnv->getInitValueOfTimestamp(); // 日時初期化値
99 $now = date("Y/m/d H:i:s"); // 現在日時
100 $params = array(); // パラメータ初期化
103 // ##### 汎用コンテンツの検索条件 #####
104 if (!empty($isTargetContent)){
106 $queryStr .= 'SELECT DISTINCT \'content\' AS type, cn_id AS id, cn_name AS name, cn_create_dt AS dt, 0 AS group_id ';
107 $queryStr .= 'FROM content ';
108 $queryStr .= 'WHERE cn_visible = true ';
109 $queryStr .= 'AND cn_deleted = false '; // 削除されていない
110 $queryStr .= 'AND cn_type = ? ';$params[] = $contentType;
111 $queryStr .= 'AND cn_language_id = ? ';$params[] = $langId;
112 if (!$all) $queryStr .= 'AND cn_user_limited = false '; // ユーザ制限のないデータ
115 if (!empty($keywords)){
116 for ($i = 0; $i < count($keywords); $i++){
117 $keyword = addslashes($keywords[$i]);// 「'"\」文字をエスケープ
118 $queryStr .= 'AND (cn_name LIKE \'%' . $keyword . '%\' ';
119 $queryStr .= 'OR cn_html LIKE \'%' . $keyword . '%\' ';
120 $queryStr .= 'OR cn_description LIKE \'%' . $keyword . '%\' ';
121 $queryStr .= 'OR cn_option_fields LIKE \'%' . $keyword . '%\') '; // ユーザ定義フィールド
126 $queryStr .= 'AND (cn_active_start_dt = ? OR (cn_active_start_dt != ? AND cn_active_start_dt <= ?)) ';
127 $queryStr .= 'AND (cn_active_end_dt = ? OR (cn_active_end_dt != ? AND cn_active_end_dt > ?)) ';
135 // ##### ユーザ作成コンテンツの検索条件 #####
136 if (!empty($isTargetUser)){
137 // カテゴリ条件から検索対象のルームを取得
138 $roomArray = array();
139 if (!empty($categoryInfo)){
140 $allParams = array();
142 $keys = array_keys($categoryInfo);
143 $categoryCount = count($keys);
144 for ($i = 0; $i < $categoryCount; $i++){
145 $qStr = 'SELECT um_room_id FROM user_content_room_category ';
149 $item = $categoryInfo[$key];
150 if (is_array($item)){ // 複数項目の場合
151 $qStr .= 'WHERE um_category_id = ? AND (';
153 $itemCount = count($item);
154 for ($j = 0; $j < $itemCount; $j++){
155 $qStr .= 'um_category_item_id = ?';
156 if ($j < $itemCount -1) $qStr .= ' OR ';
161 $qStr .= 'WHERE um_category_id = ? AND um_category_item_id = ? ';
166 $allParams = array_merge($pms, $allParams);
168 $allQueryStr = $qStr;
170 $allQueryStr = $qStr . ' AND um_room_id IN (' . $allQueryStr . ')';
173 $retValue = $this->selectRecords($allQueryStr, $allParams, $rows);
175 $rowCount = count($rows);
176 for ($i = 0; $i < $rowCount; $i++){
177 $roomArray[] = $rows[$i]['um_room_id'];
182 if (!empty($queryStr)) $queryStr .= ' UNION ';
183 $queryStr .= 'SELECT DISTINCT \'user\' AS type, uc_room_id AS id, ur_name AS name, ur_content_update_dt AS dt, ur_group_id AS group_id ';
184 $queryStr .= 'FROM user_content LEFT JOIN user_content_room ON uc_room_id = ur_id AND ur_deleted = false ';
185 $queryStr .= 'WHERE uc_language_id = ? '; $params[] = $langId;
186 $queryStr .= 'AND uc_deleted = false '; // 削除されていない
187 $queryStr .= 'AND uc_visible = true '; // 公開中
188 $queryStr .= 'AND ur_visible = true '; // ルーム公開中
191 if (!empty($categoryInfo)){ // カテゴリ制限のとき
192 if (count($roomArray) == 0){
193 $idStr = '\'/dummy/\''; // ダミーデータを設定
196 for ($i = 0; $i < count($roomArray); $i++){
197 $idStr .= '\'' . addslashes($roomArray[$i]) . '\',';
199 $idStr = rtrim($idStr, ',');
201 $queryStr .= 'AND uc_room_id in (' . $idStr . ') ';
205 if (!empty($keywords)){
206 for ($i = 0; $i < count($keywords); $i++){
207 $keyword = addslashes($keywords[$i]);// 「'"\」文字をエスケープ
208 $queryStr .= 'AND (uc_data LIKE \'%' . $keyword . '%\' '; // コンテンツ実データ
209 $queryStr .= 'OR uc_room_id LIKE \'%' . $keyword . '%\' '; // ルームID
210 $queryStr .= 'OR ur_name LIKE \'%' . $keyword . '%\') '; // ルーム名
215 $queryStr .= 'AND (uc_active_start_dt = ? OR (uc_active_start_dt != ? AND uc_active_start_dt <= ?)) ';
216 $queryStr .= 'AND (uc_active_end_dt = ? OR (uc_active_end_dt != ? AND uc_active_end_dt > ?)) ';
224 // ##### ブログの検索条件 #####
225 if (!empty($isTargetBlog)){
226 if (!empty($queryStr)) $queryStr .= ' UNION ';
227 $queryStr .= 'SELECT DISTINCT \'blog\' AS type, be_id AS id, be_name AS name, be_regist_dt AS dt, 0 AS group_id ';
228 $queryStr .= 'FROM blog_entry ';
229 $queryStr .= 'WHERE be_language_id = ? '; $params[] = $langId;
230 $queryStr .= 'AND be_deleted = false '; // 削除されていない
231 $queryStr .= 'AND be_regist_dt <= ? '; $params[] = $now; // 投稿日時が現在日時よりも過去のものを取得
234 if (!empty($keywords)){
235 for ($i = 0; $i < count($keywords); $i++){
236 $keyword = addslashes($keywords[$i]);// 「'"\」文字をエスケープ
237 $queryStr .= 'AND (be_name LIKE \'%' . $keyword . '%\' ';
238 $queryStr .= 'OR be_html LIKE \'%' . $keyword . '%\' ';
239 $queryStr .= 'OR be_html_ext LIKE \'%' . $keyword . '%\' ';
240 $queryStr .= 'OR be_description LIKE \'%' . $keyword . '%\') ';
245 $queryStr .= 'AND (be_active_start_dt = ? OR (be_active_start_dt != ? AND be_active_start_dt <= ?)) ';
246 $queryStr .= 'AND (be_active_end_dt = ? OR (be_active_end_dt != ? AND be_active_end_dt > ?)) ';
254 // ##### 商品情報の検索条件 #####
255 if (!empty($isTargetProduct)){
256 if (!empty($queryStr)) $queryStr .= ' UNION ';
258 $queryStr .= 'SELECT DISTINCT \'product\' AS type, pt_id AS id, pt_name AS name, pt_create_dt AS dt, 0 AS group_id ';
259 $queryStr .= 'FROM product ';
260 $queryStr .= 'WHERE pt_language_id = ? '; $params[] = $langId;
261 $queryStr .= 'AND pt_deleted = false '; // 削除されていない
262 $queryStr .= 'AND pt_visible = true '; // 表示可能な商品
265 if (!empty($keywords)){
266 for ($i = 0; $i < count($keywords); $i++){
267 $keyword = addslashes($keywords[$i]);// 「'"\」文字をエスケープ
268 $queryStr .= 'AND (pt_name LIKE \'%' . $keyword . '%\' ';
269 $queryStr .= 'OR pt_code LIKE \'%' . $keyword . '%\' ';
270 $queryStr .= 'OR pt_description LIKE \'%' . $keyword . '%\' ';
271 $queryStr .= 'OR pt_description_short LIKE \'%' . $keyword . '%\') ';
275 // ##### イベント情報の検索条件 #####
276 if (!empty($isTargetEvent)){
277 if (!empty($queryStr)) $queryStr .= ' UNION ';
278 $queryStr .= 'SELECT DISTINCT \'event\' AS type, ee_id AS id, ee_name AS name, ee_start_dt AS dt, 0 AS group_id ';
279 $queryStr .= 'FROM event_entry ';
280 $queryStr .= 'WHERE ee_language_id = ? '; $params[] = $langId;
281 $queryStr .= 'AND ee_deleted = false '; // 削除されていない
283 // 名前、予定、結果、概要、管理者用備考、場所、連絡先を検索
284 if (!empty($keywords)){
285 for ($i = 0; $i < count($keywords); $i++){
286 $keyword = addslashes($keywords[$i]);// 「'"\」文字をエスケープ
287 $queryStr .= 'AND (ee_name LIKE \'%' . $keyword . '%\' ';
288 $queryStr .= 'OR ee_html LIKE \'%' . $keyword . '%\' ';
289 $queryStr .= 'OR ee_html_ext LIKE \'%' . $keyword . '%\' ';
290 $queryStr .= 'OR ee_summary LIKE \'%' . $keyword . '%\' ';
291 $queryStr .= 'OR ee_admin_note LIKE \'%' . $keyword . '%\' ';
292 $queryStr .= 'OR ee_place LIKE \'%' . $keyword . '%\' ';
293 $queryStr .= 'OR ee_contact LIKE \'%' . $keyword . '%\') ';
297 // ##### BBSの検索条件 #####
298 if (!empty($isTargetBbs)){
299 if (!empty($queryStr)) $queryStr .= ' UNION ';
300 $queryStr .= 'SELECT DISTINCT \'bbs\' AS type, th_id AS id, th_subject AS name, th_dt AS dt, 0 AS group_id ';
301 $queryStr .= 'FROM bbs_2ch_thread_message LEFT JOIN bbs_2ch_thread ON te_thread_id = th_id AND th_deleted = false ';
302 $queryStr .= 'WHERE te_deleted = false '; // 削除されていない
305 if (!empty($keywords)){
306 for ($i = 0; $i < count($keywords); $i++){
307 $keyword = addslashes($keywords[$i]);// 「'"\」文字をエスケープ
308 $queryStr .= 'AND (te_user_name LIKE \'%' . $keyword . '%\' ';
309 $queryStr .= 'OR te_email LIKE \'%' . $keyword . '%\' ';
310 $queryStr .= 'OR te_message LIKE \'%' . $keyword . '%\') ';
314 // ##### フォト情報の検索条件 #####
315 if (!empty($isTargetPhoto)){
316 if (!empty($queryStr)) $queryStr .= ' UNION ';
317 $queryStr .= 'SELECT DISTINCT \'photo\' AS type, ht_public_id AS id, ht_name AS name, ht_regist_dt AS dt, 0 AS group_id ';
318 $queryStr .= 'FROM photo LEFT JOIN _login_user ON ht_owner_id = lu_id AND lu_deleted = false ';
319 $queryStr .= 'WHERE ht_deleted = false '; // 未削除
320 $queryStr .= 'AND ht_visible = true '; // 公開中
322 if (!empty($keywords)){
323 for ($i = 0; $i < count($keywords); $i++){
324 $keyword = addslashes($keywords[$i]); // 「'"\」文字をエスケープ
325 $queryStr .= 'AND (ht_public_id LIKE \'%' . $keyword . '%\' '; // 公開用画像ID
326 $queryStr .= 'OR ht_name LIKE \'%' . $keyword . '%\' '; // 画像タイトル
327 $queryStr .= 'OR ht_camera LIKE \'%' . $keyword . '%\' '; // カメラ
328 $queryStr .= 'OR ht_location LIKE \'%' . $keyword . '%\' '; // 撮影場所
329 $queryStr .= 'OR ht_description LIKE \'%' . $keyword . '%\' '; // 説明
330 $queryStr .= 'OR ht_summary LIKE \'%' . $keyword . '%\' '; // 概要
331 $queryStr .= 'OR ht_keyword LIKE \'%' . $keyword . '%\' '; // キーワード
332 $queryStr .= 'OR lu_name LIKE \'%' . $keyword . '%\') '; // 撮影者
336 if (empty($limit)){ // 項目数取得の場合
337 $ret = $this->selectRecordCount($queryStr, $params);
339 // コンテンツ更新の最新のデータから取得
340 $queryStr .= 'ORDER BY dt desc limit ' . $limit . ' offset ' . $offset;
341 $ret = $this->selectLoop($queryStr, $params, $callback);
348 * @param string $lang 言語
349 * @param int $groupId グループID
350 * @param array $row レコード
351 * @return bool 取得 = true, 取得なし= false
353 function getDefaultTab($lang, $groupId, &$row)
355 $queryStr = 'SELECT * FROM user_content_tab ';
356 $queryStr .= 'WHERE ub_deleted = false '; // 削除されていない
357 $queryStr .= 'AND ub_visible = true '; // 表示中
358 $queryStr .= 'AND ub_language_id = ? ';
359 $queryStr .= 'AND ub_group_id = ? ';
360 $queryStr .= 'ORDER BY ub_index';
361 $ret = $this->selectRecord($queryStr, array($lang, $groupId), $row);
367 * @param string $roomId ルームID
368 * @param string $langId 言語ID
369 * @param array $rows 取得レコード
370 * @return bool 取得 = true, 取得なし= false
372 function getAllContentsByRoomId($roomId, $langId, &$rows)
374 if (empty($roomId) || empty($langId)) return false;
376 $queryStr = 'SELECT * FROM user_content LEFT JOIN user_content_item ON uc_id = ui_id AND ui_deleted = false ';
377 $queryStr .= 'WHERE uc_deleted = false '; // 削除されていない
378 $queryStr .= 'AND uc_room_id = ? ';
379 $queryStr .= 'AND uc_language_id = ? ';
380 $retValue = $this->selectRecords($queryStr, array($roomId, $langId), $rows);
386 * @param string $contentType コンテンツタイプ
387 * @param string $contentId コンテンツID
388 * @param string $langId 言語ID
389 * @param array $row レコード
390 * @return bool 取得 = true, 取得なし= false
392 function getContentByContentId($contentType, $contentId, $langId, &$row)
394 $queryStr = 'SELECT * FROM content ';
395 $queryStr .= 'WHERE cn_deleted = false '; // 削除されていない
396 $queryStr .= 'AND cn_type = ? ';
397 $queryStr .= 'AND cn_id = ? ';
398 $queryStr .= 'AND cn_language_id = ? ';
399 $ret = $this->selectRecord($queryStr, array($contentType, $contentId, $langId), $row);
405 * @param string $id エントリーID
406 * @param string $langId 言語ID
407 * @param array $row レコード
408 * @return bool 取得 = true, 取得なし= false
410 function getEntryByEntryId($id, $langId, &$row)
412 $queryStr = 'SELECT * FROM blog_entry ';
413 $queryStr .= 'WHERE be_deleted = false '; // 削除されていない
414 $queryStr .= 'AND be_id = ? ';
415 $queryStr .= 'AND be_language_id = ? ';
416 $ret = $this->selectRecord($queryStr, array($id, $langId), $row);
422 * @param int $id 商品ID
423 * @param string $langId 言語ID
424 * @param array $row レコード
425 * @return bool 取得 = true, 取得なし= false
427 function getProductByProductId($id, $langId, &$row)
429 $queryStr = 'SELECT * FROM product LEFT JOIN product_record ON pt_id = pe_product_id AND pt_language_id = pe_language_id ';
430 $queryStr .= 'WHERE pt_deleted = false '; // 削除されていない
431 $queryStr .= 'AND pt_visible = true '; // 表示可能な商品
432 $queryStr .= 'AND pt_id = ? ';
433 $queryStr .= 'AND pt_language_id = ? ';
434 $ret = $this->selectRecord($queryStr, array($id, $langId), $row);
440 * @param int $id イベントID
441 * @param string $langId 言語
442 * @param array $row レコード
443 * @return bool 取得 = true, 取得なし= false
445 function getEvent($id, $langId, &$row)
447 $queryStr = 'SELECT * FROM event_entry ';
448 $queryStr .= 'WHERE ee_deleted = false '; // 削除されていない
449 $queryStr .= 'AND ee_id = ? ';
450 $queryStr .= 'AND ee_language_id = ? ';
451 $ret = $this->selectRecord($queryStr, array($id, $langId), $row);
457 * @param array $threadId スレッドID
458 * @param array $row レコード
459 * @return bool 取得 = true, 取得なし= false
461 function getBbsThread($threadId, &$row)
463 $queryStr = 'SELECT * FROM bbs_2ch_thread_message ';
464 $queryStr .= 'WHERE te_thread_id = ? ';
465 $queryStr .= 'AND te_index = 1 ';
466 $ret = $this->selectRecord($queryStr, array($threadId), $row);
472 * @param int $id 公開画像ID
473 * @param string $langId 言語
474 * @param array $row レコード
475 * @return bool 取得 = true, 取得なし= false
477 function getPhoto($id, $langId, &$row)
479 $queryStr = 'SELECT * FROM photo LEFT JOIN _login_user ON ht_owner_id = lu_id AND lu_deleted = false ';
480 $queryStr .= 'WHERE ht_deleted = false ';
481 $queryStr .= 'AND ht_public_id = ? ';
482 $queryStr .= 'AND ht_language_id = ? ';
483 $ret = $this->selectRecord($queryStr, array($id, $langId), $row);