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

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

Last change on this file since 5998 was 5998, checked in by ogawa, 14 years ago

#2081:一人もマイフレンドがいない状態で日記コメント記入履歴の「もっと読む」をクリックすると「記入したコメントはありません」と表示されていたのを修正

File size: 39.1 KB
Line 
1<?php
2/**
3 * @copyright 2005-2008 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/**
260 * 指定した日記の前の日記IDを取得する
261 *
262 * @param int $c_member_id
263 * @param int $c_diary_id
264 */
265function db_diary_c_diary_id_prev4c_diary_id($c_member_id, $c_diary_id, $u = null)
266{
267    $public_flag_condition = db_diary_public_flag_condition($c_member_id, $u);
268    $sql = 'SELECT c_diary_id FROM c_diary WHERE c_member_id = ? AND c_diary_id < ?'
269         . $public_flag_condition . ' ORDER BY c_diary_id DESC';
270    return db_get_one($sql, array(intval($c_member_id), intval($c_diary_id)));
271}
272
273/**
274 * 指定した日記の次の日記IDを取得する
275 *
276 * @param int $c_member_id
277 * @param int $c_diary_id
278 */
279function db_diary_c_diary_id_next4c_diary_id($c_member_id, $c_diary_id, $u = null)
280{
281    $public_flag_condition = db_diary_public_flag_condition($c_member_id, $u);
282    $sql = 'SELECT c_diary_id FROM c_diary WHERE c_member_id = ? AND c_diary_id > ?'
283         . $public_flag_condition . ' ORDER BY c_diary_id ASC';
284    return db_get_one($sql, array(intval($c_member_id), intval($c_diary_id)));
285}
286
287//// c_diary_comment
288
289/**
290 * 日記のコメントリストを得る
291 *
292 * @param   int $c_diary_id
293 * @param   int $limit
294 * @return  array 日記コメント+ニックネーム
295 */
296function db_diary_get_c_diary_comment_list4c_diary_id($c_diary_id)
297{
298    $sql = 'SELECT c_member.nickname, c_diary_comment.*' .
299        ' FROM c_diary_comment LEFT JOIN c_member USING (c_member_id)' .
300        ' WHERE c_diary_id = ?' .
301        ' ORDER BY c_diary_comment.r_datetime';
302    return db_get_all($sql, array(intval($c_diary_id)));
303}
304
305/**
306 * 日記のコメントリスト(好きなID(複数))を取得
307 *
308 * @param   array $id_list
309 * @param   int   $page
310 * @param   int   $page_size
311 * @param   bool  $desc  並び順を日時の新しい順にするかどうか
312 * @return  日記コメント(+ニックネーム)リスト
313 */
314function db_diary_get_c_diary_comment_list4id_list($id_list, $page = 1, $page_size= -1, $desc = false)
315{
316    if (!count($id_list)) return array();
317    if ($page_size < 0) {
318        $page_size = count($id_list);
319    }
320    $e_id_list = implode(',', array_map('intval', (array)$id_list));
321
322    $sql = 'SELECT * FROM c_diary_comment' .
323            ' WHERE c_diary_comment_id IN ('.$e_id_list.')';
324    if ($desc) {
325        $sql .= ' ORDER BY r_datetime DESC';
326    } else {
327        $sql .= ' ORDER BY r_datetime';
328    }
329    $c_diary_comment_list = db_get_all_page($sql, $page, $page_size);
330    foreach ($c_diary_comment_list as $key => $value) {
331        $c_member = db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
332        $c_diary_comment_list[$key]['nickname'] = $c_member['nickname'];
333    }
334
335    $sql = 'SELECT COUNT(*) FROM c_diary_comment' .
336        ' WHERE c_diary_comment_id IN ('.$e_id_list.')';
337    $total_num = db_get_one($sql);
338
339    if ($total_num != 0) {
340        $total_page_num = ceil($total_num / $page_size);
341        if ($page >= $total_page_num) {
342            $next = false;
343        } else {
344            $next = true;
345        }
346
347        if ($page <= 1) {
348            $prev = false;
349        } else {
350            $prev = true;
351        }
352    }
353
354    return array($c_diary_comment_list, $prev , $next, $total_num);
355}
356
357/**
358 * 日記のコメント数を取得
359 *
360 * @param int $c_diary_id
361 * @return int コメント数
362 */
363function db_diary_count_c_diary_comment4c_diary_id($c_diary_id)
364{
365    $sql = 'SELECT COUNT(*) FROM c_diary_comment WHERE c_diary_id = ?';
366    return db_get_one($sql, array(intval($c_diary_id)));
367}
368
369////
370
371/**
372 * あるメンバーの日記リストを取得
373 *
374 * @param int $c_member_id target c_member_id
375 * @param int $page_size
376 * @param int $page
377 * @param int $u viewer's c_member_id
378 * @return array 日記リスト
379 */
380function p_fh_diary_list_diary_list4c_member_id($c_member_id, $page_size, $page, $u = null)
381{
382    $pf_cond = db_diary_public_flag_condition($c_member_id, $u);
383    $sql = 'SELECT * FROM c_diary WHERE c_member_id = ?' . $pf_cond .
384           ' ORDER BY r_datetime DESC';
385    $params = array(intval($c_member_id));
386    $list = db_get_all_page($sql, $page, $page_size, $params);
387
388    foreach ($list as $key => $c_diary) {
389        $list[$key]['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($c_diary['c_diary_id']);
390    }
391
392    $sql = 'SELECT COUNT(*) FROM c_diary WHERE c_member_id = ?' . $pf_cond;
393    $total_num = db_get_one($sql, $params);
394
395    if ($total_num != 0) {
396        $total_page_num =  ceil($total_num / $page_size);
397        if ($page >= $total_page_num) {
398            $next = false;
399        } else {
400            $next = true;
401        }
402
403        if ($page <= 1) {
404            $prev = false;
405        } else {
406            $prev = true;
407        }
408    }
409    return array($list, $prev, $next, $total_num);
410}
411
412/**
413 * フレンドの最新日記リスト
414 */
415function p_h_diary_list_friend_h_diary_list_friend4c_member_id($c_member_id, $page_size, $page)
416{
417    $friends = db_friend_c_member_id_list($c_member_id, true);
418    if (!$friends) {
419        return array(array(), false, false, 0);
420    }
421    $ids = implode(',', array_map('intval', $friends));
422
423    $hint = db_mysql_hint('USE INDEX (r_datetime_c_member_id, r_datetime)');
424    $sql = 'SELECT * FROM c_diary' . $hint .
425            ' WHERE c_member_id IN (' . $ids . ')' .
426            ' AND public_flag <> \'private\'' .
427            ' ORDER BY c_diary.r_datetime DESC';
428
429    $lst = db_get_all_page($sql, $page, $page_size);
430
431    foreach ($lst as $key=>$value) {
432        $lst[$key]['count_comments'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
433        $lst[$key]['c_member'] = db_common_c_member4c_member_id($value['c_member_id']);
434    }
435
436    $sql = 'SELECT count(*) FROM c_diary' .
437           ' WHERE c_member_id IN (' . $ids . ')' .
438           ' AND public_flag <> \'private\'';
439    $total_num = db_get_one($sql, $params);
440
441    if ($total_num != 0) {
442        $total_page_num =  ceil($total_num / $page_size);
443        if ($page >= $total_page_num) {
444            $next = false;
445        } else {
446            $next = true;
447        }
448
449        if ($page <= 1) {
450            $prev = false;
451        } else {
452            $prev = true;
453        }
454    }
455
456    return array($lst, $prev, $next, $total_num);
457}
458
459/**
460 * 未読コメントのある日記の数を数える
461 *
462 * @param int $c_member_id
463 * @return int 未読日記数
464 */
465function p_h_diary_count_c_diary_not_is_read4c_member_id($c_member_id)
466{
467    $sql = 'SELECT COUNT(*) FROM c_diary WHERE c_member_id = ? AND is_checked = 0';
468    $params = array(intval($c_member_id));
469    return db_get_one($sql, $params);
470}
471
472/**
473 * 未読コメントのある日記のうちもっとも古い日記IDを返す
474 *
475 * @param int $c_member_id
476 * @return int c_diary_id
477 */
478function p_h_diary_c_diary_first_diary_read4c_member_id($c_member_id)
479{
480    $sql = 'SELECT c_diary_id FROM c_diary WHERE c_member_id = ? AND is_checked = 0 ORDER BY r_datetime';
481    $params = array(intval($c_member_id));
482    return db_get_one($sql, $params);
483}
484
485/**
486 * フレンド最新日記リスト取得
487 * 日記公開範囲を考慮
488 *
489 * @param   int $c_member_id
490 * @param   int $limit
491 * @return  array_of_array  (c_diary.*, nickname)
492 */
493function p_h_home_c_diary_friend_list4c_member_id($c_member_id, $limit)
494{
495    static $is_recurred = false;  //再帰処理中かどうかの判定フラグ
496
497    if (!$is_recurred) {  //function cacheのために再帰処理を行う
498        $is_recurred = true;
499        $funcargs = func_get_args();
500        return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_FAST, __FUNCTION__, $funcargs);
501    }
502
503    $is_recurred = false;
504
505    $friends = db_friend_c_member_id_list($c_member_id, true);
506    if (!$friends) {
507        return array();
508    }
509    $ids = implode(',', array_map('intval', $friends));
510
511    $hint = db_mysql_hint('USE INDEX (r_datetime_c_member_id, r_datetime)');
512    $sql = 'SELECT * FROM c_diary' . $hint .
513            ' WHERE c_member_id IN (' . $ids . ')' .
514            ' AND public_flag <> \'private\'' .
515            ' ORDER BY c_diary.r_datetime DESC';
516
517    $c_diary_friend_list = db_get_all_limit($sql, 0, $limit);
518
519    foreach ($c_diary_friend_list as $key => $value) {
520        $c_member = db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
521        $c_diary_friend_list[$key]['nickname'] = $c_member['nickname'];
522        $c_diary_friend_list[$key]['count_comments'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
523    }
524    return $c_diary_friend_list;
525}
526
527/**
528 * 日記コメント記入履歴取得
529 *
530 * @param   int $c_member_id
531 * @param   int $limit
532 * @return  array_of_array  (c_diary.*, nickname)
533 */
534function p_h_home_c_diary_my_comment_list4c_member_id($c_member_id, $limit)
535{
536    static $is_recurred = false;  //再帰処理中かどうかの判定フラグ
537
538    if (!$is_recurred) {  //function cacheのために再帰処理を行う
539        $is_recurred = true;
540        $funcargs = func_get_args();
541        return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_FAST, __FUNCTION__, $funcargs);
542    }
543
544    $is_recurred = false;
545
546    $date = date('Y-m-d 00:00:00', strtotime('-15 days'));
547
548    $blocked = db_member_access_block_list4c_member_id_to($c_member_id);
549    $blocked[] = $c_member_id;
550    $except_ids = implode(',', $blocked);
551
552    $sql = 'SELECT c_diary_comment.c_diary_id' .
553            ' FROM c_diary_comment INNER JOIN c_diary USING (c_diary_id)' .
554            ' WHERE c_diary_comment.c_member_id = ?' .
555            ' AND c_diary_comment.r_datetime > ?' .
556            ' AND c_diary.c_member_id NOT IN (' . $except_ids . ')' .
557            ' AND c_diary.public_flag <> \'private\'';
558    $params = array(intval($c_member_id), $date);
559    $c_diary_id_list = db_get_col($sql, $params);
560    $c_diary_id_list = array_unique($c_diary_id_list);
561    if (!$c_diary_id_list) {
562        return array();
563    }
564
565    $ids = implode(',', $c_diary_id_list);
566    $sql = 'SELECT c_diary_id, MAX(r_datetime) as maxdate' .
567           ' FROM c_diary_comment' .
568           ' WHERE c_diary_id IN (' . $ids . ')' .
569           ' GROUP BY c_diary_id' .
570           ' ORDER BY maxdate DESC';
571    $list = db_get_assoc_limit($sql, 0, $limit);
572
573    $result = array();
574    foreach ($list as $c_diary_id => $r_datetime) {
575        $item = db_diary_get_c_diary4id($c_diary_id);
576        if ($item['public_flag'] == 'friend' && !db_friend_is_friend($c_member_id, $item['c_member_id'])) {
577            continue;
578        }
579        $item += db_common_c_member4c_member_id_LIGHT($item['c_member_id']);
580        $item['r_datetime'] = $r_datetime;
581        $item['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($c_diary_id);
582        $result[] = $item;
583    }
584    return $result;
585}
586
587function p_h_diary_comment_list_c_diary_my_comment_list4c_member_id($c_member_id, $page, $page_size)
588{
589    $blocked = db_member_access_block_list4c_member_id_to($c_member_id);
590    $blocked[] = $c_member_id;
591    $except_ids = implode(',', $blocked);
592
593    $friends = db_friend_c_member_id_list($c_member_id);
594    $friend_ids = implode(',', $friends);
595
596    if ($GLOBALS['_OPENPNE_DSN_LIST']['main']['dsn']['phptype'] == 'pgsql') {
597        $sql = 'SELECT d.c_diary_id' .
598                ', d.subject' .
599                ', d.c_member_id' .
600                ', sub_diary_tbl.r_datetime' .
601                ', sub_diary_tbl.num_comment' .
602            ' FROM c_diary AS d' .
603                ', ( SELECT dc.c_diary_id' .
604                        ', MAX(dc.r_datetime) AS r_datetime' .
605                        ', COUNT(DISTINCT dc.c_diary_comment_id) AS num_comment' .
606                    ' FROM c_diary AS d' .
607                        ' INNER JOIN c_diary_comment AS dc USING (c_diary_id)' .
608                        ', c_diary_comment AS mydc' .
609                    ' WHERE mydc.c_member_id = ?' .
610                        ' AND mydc.c_diary_id = d.c_diary_id' .
611                        ' AND mydc.c_member_id <> d.c_member_id' .
612                        ' AND d.c_member_id NOT IN (' . $except_ids . ')' .
613                        ' AND (d.public_flag = \'public\'';
614        if ($friend_ids) {
615            $sql .= ' OR (d.public_flag = \'friend\' AND d.c_member_id IN (' . $friend_ids . '))';
616        }
617        $sql .= ')' .
618                    ' GROUP BY dc.c_diary_id' .
619                ') as sub_diary_tbl' .
620            ' WHERE' .
621                ' sub_diary_tbl.c_diary_id = d.c_diary_id' .
622            ' ORDER BY r_datetime DESC';
623    } else {
624        $sql = 'SELECT d.c_diary_id' .
625                ', d.subject' .
626                ', d.c_member_id' .
627                ', MAX(dc.r_datetime) AS r_datetime' .
628                ', COUNT(DISTINCT dc.c_diary_comment_id) AS num_comment' .
629            ' FROM c_diary AS d' .
630                ' INNER JOIN c_diary_comment AS dc USING (c_diary_id)' .
631                ', c_diary_comment AS mydc' .
632            ' WHERE mydc.c_member_id = ?' .
633                ' AND mydc.c_diary_id = d.c_diary_id' .
634                ' AND mydc.c_member_id <> d.c_member_id' .
635                ' AND d.c_member_id NOT IN (' . $except_ids . ')' .
636                ' AND (d.public_flag = \'public\'';
637        if ($friend_ids) {
638            $sql .= ' OR (d.public_flag = \'friend\' AND d.c_member_id IN (' . $friend_ids . '))';
639        }
640        $sql .= ')' .
641            ' GROUP BY dc.c_diary_id' .
642            ' ORDER BY r_datetime DESC';
643    }
644
645    $params = array(intval($c_member_id));
646    $list = db_get_all_page($sql, $page, $page_size, $params);
647
648    foreach ($list as $key => $value) {
649        $list[$key] += db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
650    }
651
652    $sql = 'SELECT COUNT(DISTINCT d.c_diary_id)' .
653        ' FROM c_diary AS d' .
654            ' INNER JOIN c_diary_comment AS dc USING (c_diary_id)' .
655            ', c_diary_comment AS mydc' .
656        ' WHERE mydc.c_member_id = ?' .
657            ' AND mydc.c_diary_id = d.c_diary_id' .
658            ' AND mydc.c_member_id <> d.c_member_id' .
659            ' AND d.c_member_id NOT IN (' . $except_ids . ')' .
660            ' AND (d.public_flag = \'public\'';
661    if ($friend_ids) {
662        $sql .= ' OR (d.public_flag = \'friend\' AND d.c_member_id IN (' . $friend_ids . '))';
663    }
664    $sql .= ')';
665 
666    $total_num = db_get_one($sql, $params);
667
668    $is_prev = false;
669    $is_next = false;
670    if ($total_num) {
671        $is_prev = (bool)($page > 1);
672        $is_next = (bool)($page < ceil($total_num / $page_size));
673    }
674    return array($list, $is_prev, $is_next, $total_num);
675}
676
677/**
678 * あるメンバーの指定された年月日の日記のリストを得る
679 */
680function p_fh_diary_list_diary_list_date4c_member_id($c_member_id, $page_size, $page, $year, $month, $day=0 ,$u = null)
681{
682    if ($day) {
683        $s_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day, $year));
684        $e_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day+1, $year));
685    } else {
686        $s_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, 1, $year));
687        $e_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month+1, 1, $year));
688    }
689
690    $pf_cond = db_diary_public_flag_condition($c_member_id, $u);
691    $where = ' WHERE c_member_id = ? AND r_datetime >= ? AND r_datetime < ?';
692    $sql = 'SELECT * FROM c_diary' .
693            $where . $pf_cond .
694            ' ORDER BY r_datetime DESC';
695    $params = array(intval($c_member_id), $s_date, $e_date);
696    $list = db_get_all_limit($sql, $page_size * ($page - 1), $page_size, $params);
697
698    foreach ($list as $key => $c_diary) {
699        $list[$key]['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($c_diary['c_diary_id']);
700    }
701
702    $sql = 'SELECT COUNT(*) FROM c_diary' . $where;
703    $total_num = db_get_one($sql, $params);
704
705    if ($total_num != 0) {
706        $total_page_num =  ceil($total_num / $page_size);
707        if ($page >= $total_page_num) {
708            $next = false;
709        } else {
710            $next = true;
711        }
712        if ($page <= 1) {
713            $prev = false;
714        } else {
715            $prev = true;
716        }
717    }
718    return array($list , $prev , $next, $total_num);
719}
720
721/**
722 * 日記ページの「各月の日記」用
723 *
724 * 日記を最初に書いた月からスタートしてみる
725 */
726function p_fh_diary_list_date_list4c_member_id($c_member_id)
727{
728    $sql = "SELECT r_datetime FROM c_diary" .
729        " WHERE c_member_id = ?" .
730        " ORDER BY r_datetime";
731    $params = array(intval($c_member_id));
732    if (!$first_datetime = db_get_one($sql, $params)) {
733        return array();
734    }
735
736    $start_date = getdate(strtotime($first_datetime));
737    $end_date =  getdate();
738
739    $date = array();
740    $year = $start_date['year'];
741    $month = $start_date['mon'];
742    while (1) {
743        $date[] =  array(
744            'year' => $year,
745            'month' => $month,
746        );
747
748        if ($end_date['year'] <= $year
749            && $end_date['mon'] <= $month) {
750            break;
751        }
752
753        $month++;
754        if ($month > 12) {
755            $month = 1;
756            $year++;
757        }
758    }
759    return array_reverse($date);
760}
761
762//c_member_id から自分の日記についてるコメントID(複数)を取得
763function p_fh_diary_c_diary_comment_id_list4c_member_id($c_member_id)
764{
765    $sql = "SELECT cdc.c_diary_comment_id FROM c_diary as cd,c_diary_comment as cdc" .
766        " WHERE cd.c_member_id = ?".
767        " AND cd.c_diary_id = cdc.c_diary_id";
768    $params = array(intval($c_member_id));
769    return db_get_col($sql, $params);
770}
771
772/**
773 * 年月 から日記のある日(複数)を取得
774 */
775function p_fh_diary_list_calendar_list4c_member_id($year, $month, $c_member_id)
776{
777    $sql = "SELECT cdc.c_diary_comment_id FROM c_diary as cd,c_diary_comment as cdc" .
778        " WHERE cd.c_member_id = ?".
779        " AND cd.c_diary_id = cdc.c_diary_id";
780    $params = array(intval($c_member_id));
781    return db_get_col($sql, $params);
782}
783
784/**
785 * 新着日記検索
786 * 検索ポイントはタイトル、本文
787 * 空白(全角半角問わない)でand検索可
788 */
789function p_h_diary_list_all_search_c_diary4c_diary($keyword, $page_size, $page, $c_member_id = '')
790{
791    $params = array();
792
793    $select = 'SELECT *';
794    $from = ' FROM c_diary';
795
796    //自分の日記だけを対象にする事もできる
797    if ($c_member_id) {
798        $where = ' WHERE c_member_id = ?';
799        $params[] = intval($c_member_id);
800    } else {
801        $where = " WHERE public_flag = 'public'";
802    }
803
804    //and検索を実装
805    //subject,body を検索
806    if ($keyword) {
807        //全角空白を半角に統一
808        $keyword = str_replace(' ', ' ', $keyword);
809
810        $keyword_list = explode(' ', $keyword);
811        foreach ($keyword_list as $word) {
812            $word = check_search_word($word);
813
814            $where .= ' AND (subject LIKE ? OR body LIKE ?)';
815            $params[] = '%'.$word.'%';
816            $params[] = '%'.$word.'%';
817        }
818    }
819    $order = " ORDER BY r_datetime DESC";
820
821    $sql = $select . $from . $where . $order;
822
823    $list = db_get_all_page($sql, $page, $page_size, $params);
824    foreach ($list as $key => $value) {
825        $list[$key]['c_member'] = db_common_c_member_with_profile($value['c_member_id']);
826        $list[$key]['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
827    }
828
829    $sql = 'SELECT COUNT(*)' . $from . $where;
830    $total_num = db_get_one($sql, $params);
831
832    if ($total_num != 0) {
833        $total_page_num =  ceil($total_num / $page_size);
834        if ($page >= $total_page_num) {
835            $next = false;
836        } else {
837            $next = true;
838        }
839        if ($page <= 1) {
840            $prev = false;
841        } else {
842            $prev = true;
843        }
844    }
845    return array($list , $prev , $next, $total_num);
846}
847
848/**
849 * 指定された年月に日記を書いている日のリストを返す
850 */
851function p_h_diary_is_diary_written_list4date($year, $month, $c_member_id, $u = null)
852{
853    include_once 'Date/Calc.php';
854
855    $pf_cond = db_diary_public_flag_condition($c_member_id, $u);
856   
857    if ($GLOBALS['_OPENPNE_DSN_LIST']['main']['dsn']['phptype'] == 'pgsql') {
858        $sql = "SELECT DISTINCT date_part('day', r_datetime) FROM c_diary" .
859               " WHERE c_member_id = ? AND r_datetime >= ? AND r_datetime < ?" . $pf_cond;
860    } else {
861        $sql = 'SELECT DISTINCT DAYOFMONTH(r_datetime) FROM c_diary' .
862               ' WHERE c_member_id = ? AND r_datetime >= ? AND r_datetime < ?' . $pf_cond;
863    }
864
865    $date_format = '%Y-%m-%d 00:00:00';
866    $thismonth = Date_Calc::beginOfMonth($month, $year, $date_format);
867    $nextmonth = Date_Calc::beginOfNextMonth(0, $month, $year, $date_format);
868
869    $params = array(intval($c_member_id), $thismonth, $nextmonth);
870
871    return db_get_col($sql, $params);
872}
873
874/**
875 * 日記コメント情報をIDから取得
876 *
877 * @param   int $c_diary_comment_id
878 * @return array
879 *              c_diary_comemnt.*
880 *              c_diary.c_member_id AS c_member_id_author
881 */
882function _do_c_diary_comment4c_diary_comment_id($c_diary_comment_id)
883{
884    $sql = "SELECT dc.*, d.c_member_id AS c_member_id_author";
885    $sql .= " FROM c_diary_comment AS dc, c_diary AS d";
886    $sql .= " WHERE dc.c_diary_comment_id = ?";
887    $sql .= " AND dc.c_diary_id = d.c_diary_id";
888    $params = array(intval($c_diary_comment_id));
889    return db_get_row($sql, $params);
890}
891
892/**
893 * メンバーの最新日記のリストを返す
894 */
895function k_p_f_home_c_diary_list4c_member_id($c_member_id, $limit)
896{
897    //日記リスト
898    $sql = "SELECT c_diary_id, r_date, subject ,image_filename_1";
899    $sql .= " FROM c_diary";
900    $sql .= " WHERE c_member_id = ?";
901    $sql .= " ORDER BY r_date DESC";
902    $params = array(intval($c_member_id));
903    $c_diary_list = db_get_all_limit($sql, 0, $limit, $params);
904
905    //コメント数
906    foreach ($c_diary_list as $key => $value) {
907        $c_diary_id = $value['c_diary_id'];
908
909        $sql = "SELECT COUNT(*) ";
910        $sql .= "FROM c_diary_comment ";
911        $sql .= "WHERE c_diary_id = ?";
912        $params = array(intval($c_diary_id));
913        $c_diary_list[$key]['count_comment'] = db_get_one($sql, $params);
914    }
915    return $c_diary_list;
916}
917
918/**
919 * 最新日記リストを取得。
920 * 取得範囲を指定できる。
921 */
922function k_p_fh_diary_list_c_diary_list4c_member_id($c_member_id, $page_size, $page)
923{
924    $sql = 'SELECT * FROM c_diary WHERE c_member_id = ? ORDER BY r_datetime DESC';
925    $params = array(intval($c_member_id));
926    $c_diary_list = db_get_all_page($sql, $page, $page_size, $params);
927
928    foreach ($c_diary_list as $key => $value) {
929        $c_diary_list[$key]['count_comment'] =
930            db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
931    }
932
933    $sql = 'SELECT COUNT(*) FROM c_diary WHERE c_member_id = ?';
934    $total_num = db_get_one($sql, $params);
935
936    if ($total_num != 0) {
937        $total_page_num =  ceil($total_num / $page_size);
938        if ($page >= $total_page_num) {
939            $next = false;
940        } else {
941            $next = true;
942        }
943        if ($page <= 1) {
944            $prev = false;
945        } else {
946            $prev = true;
947        }
948    }
949    return array($c_diary_list , $prev , $next);
950}
951
952/**
953 * 日記へのコメントリストを取得
954 */
955function k_p_fh_diary_c_diary_comment_list4c_diary_id($c_diary_id, $page_size, $page, $desc = true)
956{
957    $sql = 'SELECT * FROM c_diary_comment WHERE c_diary_id = ? ORDER BY r_datetime ';
958    if ($desc) {
959        $sql .= 'DESC';
960    } else {
961        $sql .= 'ASC';
962    }
963    $params = array(intval($c_diary_id));
964    $c_diary_comment_list = db_get_all_page($sql, $page, $page_size, $params);
965
966    foreach ($c_diary_comment_list as $key => $value) {
967        $c_member = db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
968        $c_diary_comment_list[$key]['nickname'] = $c_member['nickname'];
969    }
970
971    $sql = "SELECT COUNT(*) FROM c_diary_comment WHERE c_diary_id = ?";
972    $params = array(intval($c_diary_id));
973    $total_num = db_get_one($sql, $params);
974
975    if ($total_num > 0) {
976        $total_page_num =  ceil($total_num / $page_size);
977        if ($page >= $total_page_num) {
978            $next = false;
979        } else {
980            $next = true;
981        }
982        if ($page <= 1) {
983            $prev = false;
984        } else {
985            $prev = true;
986        }
987    }
988    return array($c_diary_comment_list , $prev , $next, $total_num, $total_page_num);
989}
990
991/**
992 * 日記IDからその日記を書いたメンバーIDとニックネームと日記公開範囲を得る
993 */
994function k_p_fh_diary_c_member4c_diary_id($c_diary_id)
995{
996    $sql = "SELECT cm.c_member_id, cm.nickname,cm. public_flag_diary ";
997    $sql .= " FROM c_member AS cm, c_diary AS cd ";
998    $sql .= " WHERE cd.c_diary_id = ?";
999    $sql .= " AND cm.c_member_id=cd.c_member_id";
1000    $params = array(intval($c_diary_id));
1001    return db_get_row($sql, $params);
1002}
1003
1004/**
1005 * フレンドの最新日記リスト
1006 */
1007function k_p_h_diary_list_friend_h_diary_list_friend4c_member_id($c_member_id, $page_size, $page)
1008{
1009    $from = "c_diary, c_friend";
1010    $where = "c_friend.c_member_id_from = ?" .
1011            " AND c_diary.c_member_id = c_friend.c_member_id_to";
1012
1013    $sql = "SELECT c_diary.* FROM {$from} WHERE {$where}" .
1014            " ORDER BY c_diary.r_datetime DESC";
1015    $params = array(intval($c_member_id));
1016    $lst = db_get_all_page($sql, $page, $page_size, $params);
1017
1018    foreach ($lst as $key=>$value) {
1019        $lst[$key]['count_comments'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
1020        $lst[$key]['c_member'] = db_common_c_member4c_member_id($value['c_member_id']);
1021    }
1022
1023    $sql = "SELECT count(*) FROM {$from} WHERE {$where}";
1024    $total_num = db_get_one($sql, $params);
1025
1026    if ($total_num != 0) {
1027        $total_page_num =  ceil($total_num / $page_size);
1028        if ($page >= $total_page_num) {
1029            $next = false;
1030        } else {
1031            $next = true;
1032        }
1033
1034        if ($page <= 1) {
1035            $prev = false;
1036        } else {
1037            $prev = true;
1038        }
1039    }
1040
1041    return array($lst, $prev, $next, $total_num);
1042}
1043
1044//--- diary
1045
1046/**
1047 * 日記を追加
1048 */
1049function db_diary_insert_c_diary($c_member_id, $subject, $body, $public_flag)
1050{
1051    //function cacheの削除
1052    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_member_id, 5);
1053
1054    $data = array(
1055        'c_member_id' => intval($c_member_id),
1056        'subject' => $subject,
1057        'body' => $body,
1058        'public_flag' => util_cast_public_flag_diary($public_flag),
1059        'r_datetime' => db_now(),
1060        'r_date' => db_now(),
1061        'u_datetime' => db_now(),
1062        'is_checked' => 1,
1063        'image_filename_1' => '',
1064        'image_filename_2' => '',
1065        'image_filename_3' => '',
1066    );
1067    return db_insert('c_diary', $data);
1068}
1069
1070/**
1071 * 日記を編集
1072 */
1073function db_diary_update_c_diary($c_diary_id, $subject, $body, $public_flag,
1074    $image_filename_1 = '', $image_filename_2 = '', $image_filename_3 = '')
1075{
1076    //function cacheの削除
1077    $c_diary = db_diary_get_c_diary4id($c_diary_id);
1078    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_diary['c_member_id'], 5);
1079
1080    $data = array(
1081        'subject' => $subject,
1082        'body' => $body,
1083        'public_flag' => util_cast_public_flag_diary($public_flag),
1084        'u_datetime' => db_now(),
1085    );
1086    if ($image_filename_1) $data['image_filename_1'] = $image_filename_1;
1087    if ($image_filename_2) $data['image_filename_2'] = $image_filename_2;
1088    if ($image_filename_3) $data['image_filename_3'] = $image_filename_3;
1089
1090    $where = array(
1091        'c_diary_id' => intval($c_diary_id),
1092    );
1093    return db_update('c_diary', $data, $where);
1094}
1095
1096/**
1097 * 日記削除
1098 * コメント、画像も削除
1099 *
1100 * @param int $c_diary_id
1101 */
1102function db_diary_delete_c_diary($c_diary_id)
1103{
1104     //function cacheの削除
1105    $c_diary = db_diary_get_c_diary4id($c_diary_id);
1106    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_diary['c_member_id'], 5);
1107
1108   // 画像
1109    image_data_delete($c_diary['image_filename_1']);
1110    image_data_delete($c_diary['image_filename_2']);
1111    image_data_delete($c_diary['image_filename_3']);
1112
1113    // コメント
1114    $sql = 'SELECT image_filename_1, image_filename_2, image_filename_3 FROM c_diary_comment WHERE c_diary_id =?';
1115    $params = array(intval($c_diary_id));
1116    $comment_images = db_get_all($sql, $params);
1117
1118    //カテゴリ
1119    db_diary_category_delete_c_diary_category_diary($c_diary_id);
1120
1121    foreach ($comment_images as $value) {
1122        image_data_delete($value['image_filename_1']);
1123        image_data_delete($value['image_filename_2']);
1124        image_data_delete($value['image_filename_3']);
1125    }
1126
1127    $sql = 'DELETE FROM c_diary_comment WHERE c_diary_id = ?';
1128    db_query($sql, $params);
1129
1130    // 日記
1131    $sql = 'DELETE FROM c_diary WHERE c_diary_id = ?';
1132    db_query($sql, $params);
1133}
1134
1135/**
1136 * 指定した番号の日記画像を削除
1137 */
1138function db_diary_delete_c_diary_image($c_diary_id, $image_num)
1139{
1140    $data = array(
1141        'image_filename_'.intval($image_num) => '',
1142    );
1143    $where = 'c_diary_id = '.intval($c_diary_id);
1144    return db_update('c_diary', $data, $where);
1145}
1146
1147/**
1148 * 日記に画像を追加する
1149 */
1150function db_diary_update_c_diary_image_filename($c_diary_id, $image_filename, $image_num)
1151{
1152    $data = array(
1153        'image_filename_'.intval($image_num) => $image_filename,
1154    );
1155    $where = 'c_diary_id = '.intval($c_diary_id);
1156    return db_update('c_diary', $data, $where);
1157}
1158
1159/**
1160 * 日記の未読/既読を変更
1161 * c_diary.is_checkedを更新
1162 */
1163function db_diary_update_c_diary_is_checked($c_diary_id, $value)
1164{
1165    $data = array(
1166        'is_checked' => (bool)$value,
1167    );
1168    $where = 'c_diary_id = '.intval($c_diary_id);
1169    return db_update('c_diary', $data, $where);
1170}
1171
1172//--- diary_comment
1173
1174/**
1175 * 日記コメント追加
1176 *
1177 * @param  int    $c_member_id
1178 * @param  int    $c_diary_id
1179 * @param  string $body
1180 * @return int    insert_id
1181 */
1182function db_diary_insert_c_diary_comment($c_member_id, $c_diary_id, $body)
1183{
1184    //function cache削除
1185    pne_cache_drop('p_h_home_c_diary_my_comment_list4c_member_id', $c_member_id, 5);
1186
1187    $data = array(
1188        'c_member_id' => intval($c_member_id),
1189        'c_diary_id' => intval($c_diary_id),
1190        'body' => $body,
1191        'r_datetime' => db_now(),
1192        'image_filename_1' => '',
1193        'image_filename_2' => '',
1194        'image_filename_3' => '',
1195        'number' => db_diary_get_max_number4diary($c_diary_id)+1,
1196    );
1197    return db_insert('c_diary_comment', $data);
1198}
1199
1200/**
1201 * 日記コメント用画像追加
1202 */
1203function db_diary_insert_c_diary_comment_images($c_diary_comment_id, $image_filename_1 = '', $image_filename_2 = '', $image_filename_3 = '')
1204{
1205    $data = array();
1206    if ($image_filename_1) $data['image_filename_1'] = $image_filename_1;
1207    if ($image_filename_2) $data['image_filename_2'] = $image_filename_2;
1208    if ($image_filename_3) $data['image_filename_3'] = $image_filename_3;
1209
1210    $where = array(
1211        'c_diary_comment_id' => intval($c_diary_comment_id),
1212    );
1213    return db_update('c_diary_comment', $data, $where);
1214}
1215
1216/**
1217 * 日記コメント削除
1218 *
1219 * @param   int $c_diary_comment_id
1220 * @param   int $u  : 削除しようとしている人の c_member_id
1221 */
1222function db_diary_delete_c_diary_comment($c_diary_comment_id, $u)
1223{
1224    $dc = _do_c_diary_comment4c_diary_comment_id($c_diary_comment_id);
1225    if ($dc['c_member_id'] != $u && $dc['c_member_id_author'] != $u) {
1226        return false;
1227    }
1228
1229    image_data_delete($dc['image_filename_1']);
1230    image_data_delete($dc['image_filename_2']);
1231    image_data_delete($dc['image_filename_3']);
1232
1233    $sql = 'DELETE FROM c_diary_comment WHERE c_diary_comment_id = ?';
1234    $params = array(intval($c_diary_comment_id));
1235    return db_query($sql, $params);
1236}
1237
1238// 日記公開範囲の一括設定をする
1239function db_diary_update_public_flag_diary_all($c_member_id, $public_flag)
1240{
1241    $data = array(
1242        'public_flag' => util_cast_public_flag_diary($public_flag),
1243    );
1244
1245    $where = array(
1246        'c_member_id' => intval($c_member_id),
1247    );
1248    return db_update('c_diary', $data, $where);
1249}
1250
1251/**
1252 * 現在の日記へのコメントのナンバーの最大値を返す
1253 */
1254function db_diary_get_max_number4diary($c_diary_id)
1255{
1256    $sql = 'SELECT MAX(number) FROM c_diary_comment WHERE c_diary_id = ?';
1257    $params = array(intval($c_diary_id));
1258    return db_get_one($sql, $params);
1259}
1260
1261?>
Note: See TracBrowser for help on using the repository browser.