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

source: OpenPNE/branches/ishida/prj_dev26/webapp/lib/db/diary.php @ 911

Last change on this file since 911 was 911, checked in by ishida, 14 years ago

#96 日記・メッセージ・コミュニティから全文検索。
http://trac.openpne.jp/ticket/96
PC版だけ実装完了

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