ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/trunk/webapp/lib/db/diary.php @ 3738

Last change on this file since 3738 was 3738, checked in by ogawa, 13 years ago

#1048:PostgreSQL対応

File size: 37.8 KB
Line 
1<?php
2/**
3 * @copyright 2005-2007 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7/**
8 * 指定メンバーの日記カテゴリリストを取得する
9 *
10 * @param int $c_member_id
11 * @return array
12 */
13function db_diary_category_list4c_member_id($c_member_id)
14{
15    $sql = 'SELECT c_diary_category_id, category_name FROM c_diary_category '
16         . 'WHERE c_member_id = ? ORDER BY c_diary_category_id';
17    $result = db_get_all($sql, array(intval($c_member_id)));
18
19    return $result;
20}
21
22/**
23 * カテゴリ名からカテゴリIDを得る
24 *
25 * @param int $c_member_id
26 * @param string $category_name
27 * @return bool
28 */
29function db_diary_get_category_id4category_name($c_member_id, $category_name)
30{
31    $sql = 'SELECT c_diary_category_id FROM c_diary_category ' .
32        'WHERE category_name = ? AND c_member_id = ?';
33    return db_get_one($sql, array($category_name, intval($c_member_id)));
34}
35
36/**
37 * カテゴリIDからカテゴリ名を得る
38 */
39function db_diary_get_category_name4category_id($category_id)
40{
41    $sql = 'SELECT category_name FROM c_diary_category ' .
42        'WHERE c_diary_category_id = ?';
43    return db_get_one($sql, array($category_id));
44}
45
46/**
47 * 日記IDからカテゴリリストを得る
48 *
49 * @param int $c_diary_id
50 * @return array
51 */
52function db_diary_category_list4c_diary_id($c_diary_id)
53{
54    $sql = 'SELECT c_diary_category_id FROM c_diary_category_diary WHERE c_diary_id = ?';
55    $category_list = db_get_col($sql, array(intval($c_diary_id)));
56    if (!$category_list) {
57        return array();
58    }
59    $ids = implode(',', $category_list);
60
61    $sql = 'SELECT c_diary_category_id, category_name FROM c_diary_category'
62         . ' WHERE c_diary_category_id IN ('.$ids.') ORDER BY c_diary_category_id';
63    return db_get_all($sql);
64}
65
66/**
67 * カテゴリIDから日記を得る
68 *
69 * @param int $c_member_id
70 * @param int $c_diary_category_id
71 * @param int $u
72 * @param int $page_size
73 * @param int $page
74 * @return array
75 */
76function db_diary_list4c_diary_category_id($c_member_id, $c_diary_category_id, $u = null, $page_size = 20, $page = 0)
77{
78    $sql = 'SELECT c_diary_id FROM c_diary_category_diary WHERE c_diary_category_id = ?';
79    $diary_list = db_get_col($sql, array(intval($c_diary_category_id)));
80    if (!$diary_list) {
81        return array(array(), false, false, 0);
82    }
83    $ids = implode(',', $diary_list);
84
85    $pf_cond = db_diary_public_flag_condition($c_member_id, $u);
86    $where = ' WHERE c_diary_id IN ('.$ids.') AND c_member_id = ? ' . $pf_cond . ' ORDER BY r_datetime DESC';
87    $sql = 'SELECT * FROM c_diary' . $where;
88    $params = array($c_member_id);
89    $list = db_get_all_limit($sql, $page_size * ($page - 1), $page_size, $params);
90
91    foreach ($list as $key => $c_diary) {
92        $list[$key]['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($c_diary['c_diary_id']);
93    }
94
95    $sql = 'SELECT COUNT(*) FROM c_diary' . $where;
96    $total_num = db_get_one($sql, $params);
97
98    if ($total_num != 0) {
99        $total_page_num =  ceil($total_num / $page_size);
100        if ($page >= $total_page_num) {
101            $next = false;
102        } else {
103            $next = true;
104        }
105        if ($page <= 1) {
106            $prev = false;
107        } else {
108            $prev = true;
109        }
110    }
111
112    return array($list, $prev, $next, $total_num);
113}
114
115/**
116 * カテゴリを追加する
117 *
118 * @param int $c_member_id
119 * @param int $category_name
120 */
121function db_diary_category_insert_category($c_member_id, $category_name)
122{
123    $data = array(
124        'c_member_id' => intval($c_member_id),
125        'category_name' => $category_name,
126        'r_datetime' => db_now(),
127    );
128    return db_insert('c_diary_category', $data);
129}
130
131/**
132 * カテゴリを削除する
133 *
134 * @param int $c_diary_category_id
135 */
136function db_diary_category_delete_category($c_diary_category_id)
137{
138    $sql = 'DELETE FROM c_diary_category WHERE c_diary_category_id = ?';
139    db_query($sql, array($c_diary_category_id));   
140}
141/**
142 * カテゴリと日記を関連づける
143 *
144 * @param int $c_diary_id
145 * @param int $c_diary_category_id
146 */
147function db_diary_category_insert_c_diary_category_diary($c_diary_id, $c_diary_category_id)
148{
149    $data = array(
150        'c_diary_id' => intval($c_diary_id),
151        'c_diary_category_id' => intval($c_diary_category_id),
152    );
153    db_insert('c_diary_category_diary', $data);
154}
155
156/**
157 * カテゴリと日記の関連づけを削除する
158 */
159function db_diary_category_delete_c_diary_category_diary($c_diary_id)
160{
161    $diary_category_list = db_diary_category_list4c_diary_id($c_diary_id);
162
163    $sql = 'DELETE FROM c_diary_category_diary WHERE c_diary_id = ?';
164    db_query($sql, array($c_diary_id));
165
166    foreach($diary_category_list as $value) {
167        $sql = 'SELECT COUNT(*) FROM c_diary_category_diary'.
168            ' WHERE c_diary_category_id = ?';
169        $c_diary_category_id = $value['c_diary_category_id'];
170        $is_diary = (bool)db_get_one($sql, array(intval($c_diary_category_id)));
171        if (!$is_diary) {  //カテゴリに関連付いた日記が存在しない
172            db_diary_category_delete_category($c_diary_category_id);
173        }
174    }
175}
176
177/**
178 * db_diary_public_flag_condition
179 *
180 * @param int $c_member_id target c_member_id
181 * @param int $u viewer's c_member_id
182 * @param string $force
183 * @return string
184 */
185function db_diary_public_flag_condition($c_member_id, $u = null, $force = null)
186{
187    $pf_cond = '';
188    if ($force) {
189        switch ($force) {
190        case 'friend':
191            $pf_cond = " AND public_flag <> 'private'";
192            break;
193        case 'private':
194            $pf_cond = " AND public_flag = 'public'";
195            break;
196        }
197    } else {
198        if (!is_null($u) && $c_member_id != $u) {
199            $is_friend = db_friend_is_friend($c_member_id, $u);
200            if ($is_friend) {
201                $pf_cond = " AND public_flag <> 'private'";
202            } else {
203                $pf_cond = " AND public_flag = 'public'";
204            }
205        }
206    }
207    return $pf_cond;
208}
209
210//// c_diary
211
212/**
213 * 日記IDから日記を取得
214 *
215 * @param   int   $c_diary_id
216 * @return  array
217 */
218function db_diary_get_c_diary4id($c_diary_id)
219{
220    $sql = 'SELECT * FROM c_diary WHERE c_diary_id = ?';
221    return db_get_row($sql, array(intval($c_diary_id)));
222}
223
224/**
225 * メンバーIDから日記リストを最新順で取得
226 *
227 * @param int $c_member_id
228 * @return array 日記リスト
229 */
230function db_diary_get_c_diary_list4c_member_id($target_c_member_id, $count = 10, $u = null, $force = null)
231{
232    static $is_recurred = false;  //再帰処理中かどうかの判定フラグ
233
234    if (!$is_recurred) {  //function cacheのために再帰処理を行う
235        $is_recurred = true;
236        $funcargs = func_get_args();
237        return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_FAST, __FUNCTION__, $funcargs);
238    }
239
240    $is_recurred = false;
241
242    $pf_cond = db_diary_public_flag_condition($target_c_member_id, $u, $force);
243    $sql = 'SELECT * FROM c_diary WHERE c_member_id = ?' . $pf_cond .
244           ' ORDER BY r_datetime DESC';
245    $params = array(intval($target_c_member_id));
246    $arr = db_get_all_limit($sql, 0, $count, $params);
247    foreach ($arr as $key => $value) {
248        $arr[$key]['comment_count'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
249    }
250    return $arr;
251}
252
253function p_common_is_active_c_diary_id($c_diary_id)
254{
255    $sql = 'SELECT c_diary_id FROM c_diary WHERE c_diary_id = ?';
256    return (bool)db_get_one($sql, array(intval($c_diary_id)));
257}
258
259//// c_diary_comment
260
261/**
262 * 日記のコメントリストを得る
263 *
264 * @param   int $c_diary_id
265 * @param   int $limit
266 * @return  array 日記コメント+ニックネーム
267 */
268function db_diary_get_c_diary_comment_list4c_diary_id($c_diary_id)
269{
270    $sql = 'SELECT c_member.nickname, c_diary_comment.*' .
271        ' FROM c_diary_comment LEFT JOIN c_member USING (c_member_id)' .
272        ' WHERE c_diary_id = ?' .
273        ' ORDER BY c_diary_comment.r_datetime';
274    return db_get_all($sql, array(intval($c_diary_id)));
275}
276
277/**
278 * 日記のコメントリスト(好きなID(複数))を取得
279 *
280 * @param   array $id_list
281 * @param   int   $page
282 * @param   int   $page_size
283 * @param   bool  $desc  並び順を日時の新しい順にするかどうか
284 * @return  日記コメント(+ニックネーム)リスト
285 */
286function db_diary_get_c_diary_comment_list4id_list($id_list, $page = 1, $page_size= -1, $desc = false)
287{
288    if (!count($id_list)) return array();
289    if ($page_size < 0) {
290        $page_size = count($id_list);
291    }
292    $e_id_list = implode(',', array_map('intval', (array)$id_list));
293
294    $sql = 'SELECT * FROM c_diary_comment' .
295            ' WHERE c_diary_comment_id IN ('.$e_id_list.')';
296    if ($desc) {
297        $sql .= ' ORDER BY r_datetime DESC';
298    } else {
299        $sql .= ' ORDER BY r_datetime';
300    }
301    $c_diary_comment_list = db_get_all_page($sql, $page, $page_size);
302    foreach ($c_diary_comment_list as $key => $value) {
303        $c_member = db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
304        $c_diary_comment_list[$key]['nickname'] = $c_member['nickname'];
305    }
306
307    $sql = 'SELECT COUNT(*) FROM c_diary_comment' .
308        ' WHERE c_diary_comment_id IN ('.$e_id_list.')';
309    $total_num = db_get_one($sql);
310
311    if ($total_num != 0) {
312        $total_page_num = ceil($total_num / $page_size);
313        if ($page >= $total_page_num) {
314            $next = false;
315        } else {
316            $next = true;
317        }
318
319        if ($page <= 1) {
320            $prev = false;
321        } else {
322            $prev = true;
323        }
324    }
325
326    return array($c_diary_comment_list, $prev , $next, $total_num);
327}
328
329/**
330 * 日記のコメント数を取得
331 *
332 * @param int $c_diary_id
333 * @return int コメント数
334 */
335function db_diary_count_c_diary_comment4c_diary_id($c_diary_id)
336{
337    $sql = 'SELECT COUNT(*) FROM c_diary_comment WHERE c_diary_id = ?';
338    return db_get_one($sql, array(intval($c_diary_id)));
339}
340
341////
342
343/**
344 * あるメンバーの日記リストを取得
345 *
346 * @param int $c_member_id target c_member_id
347 * @param int $page_size
348 * @param int $page
349 * @param int $u viewer's c_member_id
350 * @return array 日記リスト
351 */
352function p_fh_diary_list_diary_list4c_member_id($c_member_id, $page_size, $page, $u = null)
353{
354    $pf_cond = db_diary_public_flag_condition($c_member_id, $u);
355    $sql = 'SELECT * FROM c_diary WHERE c_member_id = ?' . $pf_cond .
356           ' ORDER BY r_datetime DESC';
357    $params = array(intval($c_member_id));
358    $list = db_get_all_page($sql, $page, $page_size, $params);
359
360    foreach ($list as $key => $c_diary) {
361        $list[$key]['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($c_diary['c_diary_id']);
362    }
363
364    $sql = 'SELECT COUNT(*) FROM c_diary WHERE c_member_id = ?' . $pf_cond;
365    $total_num = db_get_one($sql, $params);
366
367    if ($total_num != 0) {
368        $total_page_num =  ceil($total_num / $page_size);
369        if ($page >= $total_page_num) {
370            $next = false;
371        } else {
372            $next = true;
373        }
374
375        if ($page <= 1) {
376            $prev = false;
377        } else {
378            $prev = true;
379        }
380    }
381    return array($list, $prev, $next, $total_num);
382}
383
384/**
385 * フレンドの最新日記リスト
386 */
387function p_h_diary_list_friend_h_diary_list_friend4c_member_id($c_member_id, $page_size, $page)
388{
389    $friends = db_friend_c_member_id_list($c_member_id, true);
390    if (!$friends) {
391        return array(array(), false, false, 0);
392    }
393    $ids = implode(',', array_map('intval', $friends));
394
395    $hint = db_mysql_hint('USE INDEX (r_datetime_c_member_id, r_datetime)');
396    $sql = 'SELECT * FROM c_diary' . $hint .
397            ' WHERE c_member_id IN (' . $ids . ')' .
398            ' AND public_flag <> \'private\'' .
399            ' ORDER BY c_diary.r_datetime DESC';
400
401    $lst = db_get_all_page($sql, $page, $page_size);
402
403    foreach ($lst as $key=>$value) {
404        $lst[$key]['count_comments'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
405        $lst[$key]['c_member'] = db_common_c_member4c_member_id($value['c_member_id']);
406    }
407
408    $sql = 'SELECT count(*) FROM c_diary' .
409           ' WHERE c_member_id IN (' . $ids . ')' .
410           ' AND public_flag <> \'private\'';
411    $total_num = db_get_one($sql, $params);
412
413    if ($total_num != 0) {
414        $total_page_num =  ceil($total_num / $page_size);
415        if ($page >= $total_page_num) {
416            $next = false;
417        } else {
418            $next = true;
419        }
420
421        if ($page <= 1) {
422            $prev = false;
423        } else {
424            $prev = true;
425        }
426    }
427
428    return array($lst, $prev, $next, $total_num);
429}
430
431/**
432 * 未読コメントのある日記の数を数える
433 *
434 * @param int $c_member_id
435 * @return int 未読日記数
436 */
437function p_h_diary_count_c_diary_not_is_read4c_member_id($c_member_id)
438{
439    $sql = 'SELECT COUNT(*) FROM c_diary WHERE c_member_id = ? AND is_checked = 0';
440    $params = array(intval($c_member_id));
441    return db_get_one($sql, $params);
442}
443
444/**
445 * 未読コメントのある日記のうちもっとも古い日記IDを返す
446 *
447 * @param int $c_member_id
448 * @return int c_diary_id
449 */
450function p_h_diary_c_diary_first_diary_read4c_member_id($c_member_id)
451{
452    $sql = 'SELECT c_diary_id FROM c_diary WHERE c_member_id = ? AND is_checked = 0 ORDER BY r_datetime';
453    $params = array(intval($c_member_id));
454    return db_get_one($sql, $params);
455}
456
457/**
458 * フレンド最新日記リスト取得
459 * 日記公開範囲を考慮
460 *
461 * @param   int $c_member_id
462 * @param   int $limit
463 * @return  array_of_array  (c_diary.*, nickname)
464 */
465function p_h_home_c_diary_friend_list4c_member_id($c_member_id, $limit)
466{
467    static $is_recurred = false;  //再帰処理中かどうかの判定フラグ
468
469    if (!$is_recurred) {  //function cacheのために再帰処理を行う
470        $is_recurred = true;
471        $funcargs = func_get_args();
472        return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_FAST, __FUNCTION__, $funcargs);
473    }
474
475    $is_recurred = false;
476
477    $friends = db_friend_c_member_id_list($c_member_id, true);
478    if (!$friends) {
479        return array();
480    }
481    $ids = implode(',', array_map('intval', $friends));
482
483    $hint = db_mysql_hint('USE INDEX (r_datetime_c_member_id, r_datetime)');
484    $sql = 'SELECT * FROM c_diary' . $hint .
485            ' WHERE c_member_id IN (' . $ids . ')' .
486            ' AND public_flag <> \'private\'' .
487            ' ORDER BY c_diary.r_datetime DESC';
488
489    $c_diary_friend_list = db_get_all_limit($sql, 0, $limit);
490
491    foreach ($c_diary_friend_list as $key => $value) {
492        $c_member = db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
493        $c_diary_friend_list[$key]['nickname'] = $c_member['nickname'];
494        $c_diary_friend_list[$key]['count_comments'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
495    }
496    return $c_diary_friend_list;
497}
498
499/**
500 * 日記コメント記入履歴取得
501 *
502 * @param   int $c_member_id
503 * @param   int $limit
504 * @return  array_of_array  (c_diary.*, nickname)
505 */
506function p_h_home_c_diary_my_comment_list4c_member_id($c_member_id, $limit)
507{
508    static $is_recurred = false;  //再帰処理中かどうかの判定フラグ
509
510    if (!$is_recurred) {  //function cacheのために再帰処理を行う
511        $is_recurred = true;
512        $funcargs = func_get_args();
513        return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_FAST, __FUNCTION__, $funcargs);
514    }
515
516    $is_recurred = false;
517
518    $date = date('Y-m-d 00:00:00', strtotime('-15 days'));
519
520    $blocked = db_member_access_block_list4c_member_id_to($c_member_id);
521    $blocked[] = $c_member_id;
522    $except_ids = implode(',', $blocked);
523
524    $sql = 'SELECT c_diary_comment.c_diary_id' .
525            ' FROM c_diary_comment INNER JOIN c_diary USING (c_diary_id)' .
526            ' WHERE c_diary_comment.c_member_id = ?' .
527            ' AND c_diary_comment.r_datetime > ?' .
528            ' AND c_diary.c_member_id NOT IN (' . $except_ids . ')' .
529            ' AND c_diary.public_flag <> \'private\'';
530    $params = array(intval($c_member_id), $date);
531    $c_diary_id_list = db_get_col($sql, $params);
532    $c_diary_id_list = array_unique($c_diary_id_list);
533    if (!$c_diary_id_list) {
534        return array();
535    }
536
537    $ids = implode(',', $c_diary_id_list);
538    $sql = 'SELECT c_diary_id, MAX(r_datetime) as maxdate' .
539           ' FROM c_diary_comment' .
540           ' WHERE c_diary_id IN (' . $ids . ')' .
541           ' GROUP BY c_diary_id' .
542           ' ORDER BY maxdate DESC';
543    $list = db_get_assoc_limit($sql, 0, $limit);
544
545    $result = array();
546    foreach ($list as $c_diary_id => $r_datetime) {
547        $item = db_diary_get_c_diary4id($c_diary_id);
548        if ($item['public_flag'] == 'friend' && !db_friend_is_friend($c_member_id, $item['c_member_id'])) {
549            continue;
550        }
551        $item += db_common_c_member4c_member_id_LIGHT($item['c_member_id']);
552        $item['r_datetime'] = $r_datetime;
553        $item['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($c_diary_id);
554        $result[] = $item;
555    }
556    return $result;
557}
558
559function p_h_diary_comment_list_c_diary_my_comment_list4c_member_id($c_member_id, $page, $page_size)
560{
561    $blocked = db_member_access_block_list4c_member_id_to($c_member_id);
562    $blocked[] = $c_member_id;
563    $except_ids = implode(',', $blocked);
564
565    $friends = db_friend_c_member_id_list($c_member_id);
566    $firends[] = 0;
567    $friend_ids = implode(',', $friends);
568
569    if ($GLOBALS['_OPENPNE_DSN_LIST']['main']['dsn']['phptype'] == 'pgsql') {
570        $sql = 'SELECT d.c_diary_id' .
571                ', d.subject' .
572                ', d.c_member_id' .
573                ', sub_diary_tbl.r_datetime' .
574                ', sub_diary_tbl.num_comment' .
575            ' FROM c_diary AS d' .
576                ', ( SELECT dc.c_diary_id' .
577                        ', MAX(dc.r_datetime) AS r_datetime' .
578                        ', COUNT(DISTINCT dc.c_diary_comment_id) AS num_comment' .
579                    ' FROM c_diary AS d' .
580                        ' INNER JOIN c_diary_comment AS dc USING (c_diary_id)' .
581                        ', c_diary_comment AS mydc' .
582                    ' WHERE mydc.c_member_id = ?' .
583                        ' AND mydc.c_diary_id = d.c_diary_id' .
584                        ' AND mydc.c_member_id <> d.c_member_id' .
585                        ' AND d.c_member_id NOT IN (' . $except_ids . ')' .
586                        ' AND (d.public_flag = \'public\' OR (d.public_flag = \'friend\' AND d.c_member_id IN (' . $friend_ids . ')))' .
587                    ' GROUP BY dc.c_diary_id' .
588                ') as sub_diary_tbl' .
589            ' WHERE' .
590                ' sub_diary_tbl.c_diary_id = d.c_diary_id' .
591            ' ORDER BY r_datetime DESC';
592    } else {
593        $sql = 'SELECT d.c_diary_id' .
594                ', d.subject' .
595                ', d.c_member_id' .
596                ', MAX(dc.r_datetime) AS r_datetime' .
597                ', COUNT(DISTINCT dc.c_diary_comment_id) AS num_comment' .
598            ' FROM c_diary AS d' .
599                ' INNER JOIN c_diary_comment AS dc USING (c_diary_id)' .
600                ', c_diary_comment AS mydc' .
601            ' WHERE mydc.c_member_id = ?' .
602                ' AND mydc.c_diary_id = d.c_diary_id' .
603                ' AND mydc.c_member_id <> d.c_member_id' .
604                ' AND d.c_member_id NOT IN (' . $except_ids . ')' .
605                ' AND (d.public_flag = \'public\' OR (d.public_flag = \'friend\' AND d.c_member_id IN (' . $friend_ids . ')))' .
606            ' GROUP BY dc.c_diary_id' .
607            ' ORDER BY r_datetime DESC';
608    }
609
610    $params = array(intval($c_member_id));
611    $list = db_get_all_page($sql, $page, $page_size, $params);
612
613    foreach ($list as $key => $value) {
614        $list[$key] += db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
615    }
616
617    $sql = 'SELECT COUNT(DISTINCT d.c_diary_id)' .
618        ' FROM c_diary AS d' .
619            ' INNER JOIN c_diary_comment AS dc USING (c_diary_id)' .
620            ', c_diary_comment AS mydc' .
621        ' WHERE mydc.c_member_id = ?' .
622            ' AND mydc.c_diary_id = d.c_diary_id' .
623            ' AND mydc.c_member_id <> d.c_member_id' .
624            ' AND d.c_member_id NOT IN (' . $except_ids . ')' .
625            ' AND (d.public_flag = \'public\' OR (d.public_flag = \'friend\' AND d.c_member_id IN (' . $friend_ids . ')))';
626    $total_num = db_get_one($sql, $params);
627
628    $is_prev = false;
629    $is_next = false;
630    if ($total_num) {
631        $is_prev = (bool)($page > 1);
632        $is_next = (bool)($page < ceil($total_num / $page_size));
633    }
634    return array($list, $is_prev, $is_next, $total_num);
635}
636
637/**
638 * あるメンバーの指定された年月日の日記のリストを得る
639 */
640function p_fh_diary_list_diary_list_date4c_member_id($c_member_id, $page_size, $page, $year, $month, $day=0 ,$u = null)
641{
642    if ($day) {
643        $s_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day, $year));
644        $e_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day+1, $year));
645    } else {
646        $s_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, 1, $year));
647        $e_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month+1, 1, $year));
648    }
649
650    $pf_cond = db_diary_public_flag_condition($c_member_id, $u);
651    $where = ' WHERE c_member_id = ? AND r_datetime >= ? AND r_datetime < ?';
652    $sql = 'SELECT * FROM c_diary' .
653            $where . $pf_cond .
654            ' ORDER BY r_datetime DESC';
655    $params = array(intval($c_member_id), $s_date, $e_date);
656    $list = db_get_all_limit($sql, $page_size * ($page - 1), $page_size, $params);
657
658    foreach ($list as $key => $c_diary) {
659        $list[$key]['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($c_diary['c_diary_id']);
660    }
661
662    $sql = 'SELECT COUNT(*) FROM c_diary' . $where;
663    $total_num = db_get_one($sql, $params);
664
665    if ($total_num != 0) {
666        $total_page_num =  ceil($total_num / $page_size);
667        if ($page >= $total_page_num) {
668            $next = false;
669        } else {
670            $next = true;
671        }
672        if ($page <= 1) {
673            $prev = false;
674        } else {
675            $prev = true;
676        }
677    }
678    return array($list , $prev , $next, $total_num);
679}
680
681/**
682 * 日記ページの「各月の日記」用
683 *
684 * 日記を最初に書いた月からスタートしてみる
685 */
686function p_fh_diary_list_date_list4c_member_id($c_member_id)
687{
688    $sql = "SELECT r_datetime FROM c_diary" .
689        " WHERE c_member_id = ?" .
690        " ORDER BY r_datetime";
691    $params = array(intval($c_member_id));
692    if (!$first_datetime = db_get_one($sql, $params)) {
693        return array();
694    }
695
696    $start_date = getdate(strtotime($first_datetime));
697    $end_date =  getdate();
698
699    $date = array();
700    $year = $start_date['year'];
701    $month = $start_date['mon'];
702    while (1) {
703        $date[] =  array(
704            'year' => $year,
705            'month' => $month,
706        );
707
708        if ($end_date['year'] <= $year
709            && $end_date['mon'] <= $month) {
710            break;
711        }
712
713        $month++;
714        if ($month > 12) {
715            $month = 1;
716            $year++;
717        }
718    }
719    return array_reverse($date);
720}
721
722//c_member_id から自分の日記についてるコメントID(複数)を取得
723function p_fh_diary_c_diary_comment_id_list4c_member_id($c_member_id)
724{
725    $sql = "SELECT cdc.c_diary_comment_id FROM c_diary as cd,c_diary_comment as cdc" .
726        " WHERE cd.c_member_id = ?".
727        " AND cd.c_diary_id = cdc.c_diary_id";
728    $params = array(intval($c_member_id));
729    return db_get_col($sql, $params);
730}
731
732/**
733 * 年月 から日記のある日(複数)を取得
734 */
735function p_fh_diary_list_calendar_list4c_member_id($year, $month, $c_member_id)
736{
737    $sql = "SELECT cdc.c_diary_comment_id FROM c_diary as cd,c_diary_comment as cdc" .
738        " WHERE cd.c_member_id = ?".
739        " AND cd.c_diary_id = cdc.c_diary_id";
740    $params = array(intval($c_member_id));
741    return db_get_col($sql, $params);
742}
743
744/**
745 * 新着日記検索
746 * 検索ポイントはタイトル、本文
747 * 空白(全角半角問わない)でand検索可
748 */
749function p_h_diary_list_all_search_c_diary4c_diary($keyword, $page_size, $page, $c_member_id = '')
750{
751    $params = array();
752
753    $select = 'SELECT *';
754    $from = ' FROM c_diary';
755
756    //自分の日記だけを対象にする事も出来る
757    if ($c_member_id) {
758        $where = ' WHERE c_member_id = ?';
759        $params[] = intval($c_member_id);
760    } else {
761        $where = " WHERE public_flag = 'public'";
762    }
763
764    //and検索を実装
765    //subject,body を検索
766    if ($keyword) {
767        //全角空白を半角に統一
768        $keyword = str_replace(' ', ' ', $keyword);
769
770        $keyword_list = explode(' ', $keyword);
771        foreach ($keyword_list as $word) {
772            $word = check_search_word($word);
773
774            $where .= ' AND (subject LIKE ? OR body LIKE ?)';
775            $params[] = '%'.$word.'%';
776            $params[] = '%'.$word.'%';
777        }
778    }
779    $order = " ORDER BY r_datetime DESC";
780
781    $sql = $select . $from . $where . $order;
782
783    $list = db_get_all_page($sql, $page, $page_size, $params);
784    foreach ($list as $key => $value) {
785        $list[$key]['c_member'] = db_common_c_member_with_profile($value['c_member_id']);
786        $list[$key]['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
787    }
788
789    $sql = 'SELECT COUNT(*)' . $from . $where;
790    $total_num = db_get_one($sql, $params);
791
792    if ($total_num != 0) {
793        $total_page_num =  ceil($total_num / $page_size);
794        if ($page >= $total_page_num) {
795            $next = false;
796        } else {
797            $next = true;
798        }
799        if ($page <= 1) {
800            $prev = false;
801        } else {
802            $prev = true;
803        }
804    }
805    return array($list , $prev , $next, $total_num);
806}
807
808/**
809 * 指定された年月に日記を書いている日のリストを返す
810 */
811function p_h_diary_is_diary_written_list4date($year, $month, $c_member_id, $u = null)
812{
813    include_once 'Date/Calc.php';
814
815    $pf_cond = db_diary_public_flag_condition($c_member_id, $u);
816   
817    if ($GLOBALS['_OPENPNE_DSN_LIST']['main']['dsn']['phptype'] == 'pgsql') {
818        $sql = "SELECT DISTINCT date_part('day', r_datetime) FROM c_diary" .
819               " WHERE c_member_id = ? AND r_datetime >= ? AND r_datetime < ?" . $pf_cond;
820    } else {
821        $sql = 'SELECT DISTINCT DAYOFMONTH(r_datetime) FROM c_diary' .
822               ' WHERE c_member_id = ? AND r_datetime >= ? AND r_datetime < ?' . $pf_cond;
823    }
824
825    $date_format = '%Y-%m-%d 00:00:00';
826    $thismonth = Date_Calc::beginOfMonth($month, $year, $date_format);
827    $nextmonth = Date_Calc::beginOfNextMonth(0, $month, $year, $date_format);
828
829    $params = array(intval($c_member_id), $thismonth, $nextmonth);
830
831    return db_get_col($sql, $params);
832}
833
834/**
835 * 日記コメント情報をIDから取得
836 *
837 * @param   int $c_diary_comment_id
838 * @return array
839 *              c_diary_comemnt.*
840 *              c_diary.c_member_id AS c_member_id_author
841 */
842function _do_c_diary_comment4c_diary_comment_id($c_diary_comment_id)
843{
844    $sql = "SELECT dc.*, d.c_member_id AS c_member_id_author";
845    $sql .= " FROM c_diary_comment AS dc, c_diary AS d";
846    $sql .= " WHERE dc.c_diary_comment_id = ?";
847    $sql .= " AND dc.c_diary_id = d.c_diary_id";
848    $params = array(intval($c_diary_comment_id));
849    return db_get_row($sql, $params);
850}
851
852/**
853 * メンバーの最新日記のリストを返す
854 */
855function k_p_f_home_c_diary_list4c_member_id($c_member_id, $limit)
856{
857    //日記リスト
858    $sql = "SELECT c_diary_id, r_date, subject ,image_filename_1";
859    $sql .= " FROM c_diary";
860    $sql .= " WHERE c_member_id = ?";
861    $sql .= " ORDER BY r_date DESC";
862    $params = array(intval($c_member_id));
863    $c_diary_list = db_get_all_limit($sql, 0, $limit, $params);
864
865    //コメント数
866    foreach ($c_diary_list as $key => $value) {
867        $c_diary_id = $value['c_diary_id'];
868
869        $sql = "SELECT COUNT(*) ";
870        $sql .= "FROM c_diary_comment ";
871        $sql .= "WHERE c_diary_id = ?";
872        $params = array(intval($c_diary_id));
873        $c_diary_list[$key]['count_comment'] = db_get_one($sql, $params);
874    }
875    return $c_diary_list;
876}
877
878/**
879 * 最新日記リストを取得。
880 * 取得範囲を指定できる。
881 */
882function k_p_fh_diary_list_c_diary_list4c_member_id($c_member_id, $page_size, $page)
883{
884    $sql = 'SELECT * FROM c_diary WHERE c_member_id = ? ORDER BY r_datetime DESC';
885    $params = array(intval($c_member_id));
886    $c_diary_list = db_get_all_page($sql, $page, $page_size, $params);
887
888    foreach ($c_diary_list as $key => $value) {
889        $c_diary_list[$key]['count_comment'] =
890            db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
891    }
892
893    $sql = 'SELECT COUNT(*) FROM c_diary WHERE c_member_id = ?';
894    $total_num = db_get_one($sql, $params);
895
896    if ($total_num != 0) {
897        $total_page_num =  ceil($total_num / $page_size);
898        if ($page >= $total_page_num) {
899            $next = false;
900        } else {
901            $next = true;
902        }
903        if ($page <= 1) {
904            $prev = false;
905        } else {
906            $prev = true;
907        }
908    }
909    return array($c_diary_list , $prev , $next);
910}
911
912/**
913 * 日記へのコメントリストを取得
914 */
915function k_p_fh_diary_c_diary_comment_list4c_diary_id($c_diary_id, $page_size, $page)
916{
917    $sql = 'SELECT * FROM c_diary_comment WHERE c_diary_id = ? ORDER BY r_datetime DESC';
918    $params = array(intval($c_diary_id));
919    $c_diary_comment_list = db_get_all_page($sql, $page, $page_size, $params);
920
921    foreach ($c_diary_comment_list as $key => $value) {
922        $c_member = db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
923        $c_diary_comment_list[$key]['nickname'] = $c_member['nickname'];
924    }
925
926    $sql = "SELECT COUNT(*) FROM c_diary_comment WHERE c_diary_id = ?";
927    $params = array(intval($c_diary_id));
928    $total_num = db_get_one($sql, $params);
929
930    if ($total_num > 0) {
931        $total_page_num =  ceil($total_num / $page_size);
932        if ($page >= $total_page_num) {
933            $next = false;
934        } else {
935            $next = true;
936        }
937        if ($page <= 1) {
938            $prev = false;
939        } else {
940            $prev = true;
941        }
942    }
943    return array($c_diary_comment_list , $prev , $next, $total_num, $total_page_num);
944}
945
946/**
947 * 日記IDからその日記を書いたメンバーIDとニックネームと日記公開範囲を得る
948 */
949function k_p_fh_diary_c_member4c_diary_id($c_diary_id)
950{
951    $sql = "SELECT cm.c_member_id, cm.nickname,cm. public_flag_diary ";
952    $sql .= " FROM c_member AS cm, c_diary AS cd ";
953    $sql .= " WHERE cd.c_diary_id = ?";
954    $sql .= " AND cm.c_member_id=cd.c_member_id";
955    $params = array(intval($c_diary_id));
956    return db_get_row($sql, $params);
957}
958
959/**
960 * フレンドの最新日記リスト
961 */
962function k_p_h_diary_list_friend_h_diary_list_friend4c_member_id($c_member_id, $page_size, $page)
963{
964    $from = "c_diary, c_friend";
965    $where = "c_friend.c_member_id_from = ?" .
966            " AND c_diary.c_member_id = c_friend.c_member_id_to";
967
968    $sql = "SELECT c_diary.* FROM {$from} WHERE {$where}" .
969            " ORDER BY c_diary.r_datetime DESC";
970    $params = array(intval($c_member_id));
971    $lst = db_get_all_page($sql, $page, $page_size, $params);
972
973    foreach ($lst as $key=>$value) {
974        $lst[$key]['count_comments'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
975        $lst[$key]['c_member'] = db_common_c_member4c_member_id($value['c_member_id']);
976    }
977
978    $sql = "SELECT count(*) FROM {$from} WHERE {$where}";
979    $total_num = db_get_one($sql, $params);
980
981    if ($total_num != 0) {
982        $total_page_num =  ceil($total_num / $page_size);
983        if ($page >= $total_page_num) {
984            $next = false;
985        } else {
986            $next = true;
987        }
988
989        if ($page <= 1) {
990            $prev = false;
991        } else {
992            $prev = true;
993        }
994    }
995
996    return array($lst, $prev, $next, $total_num);
997}
998
999//--- diary
1000
1001/**
1002 * 日記を追加
1003 */
1004function db_diary_insert_c_diary($c_member_id, $subject, $body, $public_flag)
1005{
1006    //function cacheの削除
1007    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_member_id, 5);
1008
1009    $data = array(
1010        'c_member_id' => intval($c_member_id),
1011        'subject' => $subject,
1012        'body' => $body,
1013        'public_flag' => util_cast_public_flag_diary($public_flag),
1014        'r_datetime' => db_now(),
1015        'r_date' => db_now(),
1016        'u_datetime' => db_now(),
1017        'is_checked' => 1,
1018        'image_filename_1' => '',
1019        'image_filename_2' => '',
1020        'image_filename_3' => '',
1021    );
1022    return db_insert('c_diary', $data);
1023}
1024
1025/**
1026 * 日記を編集
1027 */
1028function db_diary_update_c_diary($c_diary_id, $subject, $body, $public_flag,
1029    $image_filename_1 = '', $image_filename_2 = '', $image_filename_3 = '')
1030{
1031    //function cacheの削除
1032    $c_diary = db_diary_get_c_diary4id($c_diary_id);
1033    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_diary['c_member_id'], 5);
1034
1035    $data = array(
1036        'subject' => $subject,
1037        'body' => $body,
1038        'public_flag' => util_cast_public_flag_diary($public_flag),
1039        'u_datetime' => db_now(),
1040    );
1041    if ($image_filename_1) $data['image_filename_1'] = $image_filename_1;
1042    if ($image_filename_2) $data['image_filename_2'] = $image_filename_2;
1043    if ($image_filename_3) $data['image_filename_3'] = $image_filename_3;
1044
1045    $where = array(
1046        'c_diary_id' => intval($c_diary_id),
1047    );
1048    return db_update('c_diary', $data, $where);
1049}
1050
1051/**
1052 * 日記削除
1053 * コメント、画像も削除
1054 *
1055 * @param int $c_diary_id
1056 */
1057function db_diary_delete_c_diary($c_diary_id)
1058{
1059     //function cacheの削除
1060    $c_diary = db_diary_get_c_diary4id($c_diary_id);
1061    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_diary['c_member_id'], 5);
1062
1063   // 画像
1064    image_data_delete($c_diary['image_filename_1']);
1065    image_data_delete($c_diary['image_filename_2']);
1066    image_data_delete($c_diary['image_filename_3']);
1067
1068    // コメント
1069    $sql = 'SELECT image_filename_1, image_filename_2, image_filename_3 FROM c_diary_comment WHERE c_diary_id =?';
1070    $params = array(intval($c_diary_id));
1071    $comment_images = db_get_all($sql, $params);
1072
1073    //カテゴリ
1074    db_diary_category_delete_c_diary_category_diary($c_diary_id);
1075
1076    foreach ($comment_images as $value) {
1077        image_data_delete($value['image_filename_1']);
1078        image_data_delete($value['image_filename_2']);
1079        image_data_delete($value['image_filename_3']);
1080    }
1081
1082    $sql = 'DELETE FROM c_diary_comment WHERE c_diary_id = ?';
1083    db_query($sql, $params);
1084
1085    // 日記
1086    $sql = 'DELETE FROM c_diary WHERE c_diary_id = ?';
1087    db_query($sql, $params);
1088}
1089
1090/**
1091 * 指定した番号の日記画像を削除
1092 */
1093function db_diary_delete_c_diary_image($c_diary_id, $image_num)
1094{
1095    $data = array(
1096        'image_filename_'.intval($image_num) => '',
1097    );
1098    $where = 'c_diary_id = '.intval($c_diary_id);
1099    return db_update('c_diary', $data, $where);
1100}
1101
1102/**
1103 * 日記に画像を追加する
1104 */
1105function db_diary_update_c_diary_image_filename($c_diary_id, $image_filename, $image_num)
1106{
1107    $data = array(
1108        'image_filename_'.intval($image_num) => $image_filename,
1109    );
1110    $where = 'c_diary_id = '.intval($c_diary_id);
1111    return db_update('c_diary', $data, $where);
1112}
1113
1114/**
1115 * 日記の未読/既読を変更
1116 * c_diary.is_checkedを更新
1117 */
1118function db_diary_update_c_diary_is_checked($c_diary_id, $value)
1119{
1120    $data = array(
1121        'is_checked' => (bool)$value,
1122    );
1123    $where = 'c_diary_id = '.intval($c_diary_id);
1124    return db_update('c_diary', $data, $where);
1125}
1126
1127//--- diary_comment
1128
1129/**
1130 * 日記コメント追加
1131 *
1132 * @param  int    $c_member_id
1133 * @param  int    $c_diary_id
1134 * @param  string $body
1135 * @return int    insert_id
1136 */
1137function db_diary_insert_c_diary_comment($c_member_id, $c_diary_id, $body)
1138{
1139    //function cache削除
1140    pne_cache_drop('p_h_home_c_diary_my_comment_list4c_member_id', $c_member_id, 5);
1141
1142    $data = array(
1143        'c_member_id' => intval($c_member_id),
1144        'c_diary_id' => intval($c_diary_id),
1145        'body' => $body,
1146        'r_datetime' => db_now(),
1147        'image_filename_1' => '',
1148        'image_filename_2' => '',
1149        'image_filename_3' => '',
1150        'number' => db_diary_get_max_number4diary($c_diary_id)+1,
1151    );
1152    return db_insert('c_diary_comment', $data);
1153}
1154
1155/**
1156 * 日記コメント用画像追加
1157 */
1158function db_diary_insert_c_diary_comment_images($c_diary_comment_id, $image_filename_1 = '', $image_filename_2 = '', $image_filename_3 = '')
1159{
1160    $data = array();
1161    if ($image_filename_1) $data['image_filename_1'] = $image_filename_1;
1162    if ($image_filename_2) $data['image_filename_2'] = $image_filename_2;
1163    if ($image_filename_3) $data['image_filename_3'] = $image_filename_3;
1164
1165    $where = array(
1166        'c_diary_comment_id' => intval($c_diary_comment_id),
1167    );
1168    return db_update('c_diary_comment', $data, $where);
1169}
1170
1171/**
1172 * 日記コメント削除
1173 *
1174 * @param   int $c_diary_comment_id
1175 * @param   int $u  : 削除しようとしている人の c_member_id
1176 */
1177function db_diary_delete_c_diary_comment($c_diary_comment_id, $u)
1178{
1179    $dc = _do_c_diary_comment4c_diary_comment_id($c_diary_comment_id);
1180    if ($dc['c_member_id'] != $u && $dc['c_member_id_author'] != $u) {
1181        return false;
1182    }
1183
1184    image_data_delete($dc['image_filename_1']);
1185    image_data_delete($dc['image_filename_2']);
1186    image_data_delete($dc['image_filename_3']);
1187
1188    $sql = 'DELETE FROM c_diary_comment WHERE c_diary_comment_id = ?';
1189    $params = array(intval($c_diary_comment_id));
1190    return db_query($sql, $params);
1191}
1192
1193// 日記公開範囲の一括設定をする
1194function db_diary_update_public_flag_diary_all($c_member_id, $public_flag)
1195{
1196    $data = array(
1197        'public_flag' => util_cast_public_flag_diary($public_flag),
1198    );
1199
1200    $where = array(
1201        'c_member_id' => intval($c_member_id),
1202    );
1203    return db_update('c_diary', $data, $where);
1204}
1205
1206/**
1207 * 現在の日記へのコメントのナンバーの最大値を返す
1208 */
1209function db_diary_get_max_number4diary($c_diary_id)
1210{
1211    $sql = 'SELECT MAX(number) FROM c_diary_comment WHERE c_diary_id = ?';
1212    $params = array(intval($c_diary_id));
1213    return db_get_one($sql, $params);
1214}
1215
1216?>
Note: See TracBrowser for help on using the repository browser.