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

source: OpenPNE/branches/stable-2.12.x/webapp/lib/db/diary.php @ 7207

Last change on this file since 7207 was 7207, checked in by ebihara, 13 years ago

#2318:db_diary_get_max_number4diary->db_diary_get_max_c_diary_comment_number4diary

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