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

source: OpenPNE/branches/prj/postgres/2_8_1/webapp/lib/db/diary.php @ 3402

Last change on this file since 3402 was 3402, checked in by ToshihiroK, 14 years ago

postgres対応

File size: 36.1 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
531    $params = array(intval($c_member_id), $date);
532    $c_diary_id_list = db_get_col($sql, $params);
533    $c_diary_id_list = array_unique($c_diary_id_list);
534
535    if (!$c_diary_id_list) {
536        return array();
537    }
538
539    $ids = implode(',', $c_diary_id_list);
540    $sql = 'SELECT c_diary_id, MAX(r_datetime) as maxdate' .
541           ' FROM c_diary_comment' .
542           ' WHERE c_diary_id IN (' . $ids . ')' .
543           ' GROUP BY c_diary_id' .
544           ' ORDER BY maxdate DESC';
545    $list = db_get_assoc_limit($sql, 0, $limit);
546
547    $result = array();
548    foreach ($list as $c_diary_id => $r_datetime) {
549        $item = db_diary_get_c_diary4id($c_diary_id);
550        if ($item['public_flag'] == 'friend' && !db_friend_is_friend($c_member_id, $item['c_member_id'])) {
551            continue;
552        }
553        $item += db_common_c_member4c_member_id_LIGHT($item['c_member_id']);
554        $item['r_datetime'] = $r_datetime;
555        $item['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($c_diary_id);
556        $result[] = $item;
557    }
558    return $result;
559}
560
561function p_h_diary_comment_list_c_diary_my_comment_list4c_member_id($c_member_id, $page, $page_size)
562{
563    $blocked = db_member_access_block_list4c_member_id_to($c_member_id);
564    $blocked[] = $c_member_id;
565    $except_ids = implode(',', $blocked);
566
567    $friends = db_friend_c_member_id_list($c_member_id);
568    $firends[] = 0;
569    $friend_ids = implode(',', $friends);
570   
571    $sql = 'SELECT d.c_diary_id' .
572            ', d.subject' .
573            ', d.c_member_id' .
574            ', sub_diary_tbl.r_datetime' .
575            ', sub_diary_tbl.num_comment' .
576        ' FROM c_diary AS d' .
577            ', ( SELECT dc.c_diary_id' .
578                    ', MAX(dc.r_datetime) AS r_datetime' .
579                    ', COUNT(DISTINCT dc.c_diary_comment_id) AS num_comment' .
580                ' FROM c_diary AS d' .
581                    ' INNER JOIN c_diary_comment AS dc USING (c_diary_id)' .
582                    ', c_diary_comment AS mydc' .
583                ' WHERE mydc.c_member_id = ?' .
584                    ' AND mydc.c_diary_id = d.c_diary_id' .
585                    ' AND mydc.c_member_id <> d.c_member_id' .
586                    ' AND d.c_member_id NOT IN (' . $except_ids . ')' .
587                    ' AND (d.public_flag = \'public\' OR (d.public_flag = \'friend\' AND d.c_member_id IN (' . $friend_ids . ')))' .
588                ' GROUP BY dc.c_diary_id' .
589            ') as sub_diary_tbl' .
590        ' WHERE' .
591            ' sub_diary_tbl.c_diary_id = d.c_diary_id' .
592        ' ORDER BY r_datetime DESC';
593
594    $params = array(intval($c_member_id));
595    $list = db_get_all_page($sql, $page, $page_size, $params);
596
597    foreach ($list as $key => $value) {
598        $list[$key] += db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
599    }
600
601    $sql = 'SELECT COUNT(DISTINCT d.c_diary_id)' .
602        ' FROM c_diary AS d' .
603            ' INNER JOIN c_diary_comment AS dc USING (c_diary_id)' .
604            ', c_diary_comment AS mydc' .
605        ' WHERE mydc.c_member_id = ?' .
606            ' AND mydc.c_diary_id = d.c_diary_id' .
607            ' AND mydc.c_member_id <> d.c_member_id' .
608            ' AND d.c_member_id NOT IN (' . $except_ids . ')' .
609            ' AND (d.public_flag = \'public\' OR (d.public_flag = \'friend\' AND d.c_member_id IN (' . $friend_ids . ')))';
610    $total_num = db_get_one($sql, $params);
611
612    $is_prev = false;
613    $is_next = false;
614    if ($total_num) {
615        $is_prev = (bool)($page > 1);
616        $is_next = (bool)($page < ceil($total_num / $page_size));
617    }
618    return array($list, $is_prev, $is_next, $total_num);
619}
620
621/**
622 * あるメンバーの指定された年月日の日記のリストを得る
623 */
624function p_fh_diary_list_diary_list_date4c_member_id($c_member_id, $page_size, $page, $year, $month, $day=0 ,$u = null)
625{
626    if ($day) {
627        $s_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day, $year));
628        $e_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day+1, $year));
629    } else {
630        $s_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, 1, $year));
631        $e_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month+1, 1, $year));
632    }
633
634    $pf_cond = db_diary_public_flag_condition($c_member_id, $u);
635    $where = ' WHERE c_member_id = ? AND r_datetime >= ? AND r_datetime < ?';
636    $sql = 'SELECT * FROM c_diary' .
637            $where . $pf_cond .
638            ' ORDER BY r_datetime DESC';
639    $params = array(intval($c_member_id), $s_date, $e_date);
640    $list = db_get_all_limit($sql, $page_size * ($page - 1), $page_size, $params);
641
642    foreach ($list as $key => $c_diary) {
643        $list[$key]['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($c_diary['c_diary_id']);
644    }
645
646    $sql = 'SELECT COUNT(*) FROM c_diary' . $where;
647    $total_num = db_get_one($sql, $params);
648
649    if ($total_num != 0) {
650        $total_page_num =  ceil($total_num / $page_size);
651        if ($page >= $total_page_num) {
652            $next = false;
653        } else {
654            $next = true;
655        }
656        if ($page <= 1) {
657            $prev = false;
658        } else {
659            $prev = true;
660        }
661    }
662    return array($list , $prev , $next, $total_num);
663}
664
665/**
666 * 日記ページの「各月の日記」用
667 *
668 * 日記を最初に書いた月からスタートしてみる
669 */
670function p_fh_diary_list_date_list4c_member_id($c_member_id)
671{
672    $sql = "SELECT r_datetime FROM c_diary" .
673        " WHERE c_member_id = ?" .
674        " ORDER BY r_datetime";
675    $params = array(intval($c_member_id));
676    if (!$first_datetime = db_get_one($sql, $params)) {
677        return array();
678    }
679
680    $start_date = getdate(strtotime($first_datetime));
681    $end_date =  getdate();
682
683    $date = array();
684    $year = $start_date['year'];
685    $month = $start_date['mon'];
686    while (1) {
687        $date[] =  array(
688            'year' => $year,
689            'month' => $month,
690        );
691
692        if ($end_date['year'] <= $year
693            && $end_date['mon'] <= $month) {
694            break;
695        }
696
697        $month++;
698        if ($month > 12) {
699            $month = 1;
700            $year++;
701        }
702    }
703    return array_reverse($date);
704}
705
706//c_member_id から自分の日記についてるコメントID(複数)を取得
707function p_fh_diary_c_diary_comment_id_list4c_member_id($c_member_id)
708{
709    $sql = "SELECT cdc.c_diary_comment_id FROM c_diary as cd,c_diary_comment as cdc" .
710        " WHERE cd.c_member_id = ?".
711        " AND cd.c_diary_id = cdc.c_diary_id";
712    $params = array(intval($c_member_id));
713    return db_get_col($sql, $params);
714}
715
716/**
717 * 年月 から日記のある日(複数)を取得
718 */
719function p_fh_diary_list_calendar_list4c_member_id($year, $month, $c_member_id)
720{
721    $sql = "SELECT cdc.c_diary_comment_id FROM c_diary as cd,c_diary_comment as cdc" .
722        " WHERE cd.c_member_id = ?".
723        " AND cd.c_diary_id = cdc.c_diary_id";
724    $params = array(intval($c_member_id));
725    return db_get_col($sql, $params);
726}
727
728/**
729 * 新着日記検索
730 * 検索ポイントはタイトル、本文
731 * 空白(全角半角問わない)でand検索可
732 */
733function p_h_diary_list_all_search_c_diary4c_diary($keyword, $page_size, $page, $c_member_id = '')
734{
735    $params = array();
736
737    $select = 'SELECT *';
738    $from = ' FROM c_diary';
739
740    //自分の日記だけを対象にする事も出来る
741    if ($c_member_id) {
742        $where = ' WHERE c_member_id = ?';
743        $params[] = intval($c_member_id);
744    } else {
745        $where = " WHERE public_flag = 'public'";
746    }
747
748    //and検索を実装
749    //subject,body を検索
750    if ($keyword) {
751        //全角空白を半角に統一
752        $keyword = str_replace(' ', ' ', $keyword);
753
754        $keyword_list = explode(' ', $keyword);
755        foreach ($keyword_list as $word) {
756            $word = check_search_word($word);
757
758            $where .= ' AND (subject LIKE ? OR body LIKE ?)';
759            $params[] = '%'.$word.'%';
760            $params[] = '%'.$word.'%';
761        }
762    }
763    $order = " ORDER BY r_datetime DESC";
764
765    $sql = $select . $from . $where . $order;
766
767    $list = db_get_all_page($sql, $page, $page_size, $params);
768    foreach ($list as $key => $value) {
769        $list[$key]['c_member'] = db_common_c_member_with_profile($value['c_member_id']);
770        $list[$key]['num_comment'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
771    }
772
773    $sql = 'SELECT COUNT(*)' . $from . $where;
774    $total_num = db_get_one($sql, $params);
775
776    if ($total_num != 0) {
777        $total_page_num =  ceil($total_num / $page_size);
778        if ($page >= $total_page_num) {
779            $next = false;
780        } else {
781            $next = true;
782        }
783        if ($page <= 1) {
784            $prev = false;
785        } else {
786            $prev = true;
787        }
788    }
789    return array($list , $prev , $next, $total_num);
790}
791
792/**
793 * 指定された年月に日記を書いている日のリストを返す
794 */
795function p_h_diary_is_diary_written_list4date($year, $month, $c_member_id, $u = null)
796{
797    include_once 'Date/Calc.php';
798
799    $pf_cond = db_diary_public_flag_condition($c_member_id, $u);
800    $sql = "SELECT DISTINCT date_part('day', r_datetime) FROM c_diary" .
801           " WHERE c_member_id = ? AND r_datetime >= ? AND r_datetime < ?" . $pf_cond;
802
803    $date_format = '%Y-%m-%d 00:00:00';
804    $thismonth = Date_Calc::beginOfMonth($month, $year, $date_format);
805    $nextmonth = Date_Calc::beginOfNextMonth(0, $month, $year, $date_format);
806
807    $params = array(intval($c_member_id), $thismonth, $nextmonth);
808
809    return db_get_col($sql, $params);
810}
811
812/**
813 * 日記コメント情報をIDから取得
814 *
815 * @param   int $c_diary_comment_id
816 * @return array
817 *              c_diary_comemnt.*
818 *              c_diary.c_member_id AS c_member_id_author
819 */
820function _do_c_diary_comment4c_diary_comment_id($c_diary_comment_id)
821{
822    $sql = "SELECT dc.*, d.c_member_id AS c_member_id_author";
823    $sql .= " FROM c_diary_comment AS dc, c_diary AS d";
824    $sql .= " WHERE dc.c_diary_comment_id = ?";
825    $sql .= " AND dc.c_diary_id = d.c_diary_id";
826    $params = array(intval($c_diary_comment_id));
827    return db_get_row($sql, $params);
828}
829
830/**
831 * メンバーの最新日記のリストを返す
832 */
833function k_p_f_home_c_diary_list4c_member_id($c_member_id, $limit)
834{
835    //日記リスト
836    $sql = "SELECT c_diary_id, r_date, subject ,image_filename_1";
837    $sql .= " FROM c_diary";
838    $sql .= " WHERE c_member_id = ?";
839    $sql .= " ORDER BY r_date DESC";
840    $params = array(intval($c_member_id));
841    $c_diary_list = db_get_all_limit($sql, 0, $limit, $params);
842
843    //コメント数
844    foreach ($c_diary_list as $key => $value) {
845        $c_diary_id = $value['c_diary_id'];
846
847        $sql = "SELECT COUNT(*) ";
848        $sql .= "FROM c_diary_comment ";
849        $sql .= "WHERE c_diary_id = ?";
850        $params = array(intval($c_diary_id));
851        $c_diary_list[$key]['count_comment'] = db_get_one($sql, $params);
852    }
853    return $c_diary_list;
854}
855
856/**
857 * 最新日記リストを取得。
858 * 取得範囲を指定できる。
859 */
860function k_p_fh_diary_list_c_diary_list4c_member_id($c_member_id, $page_size, $page)
861{
862    $sql = 'SELECT * FROM c_diary WHERE c_member_id = ? ORDER BY r_datetime DESC';
863    $params = array(intval($c_member_id));
864    $c_diary_list = db_get_all_page($sql, $page, $page_size, $params);
865
866    foreach ($c_diary_list as $key => $value) {
867        $c_diary_list[$key]['count_comment'] =
868            db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
869    }
870
871    $sql = 'SELECT COUNT(*) FROM c_diary WHERE c_member_id = ?';
872    $total_num = db_get_one($sql, $params);
873
874    if ($total_num != 0) {
875        $total_page_num =  ceil($total_num / $page_size);
876        if ($page >= $total_page_num) {
877            $next = false;
878        } else {
879            $next = true;
880        }
881        if ($page <= 1) {
882            $prev = false;
883        } else {
884            $prev = true;
885        }
886    }
887    return array($c_diary_list , $prev , $next);
888}
889
890/**
891 * 日記へのコメントリストを取得
892 */
893function k_p_fh_diary_c_diary_comment_list4c_diary_id($c_diary_id, $page_size, $page)
894{
895    $sql = 'SELECT * FROM c_diary_comment WHERE c_diary_id = ? ORDER BY r_datetime DESC';
896    $params = array(intval($c_diary_id));
897    $c_diary_comment_list = db_get_all_page($sql, $page, $page_size, $params);
898
899    foreach ($c_diary_comment_list as $key => $value) {
900        $c_member = db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
901        $c_diary_comment_list[$key]['nickname'] = $c_member['nickname'];
902    }
903
904    $sql = "SELECT COUNT(*) FROM c_diary_comment WHERE c_diary_id = ?";
905    $params = array(intval($c_diary_id));
906    $total_num = db_get_one($sql, $params);
907
908    if ($total_num > 0) {
909        $total_page_num =  ceil($total_num / $page_size);
910        if ($page >= $total_page_num) {
911            $next = false;
912        } else {
913            $next = true;
914        }
915        if ($page <= 1) {
916            $prev = false;
917        } else {
918            $prev = true;
919        }
920    }
921    return array($c_diary_comment_list , $prev , $next, $total_num, $total_page_num);
922}
923
924/**
925 * 日記IDからその日記を書いたメンバーIDとニックネームと日記公開範囲を得る
926 */
927function k_p_fh_diary_c_member4c_diary_id($c_diary_id)
928{
929    $sql = "SELECT cm.c_member_id, cm.nickname,cm. public_flag_diary ";
930    $sql .= " FROM c_member AS cm, c_diary AS cd ";
931    $sql .= " WHERE cd.c_diary_id = ?";
932    $sql .= " AND cm.c_member_id=cd.c_member_id";
933    $params = array(intval($c_diary_id));
934    return db_get_row($sql, $params);
935}
936
937/**
938 * フレンドの最新日記リスト
939 */
940function k_p_h_diary_list_friend_h_diary_list_friend4c_member_id($c_member_id, $page_size, $page)
941{
942    $from = "c_diary, c_friend";
943    $where = "c_friend.c_member_id_from = ?" .
944            " AND c_diary.c_member_id = c_friend.c_member_id_to";
945
946    $sql = "SELECT c_diary.* FROM {$from} WHERE {$where}" .
947            " ORDER BY c_diary.r_datetime DESC";
948    $params = array(intval($c_member_id));
949    $lst = db_get_all_page($sql, $page, $page_size, $params);
950
951    foreach ($lst as $key=>$value) {
952        $lst[$key]['count_comments'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
953        $lst[$key]['c_member'] = db_common_c_member4c_member_id($value['c_member_id']);
954    }
955
956    $sql = "SELECT count(*) FROM {$from} WHERE {$where}";
957    $total_num = db_get_one($sql, $params);
958
959    if ($total_num != 0) {
960        $total_page_num =  ceil($total_num / $page_size);
961        if ($page >= $total_page_num) {
962            $next = false;
963        } else {
964            $next = true;
965        }
966
967        if ($page <= 1) {
968            $prev = false;
969        } else {
970            $prev = true;
971        }
972    }
973
974    return array($lst, $prev, $next, $total_num);
975}
976
977//--- diary
978
979/**
980 * 日記を追加
981 */
982function db_diary_insert_c_diary($c_member_id, $subject, $body, $public_flag)
983{
984    //function cacheの削除
985    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_member_id, 5);
986
987    $data = array(
988        'c_member_id' => intval($c_member_id),
989        'subject' => $subject,
990        'body' => $body,
991        'public_flag' => util_cast_public_flag_diary($public_flag),
992        'r_datetime' => db_now(),
993        'r_date' => db_now(),
994        'is_checked' => 1,
995        'image_filename_1' => '',
996        'image_filename_2' => '',
997        'image_filename_3' => '',
998    );
999    return db_insert('c_diary', $data);
1000}
1001
1002/**
1003 * 日記を編集
1004 */
1005function db_diary_update_c_diary($c_diary_id, $subject, $body, $public_flag,
1006    $image_filename_1 = '', $image_filename_2 = '', $image_filename_3 = '')
1007{
1008    //function cacheの削除
1009    $c_diary = db_diary_get_c_diary4id($c_diary_id);
1010    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_diary['c_member_id'], 5);
1011
1012    $data = array(
1013        'subject' => $subject,
1014        'body' => $body,
1015        'public_flag' => util_cast_public_flag_diary($public_flag),
1016    );
1017    if ($image_filename_1) $data['image_filename_1'] = $image_filename_1;
1018    if ($image_filename_2) $data['image_filename_2'] = $image_filename_2;
1019    if ($image_filename_3) $data['image_filename_3'] = $image_filename_3;
1020
1021    $where = array(
1022        'c_diary_id' => intval($c_diary_id),
1023    );
1024    return db_update('c_diary', $data, $where);
1025}
1026
1027/**
1028 * 日記削除
1029 * コメント、画像も削除
1030 *
1031 * @param int $c_diary_id
1032 */
1033function db_diary_delete_c_diary($c_diary_id)
1034{
1035     //function cacheの削除
1036    $c_diary = db_diary_get_c_diary4id($c_diary_id);
1037    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_diary['c_member_id'], 5);
1038
1039   // 画像
1040    image_data_delete($c_diary['image_filename_1']);
1041    image_data_delete($c_diary['image_filename_2']);
1042    image_data_delete($c_diary['image_filename_3']);
1043
1044    // コメント
1045    $sql = 'SELECT image_filename_1, image_filename_2, image_filename_3 FROM c_diary_comment WHERE c_diary_id =?';
1046    $params = array(intval($c_diary_id));
1047    $comment_images = db_get_all($sql, $params);
1048
1049    //カテゴリ
1050    db_diary_category_delete_c_diary_category_diary($c_diary_id);
1051
1052    foreach ($comment_images as $value) {
1053        image_data_delete($value['image_filename_1']);
1054        image_data_delete($value['image_filename_2']);
1055        image_data_delete($value['image_filename_3']);
1056    }
1057
1058    $sql = 'DELETE FROM c_diary_comment WHERE c_diary_id = ?';
1059    db_query($sql, $params);
1060
1061    // 日記
1062    $sql = 'DELETE FROM c_diary WHERE c_diary_id = ?';
1063    db_query($sql, $params);
1064}
1065
1066/**
1067 * 指定した番号の日記画像を削除
1068 */
1069function db_diary_delete_c_diary_image($c_diary_id, $image_num)
1070{
1071    $data = array(
1072        'image_filename_'.intval($image_num) => '',
1073    );
1074    $where = 'c_diary_id = '.intval($c_diary_id);
1075    return db_update('c_diary', $data, $where);
1076}
1077
1078/**
1079 * 日記に画像を追加する
1080 */
1081function db_diary_update_c_diary_image_filename($c_diary_id, $image_filename, $image_num)
1082{
1083    $data = array(
1084        'image_filename_'.intval($image_num) => $image_filename,
1085    );
1086    $where = 'c_diary_id = '.intval($c_diary_id);
1087    return db_update('c_diary', $data, $where);
1088}
1089
1090/**
1091 * 日記の未読/既読を変更
1092 * c_diary.is_checkedを更新
1093 */
1094function db_diary_update_c_diary_is_checked($c_diary_id, $value)
1095{
1096    $data = array(
1097        'is_checked' => (int)$value,
1098    );
1099    $where = 'c_diary_id = '.intval($c_diary_id);
1100    return db_update('c_diary', $data, $where);
1101}
1102
1103//--- diary_comment
1104
1105/**
1106 * 日記コメント追加
1107 *
1108 * @param  int    $c_member_id
1109 * @param  int    $c_diary_id
1110 * @param  string $body
1111 * @return int    insert_id
1112 */
1113function db_diary_insert_c_diary_comment($c_member_id, $c_diary_id, $body)
1114{
1115    //function cache削除
1116    pne_cache_drop('p_h_home_c_diary_my_comment_list4c_member_id', $c_member_id, 5);
1117
1118    $data = array(
1119        'c_member_id' => intval($c_member_id),
1120        'c_diary_id' => intval($c_diary_id),
1121        'body' => $body,
1122        'r_datetime' => db_now(),
1123        'image_filename_1' => '',
1124        'image_filename_2' => '',
1125        'image_filename_3' => '',
1126    );
1127    return db_insert('c_diary_comment', $data);
1128}
1129
1130/**
1131 * 日記コメント用画像追加
1132 */
1133function db_diary_insert_c_diary_comment_images($c_diary_comment_id, $image_filename_1 = '', $image_filename_2 = '', $image_filename_3 = '')
1134{
1135    $data = array();
1136    if ($image_filename_1) $data['image_filename_1'] = $image_filename_1;
1137    if ($image_filename_2) $data['image_filename_2'] = $image_filename_2;
1138    if ($image_filename_3) $data['image_filename_3'] = $image_filename_3;
1139
1140    $where = array(
1141        'c_diary_comment_id' => intval($c_diary_comment_id),
1142    );
1143    return db_update('c_diary_comment', $data, $where);
1144}
1145
1146/**
1147 * 日記コメント削除
1148 *
1149 * @param   int $c_diary_comment_id
1150 * @param   int $u  : 削除しようとしている人の c_member_id
1151 */
1152function db_diary_delete_c_diary_comment($c_diary_comment_id, $u)
1153{
1154    $dc = _do_c_diary_comment4c_diary_comment_id($c_diary_comment_id);
1155    if ($dc['c_member_id'] != $u && $dc['c_member_id_author'] != $u) {
1156        return false;
1157    }
1158
1159    image_data_delete($dc['image_filename_1']);
1160    image_data_delete($dc['image_filename_2']);
1161    image_data_delete($dc['image_filename_3']);
1162
1163    $sql = 'DELETE FROM c_diary_comment WHERE c_diary_comment_id = ?';
1164    $params = array(intval($c_diary_comment_id));
1165    return db_query($sql, $params);
1166}
1167
1168// 日記公開範囲の一括設定をする
1169function db_diary_update_public_flag_diary_all($c_member_id, $public_flag)
1170{
1171    $data = array(
1172        'public_flag' => util_cast_public_flag_diary($public_flag),
1173    );
1174
1175    $where = array(
1176        'c_member_id' => intval($c_member_id),
1177    );
1178    return db_update('c_diary', $data, $where);
1179}
1180
1181?>
Note: See TracBrowser for help on using the repository browser.