OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / m / blog / include / db / blogDb.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-2010 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id: blogDb.php 3835 2010-11-17 04:26:15Z fishbone $
14  * @link       http://www.magic3.org
15  */
16 require_once($gEnvManager->getDbPath() . '/baseDb.php');
17
18 class blogDb extends BaseDb
19 {
20         /**
21          * ブログ定義値をすべて取得
22          *
23          * 掲示板IDが空のデフォルト値は常に読み込む
24          *
25          * @param array  $rows                  レコード
26          * @param string $blogId                ブログID(空の場合はデフォルト値を取得)
27          * @return bool                                 1行以上取得 = true, 取得なし= false
28          */
29         function getAllConfig(&$rows, $blogId = '')
30         {
31                 $queryStr  = 'SELECT * FROM blog_config ';
32                 $queryStr .=  'WHERE bg_blog_id = \'\' ';
33                 $queryStr .=   'OR bg_blog_id = ? ';
34                 $queryStr .=   'ORDER BY bg_blog_id, bg_index';
35                 $retValue = $this->selectRecords($queryStr, array($blogId), $rows);
36                 return $retValue;
37         }
38         /**
39          * ブログ定義値を更新
40          *
41          * @param string $key           キーとなる項目値
42          * @param string $value         値
43          * @param string $blogId                掲示板ID
44          * @return                                      true = 正常、false=異常
45          */
46         function updateConfig($key, $value, $blogId = '')
47         {
48                 // トランザクションスタート
49                 $this->startTransaction();
50                 
51                 $queryStr  = 'SELECT bg_value FROM blog_config ';
52                 $queryStr .=   'WHERE bg_blog_id = ? ';
53                 $queryStr .=     'AND bg_id = ? ';
54                 $ret = $this->selectRecord($queryStr, array($blogId, $key), $row);
55                 if ($ret){
56                         $queryStr  = 'UPDATE blog_config ';
57                         $queryStr .=   'SET bg_value = ? ';
58                         $queryStr .=   'WHERE bg_blog_id = ? ';
59                         $queryStr .=     'AND bg_id = ? ';
60                         $ret = $this->execStatement($queryStr, array($value, $blogId, $key));                   
61                 } else {
62                         $queryStr  = 'INSERT INTO blog_config (';
63                         $queryStr .=   'bg_blog_id, ';
64                         $queryStr .=   'bg_id, ';
65                         $queryStr .=   'bg_value ';
66                         $queryStr .= ') VALUES (';
67                         $queryStr .=   '?, ?, ?';
68                         $queryStr .= ')';
69                         $ret = $this->execStatement($queryStr, array($blogId, $key, $value));   
70                 }
71                 // トランザクション終了
72                 $ret = $this->endTransaction();
73                 return $ret;
74         }
75         /**
76          * エントリー項目を検索(表示用)
77          *
78          * @param int           $limit                          取得する項目数
79          * @param int           $page                           取得するページ(1~)
80          * @param timestamp $now                                現在日時(現在日時より未来の投稿日時の記事は取得しない)
81          * @param string        $keyword                        検索キーワード
82          * @param string        $langId                         言語
83          * @param function      $callback                       コールバック関数
84          * @return                      なし
85          */
86         function searchEntryItemsByKeyword($limit, $page, $now, $keyword, $langId, $callback)
87         {
88                 $offset = $limit * ($page -1);
89                 if ($offset < 0) $offset = 0;
90                 $initDt = $this->gEnv->getInitValueOfTimestamp();               // 日時初期化値
91                 $params = array();
92                 
93                 $queryStr = 'SELECT * FROM blog_entry ';
94                 $queryStr .=  'WHERE be_language_id = ? ';      $params[] = $langId;
95                 $queryStr .=    'AND be_deleted = false ';              // 削除されていない
96                 $queryStr .=    'AND be_regist_dt <= ? ';       $params[] = $now;       // 投稿日時が現在日時よりも過去のものを取得
97
98                 // タイトルと記事を検索
99                 if (!empty($keyword)){
100                         // 「'"\」文字をエスケープ
101                         $keyword = addslashes($keyword);
102                         
103                         $queryStr .=    'AND (be_name LIKE \'%' . $keyword . '%\' ';
104                         $queryStr .=    'OR be_html LIKE \'%' . $keyword . '%\' ';
105                         $queryStr .=    'OR be_html_ext LIKE \'%' . $keyword . '%\' ';
106                         $queryStr .=    'OR be_description LIKE \'%' . $keyword . '%\') ';
107                 }
108                 
109                 // 公開期間を指定
110                 $queryStr .=    'AND (be_active_start_dt = ? OR (be_active_start_dt != ? AND be_active_start_dt <= ?)) ';
111                 $queryStr .=    'AND (be_active_end_dt = ? OR (be_active_end_dt != ? AND be_active_end_dt > ?)) ';
112                 $params[] = $initDt;
113                 $params[] = $initDt;
114                 $params[] = $now;
115                 $params[] = $initDt;
116                 $params[] = $initDt;
117                 $params[] = $now;
118                 
119                 $queryStr .=  'ORDER BY be_regist_dt desc limit ' . $limit . ' offset ' . $offset;
120                 $this->selectLoop($queryStr, $params, $callback, null);
121         }
122         /**
123          * 検索条件のエントリー項目数を取得(表示用)
124          *
125          * @param timestamp $now                                現在日時(現在日時より未来の投稿日時の記事は取得しない)
126          * @param string        $keyword                        検索キーワード
127          * @param string        $langId                         言語
128          * @return int                                                  項目数
129          */
130         function searchEntryItemsCountByKeyword($now, $keyword, $langId)
131         {
132                 $initDt = $this->gEnv->getInitValueOfTimestamp();               // 日時初期化値
133                 $params = array();
134                 
135                 $queryStr = 'SELECT * FROM blog_entry ';
136                 $queryStr .=  'WHERE be_language_id = ? ';      $params[] = $langId;
137                 $queryStr .=    'AND be_deleted = false ';              // 削除されていない
138                 $queryStr .=    'AND be_regist_dt <= ? ';       $params[] = $now;       // 投稿日時が現在日時よりも過去のものを取得
139
140                 // タイトルと記事を検索
141                 if (!empty($keyword)){
142                         // 「'"\」文字をエスケープ
143                         $keyword = addslashes($keyword);
144                         
145                         $queryStr .=    'AND (be_name LIKE \'%' . $keyword . '%\' ';
146                         $queryStr .=    'OR be_html LIKE \'%' . $keyword . '%\' ';
147                         $queryStr .=    'OR be_html_ext LIKE \'%' . $keyword . '%\' ';
148                         $queryStr .=    'OR be_description LIKE \'%' . $keyword . '%\') ';
149                 }
150                 
151                 // 公開期間を指定
152                 $queryStr .=    'AND (be_active_start_dt = ? OR (be_active_start_dt != ? AND be_active_start_dt <= ?)) ';
153                 $queryStr .=    'AND (be_active_end_dt = ? OR (be_active_end_dt != ? AND be_active_end_dt > ?)) ';
154                 $params[] = $initDt;
155                 $params[] = $initDt;
156                 $params[] = $now;
157                 $params[] = $initDt;
158                 $params[] = $initDt;
159                 $params[] = $now;
160                 return $this->selectRecordCount($queryStr, $params);
161         }
162         /**
163          * エントリー項目を取得(表示用)
164          *
165          * @param int           $limit                          取得する項目数
166          * @param int           $page                           取得するページ(1~)
167          * @param timestamp $now                                現在日時(現在日時より未来の投稿日時の記事は取得しない)
168          * @param int           $entryId                        エントリーID(0のときは期間で取得)
169          * @param timestamp     $startDt                        期間(開始日)
170          * @param timestamp     $endDt                          期間(終了日)
171          * @param string        $langId                         言語
172          * @param int           $order                          取得順(0=昇順,1=降順)
173          * @param function      $callback                       コールバック関数
174          * @return                      なし
175          */
176         function getEntryItems($limit, $page, $now, $entryId, $startDt, $endDt, $langId, $order, $callback)
177         {
178                 $offset = $limit * ($page -1);
179                 if ($offset < 0) $offset = 0;
180                 $initDt = $this->gEnv->getInitValueOfTimestamp();               // 日時初期化値
181                 $params = array();
182                 
183                 // エントリーIDの指定がない場合は、期間で取得
184                 if (empty($entryId)){
185                         $queryStr = 'SELECT * FROM blog_entry ';
186                         $queryStr .=  'WHERE be_deleted = false ';              // 削除されていない
187                         $queryStr .=    'AND be_status = ? ';           $params[] = 2;  // 「公開」(2)データを表示
188                         $queryStr .=    'AND be_language_id = ? ';      $params[] = $langId;
189                         $queryStr .=    'AND be_regist_dt <= ? ';       $params[] = $now;               // 投稿日時が現在日時よりも過去のものを取得
190                         
191                         // 検索条件
192                         if (!empty($startDt)){
193                                 $queryStr .=    'AND ? <= be_regist_dt ';
194                                 $params[] = $startDt;
195                         }
196                         if (!empty($endDt)){
197                                 $queryStr .=    'AND be_regist_dt < ? ';
198                                 $params[] = $endDt;
199                         }
200                         
201                         // 公開期間を指定
202                         $queryStr .=    'AND (be_active_start_dt = ? OR (be_active_start_dt != ? AND be_active_start_dt <= ?)) ';
203                         $queryStr .=    'AND (be_active_end_dt = ? OR (be_active_end_dt != ? AND be_active_end_dt > ?)) ';
204                         $params[] = $initDt;
205                         $params[] = $initDt;
206                         $params[] = $now;
207                         $params[] = $initDt;
208                         $params[] = $initDt;
209                         $params[] = $now;
210                 
211                         $ord = '';
212                         if (!empty($order)) $ord = 'DESC ';
213                         $queryStr .=  'ORDER BY be_regist_dt ' . $ord . 'LIMIT ' . $limit . ' offset ' . $offset;// 投稿順
214                         $this->selectLoop($queryStr, $params, $callback, null);
215                 } else {
216                         $queryStr = 'SELECT * FROM blog_entry ';
217                         $queryStr .=  'WHERE be_deleted = false ';              // 削除されていない
218                         $queryStr .=    'AND be_status = ? ';   $params[] = 2;  // 「公開」(2)データを表示
219                         $queryStr .=    'AND be_id = ? ';               $params[] = $entryId;
220                         $queryStr .=    'AND be_language_id = ? ';      $params[] = $langId;
221                         $queryStr .=    'AND be_regist_dt <= ? ';       $params[] = $now;               // 投稿日時が現在日時よりも過去のものを取得
222                         
223                         // 公開期間を指定
224                         $queryStr .=    'AND (be_active_start_dt = ? OR (be_active_start_dt != ? AND be_active_start_dt <= ?)) ';
225                         $queryStr .=    'AND (be_active_end_dt = ? OR (be_active_end_dt != ? AND be_active_end_dt > ?)) ';
226                         $params[] = $initDt;
227                         $params[] = $initDt;
228                         $params[] = $now;
229                         $params[] = $initDt;
230                         $params[] = $initDt;
231                         $params[] = $now;
232                         $this->selectLoop($queryStr, $params, $callback, null);         // 「公開」(2)データを表示
233                 }
234         }
235         
236         /**
237          * エントリー項目数を取得(表示用)
238          *
239          * @param timestamp $now                                現在日時(現在日時より未来の投稿日時の記事は取得しない)
240          * @param timestamp     $startDt                        期間(開始日)
241          * @param timestamp     $endDt                          期間(終了日)
242          * @param string        $langId                         言語
243          * @return int                                                  項目数
244          */
245         function getEntryItemsCount($now, $startDt, $endDt, $langId)
246         {
247                 $initDt = $this->gEnv->getInitValueOfTimestamp();               // 日時初期化値
248                 $params = array();
249                 
250                 $queryStr = 'SELECT * FROM blog_entry ';
251                 $queryStr .=  'WHERE be_deleted = false ';              // 削除されていない
252                 $queryStr .=    'AND be_status = ? ';           $params[] = 2;  // 「公開」(2)データを表示
253                 $queryStr .=    'AND be_language_id = ? ';      $params[] = $langId;
254                 $queryStr .=    'AND be_regist_dt <= ? ';       $params[] = $now;               // 投稿日時が現在日時よりも過去のものを取得
255                 
256                 // 検索条件
257                 if (!empty($startDt)){
258                         $queryStr .=    'AND ? <= be_regist_dt ';
259                         $params[] = $startDt;
260                 }
261                 if (!empty($endDt)){
262                         $queryStr .=    'AND be_regist_dt < ? ';
263                         $params[] = $endDt;
264                 }
265                 
266                 // 公開期間を指定
267                 $queryStr .=    'AND (be_active_start_dt = ? OR (be_active_start_dt != ? AND be_active_start_dt <= ?)) ';
268                 $queryStr .=    'AND (be_active_end_dt = ? OR (be_active_end_dt != ? AND be_active_end_dt > ?)) ';
269                 $params[] = $initDt;
270                 $params[] = $initDt;
271                 $params[] = $now;
272                 $params[] = $initDt;
273                 $params[] = $initDt;
274                 $params[] = $now;
275                 return $this->selectRecordCount($queryStr, $params);
276         }
277         /**
278          * エントリー項目をカテゴリー指定で取得(表示用)
279          *
280          * @param int           $limit                          取得する項目数
281          * @param int           $page                           取得するページ(1~)
282          * @param timestamp $now                                現在日時(現在日時より未来の投稿日時の記事は取得しない)
283          * @param int           $categoryId                     カテゴリーID
284          * @param string        $langId                         言語
285          * @param int           $order                          取得順(0=昇順,1=降順)
286          * @param function      $callback                       コールバック関数
287          * @return                      なし
288          */
289         function getEntryItemsByCategory($limit, $page, $now, $categoryId, $langId, $order, $callback)
290         {
291                 $offset = $limit * ($page -1);
292                 if ($offset < 0) $offset = 0;
293                 $initDt = $this->gEnv->getInitValueOfTimestamp();               // 日時初期化値
294                 $params = array();
295                 
296                 $queryStr = 'SELECT distinct(be_serial) FROM blog_entry RIGHT JOIN blog_entry_with_category ON be_serial = bw_entry_serial ';
297                 $queryStr .=  'WHERE be_language_id = ? '; $params[] = $langId;
298                 $queryStr .=    'AND be_deleted = false ';              // 削除されていない
299                 $queryStr .=    'AND be_status = ? '; $params[] = 2;    // 「公開」(2)データ
300                 $queryStr .=    'AND bw_category_id = ? ';      $params[] = $categoryId;// 記事カテゴリー
301                 $queryStr .=    'AND be_regist_dt <= ? ';       $params[] = $now;                       // 投稿日時が現在日時よりも過去のものを取得
302                 
303                 // 公開期間を指定
304                 $queryStr .=    'AND (be_active_start_dt = ? OR (be_active_start_dt != ? AND be_active_start_dt <= ?)) ';
305                 $queryStr .=    'AND (be_active_end_dt = ? OR (be_active_end_dt != ? AND be_active_end_dt > ?)) ';
306                 $params[] = $initDt;
307                 $params[] = $initDt;
308                 $params[] = $now;
309                 $params[] = $initDt;
310                 $params[] = $initDt;
311                 $params[] = $now;
312                 
313                 // シリアル番号を取得
314                 $serialArray = array();
315                 $ret = $this->selectRecords($queryStr, $params, $serialRows);
316                 if ($ret){
317                         for ($i = 0; $i < count($serialRows); $i++){
318                                 $serialArray[] = $serialRows[$i]['be_serial'];
319                         }
320                 }
321                 $serialStr = implode(',', $serialArray);
322                 if (empty($serialStr)) $serialStr = '0';        // 0レコードのときはダミー値を設定
323         
324                 $queryStr = 'SELECT * FROM blog_entry ';
325                 $queryStr .=  'WHERE be_serial in (' . $serialStr . ') ';
326                 $ord = '';
327                 if (!empty($order)) $ord = 'DESC ';
328                 $queryStr .=  'ORDER BY be_regist_dt ' . $ord . 'LIMIT ' . $limit . ' offset ' . $offset;// 投稿順
329                 $this->selectLoop($queryStr, array(), $callback, null);
330         }
331         /**
332          * エントリー項目数をカテゴリー指定で取得(表示用)
333          *
334          * @param timestamp $now                                現在日時(現在日時より未来の投稿日時の記事は取得しない)
335          * @param int           $categoryId                     カテゴリーID
336          * @param string        $langId                         言語
337          * @return int                                                  エントリー項目数
338          */
339         function getEntryItemsCountByCategory($now, $categoryId, $langId)
340         {
341                 $initDt = $this->gEnv->getInitValueOfTimestamp();               // 日時初期化値
342                 $params = array();
343                 
344                 $queryStr = 'SELECT distinct(be_serial) FROM blog_entry RIGHT JOIN blog_entry_with_category ON be_serial = bw_entry_serial ';
345                 $queryStr .=  'WHERE be_language_id = ? '; $params[] = $langId;
346                 $queryStr .=    'AND be_deleted = false ';              // 削除されていない
347                 $queryStr .=    'AND be_status = ? '; $params[] = 2;    // 「公開」(2)データ
348                 $queryStr .=    'AND bw_category_id = ? ';      $params[] = $categoryId;// 記事カテゴリー
349                 $queryStr .=    'AND be_regist_dt <= ? ';       $params[] = $now;                       // 投稿日時が現在日時よりも過去のものを取得
350                 
351                 // 公開期間を指定
352                 $queryStr .=    'AND (be_active_start_dt = ? OR (be_active_start_dt != ? AND be_active_start_dt <= ?)) ';
353                 $queryStr .=    'AND (be_active_end_dt = ? OR (be_active_end_dt != ? AND be_active_end_dt > ?)) ';
354                 $params[] = $initDt;
355                 $params[] = $initDt;
356                 $params[] = $now;
357                 $params[] = $initDt;
358                 $params[] = $initDt;
359                 $params[] = $now;
360                 
361                 // シリアル番号を取得
362                 $serialArray = array();
363                 $ret = $this->selectRecords($queryStr, $params, $serialRows);
364                 if ($ret){
365                         for ($i = 0; $i < count($serialRows); $i++){
366                                 $serialArray[] = $serialRows[$i]['be_serial'];
367                         }
368                 }
369                 $serialStr = implode(',', $serialArray);
370                 if (empty($serialStr)) $serialStr = '0';        // 0レコードのときはダミー値を設定
371         
372                 $queryStr = 'SELECT * FROM blog_entry ';
373                 $queryStr .=  'WHERE be_serial in (' . $serialStr . ') ';
374                 return $this->selectRecordCount($queryStr, array());
375         }
376         /**
377          * ブログカテゴリーをカテゴリーIDで取得
378          *
379          * @param int           $id                                     カテゴリーID
380          * @param string        $langId                         言語ID
381          * @param array     $row                                レコード
382          * @return bool                                                 取得 = true, 取得なし= false
383          */
384         function getCategoryByCategoryId($id, $langId, &$row)
385         {
386                 $queryStr  = 'SELECT * FROM blog_category LEFT JOIN _login_user ON bc_create_user_id = lu_id AND lu_deleted = false ';
387                 $queryStr .=   'WHERE bc_deleted = false ';     // 削除されていない
388                 $queryStr .=   'AND bc_id = ? ';
389                 $queryStr .=   'AND bc_language_id = ? ';
390                 $ret = $this->selectRecord($queryStr, array($id, $langId), $row);
391                 return $ret;
392         }
393 }
394 ?>