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

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

Last change on this file since 6631 was 6631, checked in by ebihara, 12 years ago

#2090:merged work/toraneko/prj_dbtuning/ (thanks to toraneko)

File size: 38.2 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_summary' .
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_summary' .
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        $list[$key] += db_member_c_member4c_member_id_LIGHT($value['c_member_id']);
576        $diary = db_diary_get_c_diary4id($value['c_diary_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 c_diary_id' .
582           ' FROM c_diary_comment_summary' .
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    } else {
880        $sql .= 'ASC';
881    }
882    $params = array(intval($c_diary_id));
883    $c_diary_comment_list = db_get_all_page($sql, $page, $page_size, $params);
884
885    foreach ($c_diary_comment_list as $key => $value) {
886        $c_member = db_member_c_member4c_member_id_LIGHT($value['c_member_id']);
887        $c_diary_comment_list[$key]['nickname'] = $c_member['nickname'];
888    }
889
890    $sql = "SELECT COUNT(*) FROM c_diary_comment WHERE c_diary_id = ?";
891    $params = array(intval($c_diary_id));
892    $total_num = db_get_one($sql, $params);
893
894    if ($total_num > 0) {
895        $total_page_num =  ceil($total_num / $page_size);
896        if ($page >= $total_page_num) {
897            $next = false;
898        } else {
899            $next = true;
900        }
901        if ($page <= 1) {
902            $prev = false;
903        } else {
904            $prev = true;
905        }
906    }
907    return array($c_diary_comment_list , $prev , $next, $total_num, $total_page_num);
908}
909
910/**
911 * 日記IDからその日記を書いたメンバーIDとニックネームと日記公開範囲を得る
912 */
913function k_p_fh_diary_c_member4c_diary_id($c_diary_id)
914{
915    $sql = "SELECT cm.c_member_id, cm.nickname,cm. public_flag_diary ";
916    $sql .= " FROM c_member AS cm, c_diary AS cd ";
917    $sql .= " WHERE cd.c_diary_id = ?";
918    $sql .= " AND cm.c_member_id=cd.c_member_id";
919    $params = array(intval($c_diary_id));
920    return db_get_row($sql, $params);
921}
922
923/**
924 * フレンドの最新日記リスト
925 */
926function k_p_h_diary_list_friend_h_diary_list_friend4c_member_id($c_member_id, $page_size, $page)
927{
928    $from = "c_diary, c_friend";
929    $where = "c_friend.c_member_id_from = ?" .
930            " AND c_diary.c_member_id = c_friend.c_member_id_to";
931
932    $sql = "SELECT c_diary.* FROM {$from} WHERE {$where}" .
933            " ORDER BY c_diary.r_datetime DESC";
934    $params = array(intval($c_member_id));
935    $lst = db_get_all_page($sql, $page, $page_size, $params);
936
937    foreach ($lst as $key=>$value) {
938        $lst[$key]['count_comments'] = db_diary_count_c_diary_comment4c_diary_id($value['c_diary_id']);
939        $lst[$key]['c_member'] = db_member_c_member4c_member_id($value['c_member_id']);
940    }
941
942    $sql = "SELECT count(*) FROM {$from} WHERE {$where}";
943    $total_num = db_get_one($sql, $params);
944
945    if ($total_num != 0) {
946        $total_page_num =  ceil($total_num / $page_size);
947        if ($page >= $total_page_num) {
948            $next = false;
949        } else {
950            $next = true;
951        }
952
953        if ($page <= 1) {
954            $prev = false;
955        } else {
956            $prev = true;
957        }
958    }
959
960    return array($lst, $prev, $next, $total_num);
961}
962
963//--- diary
964
965/**
966 * 日記を追加
967 */
968function db_diary_insert_c_diary($c_member_id, $subject, $body, $public_flag)
969{
970    //function cacheの削除
971    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_member_id, 5);
972
973    $data = array(
974        'c_member_id' => intval($c_member_id),
975        'subject' => $subject,
976        'body' => $body,
977        'public_flag' => util_cast_public_flag_diary($public_flag),
978        'r_datetime' => db_now(),
979        'r_date' => db_now(),
980        'u_datetime' => db_now(),
981        'is_checked' => 1,
982        'image_filename_1' => '',
983        'image_filename_2' => '',
984        'image_filename_3' => '',
985    );
986    return db_insert('c_diary', $data);
987}
988
989/**
990 * 日記を編集
991 */
992function db_diary_update_c_diary($c_diary_id, $subject, $body, $public_flag,
993    $image_filename_1 = '', $image_filename_2 = '', $image_filename_3 = '')
994{
995    //function cacheの削除
996    $c_diary = db_diary_get_c_diary4id($c_diary_id);
997    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_diary['c_member_id'], 5);
998
999    $data = array(
1000        'subject' => $subject,
1001        'body' => $body,
1002        'public_flag' => util_cast_public_flag_diary($public_flag),
1003        'u_datetime' => db_now(),
1004    );
1005    if ($image_filename_1) $data['image_filename_1'] = $image_filename_1;
1006    if ($image_filename_2) $data['image_filename_2'] = $image_filename_2;
1007    if ($image_filename_3) $data['image_filename_3'] = $image_filename_3;
1008
1009    $where = array(
1010        'c_diary_id' => intval($c_diary_id),
1011    );
1012    return db_update('c_diary', $data, $where);
1013}
1014
1015/**
1016 * 日記削除
1017 * コメント、画像も削除
1018 *
1019 * @param int $c_diary_id
1020 */
1021function db_diary_delete_c_diary($c_diary_id)
1022{
1023     //function cacheの削除
1024    $c_diary = db_diary_get_c_diary4id($c_diary_id);
1025    pne_cache_drop('db_diary_get_c_diary_list4c_member_id', $c_diary['c_member_id'], 5);
1026
1027   // 画像
1028    db_image_data_delete($c_diary['image_filename_1']);
1029    db_image_data_delete($c_diary['image_filename_2']);
1030    db_image_data_delete($c_diary['image_filename_3']);
1031
1032    // コメント
1033    $sql = 'SELECT image_filename_1, image_filename_2, image_filename_3 FROM c_diary_comment WHERE c_diary_id =?';
1034    $params = array(intval($c_diary_id));
1035    $comment_images = db_get_all($sql, $params);
1036
1037    //カテゴリ
1038    db_diary_category_delete_c_diary_category_diary($c_diary_id);
1039
1040    foreach ($comment_images as $value) {
1041        db_image_data_delete($value['image_filename_1']);
1042        db_image_data_delete($value['image_filename_2']);
1043        db_image_data_delete($value['image_filename_3']);
1044    }
1045
1046    $sql = 'DELETE FROM c_diary_comment_summary WHERE c_diary_id = ?';
1047    db_query($sql, $params);
1048
1049    $sql = 'DELETE FROM c_diary_comment WHERE c_diary_id = ?';
1050    db_query($sql, $params);
1051
1052    // 日記
1053    $sql = 'DELETE FROM c_diary WHERE c_diary_id = ?';
1054    db_query($sql, $params);
1055}
1056
1057/**
1058 * 指定した番号の日記画像を削除
1059 */
1060function db_diary_delete_c_diary_image($c_diary_id, $image_num)
1061{
1062    $data = array(
1063        'image_filename_'.intval($image_num) => '',
1064    );
1065    $where = 'c_diary_id = '.intval($c_diary_id);
1066    return db_update('c_diary', $data, $where);
1067}
1068
1069/**
1070 * 日記に画像を追加する
1071 */
1072function db_diary_update_c_diary_image_filename($c_diary_id, $image_filename, $image_num)
1073{
1074    $data = array(
1075        'image_filename_'.intval($image_num) => $image_filename,
1076    );
1077    $where = 'c_diary_id = '.intval($c_diary_id);
1078    return db_update('c_diary', $data, $where);
1079}
1080
1081/**
1082 * 日記の未読/既読を変更
1083 * c_diary.is_checkedを更新
1084 */
1085function db_diary_update_c_diary_is_checked($c_diary_id, $value)
1086{
1087    $data = array(
1088        'is_checked' => (bool)$value,
1089    );
1090    $where = 'c_diary_id = '.intval($c_diary_id);
1091    return db_update('c_diary', $data, $where);
1092}
1093
1094//--- diary_comment
1095
1096/**
1097 * 日記コメント追加
1098 *
1099 * @param  int    $c_member_id
1100 * @param  int    $c_diary_id
1101 * @param  string $body
1102 * @return int    insert_id
1103 */
1104function db_diary_insert_c_diary_comment($c_member_id, $c_diary_id, $body)
1105{
1106    //function cache削除
1107    pne_cache_drop('p_h_home_c_diary_my_comment_list4c_member_id', $c_member_id, 5);
1108
1109    $data = array(
1110        'c_member_id' => intval($c_member_id),
1111        'c_diary_id' => intval($c_diary_id),
1112        'body' => $body,
1113        'r_datetime' => db_now(),
1114        'image_filename_1' => '',
1115        'image_filename_2' => '',
1116        'image_filename_3' => '',
1117        'number' => db_diary_get_max_number4diary($c_diary_id)+1,
1118    );
1119    return db_insert('c_diary_comment', $data);
1120}
1121
1122/**
1123 * 日記コメント用画像追加
1124 */
1125function db_diary_insert_c_diary_comment_images($c_diary_comment_id, $image_filename_1 = '', $image_filename_2 = '', $image_filename_3 = '')
1126{
1127    $data = array();
1128    if ($image_filename_1) $data['image_filename_1'] = $image_filename_1;
1129    if ($image_filename_2) $data['image_filename_2'] = $image_filename_2;
1130    if ($image_filename_3) $data['image_filename_3'] = $image_filename_3;
1131
1132    $where = array(
1133        'c_diary_comment_id' => intval($c_diary_comment_id),
1134    );
1135    return db_update('c_diary_comment', $data, $where);
1136}
1137
1138/**
1139 * 日記コメント削除
1140 *
1141 * @param   int $c_diary_comment_id
1142 * @param   int $u  : 削除しようとしている人の c_member_id
1143 */
1144function db_diary_delete_c_diary_comment($c_diary_comment_id, $u)
1145{
1146    $dc = _do_c_diary_comment4c_diary_comment_id($c_diary_comment_id);
1147    if ($dc['c_member_id'] != $u && $dc['c_member_id_author'] != $u) {
1148        return false;
1149    }
1150
1151    db_image_data_delete($dc['image_filename_1']);
1152    db_image_data_delete($dc['image_filename_2']);
1153    db_image_data_delete($dc['image_filename_3']);
1154
1155    $sql = 'DELETE FROM c_diary_comment WHERE c_diary_comment_id = ?';
1156    $params = array(intval($c_diary_comment_id));
1157    return db_query($sql, $params);
1158}
1159
1160// 日記公開範囲の一括設定をする
1161function db_diary_update_public_flag_diary_all($c_member_id, $public_flag)
1162{
1163    $data = array(
1164        'public_flag' => util_cast_public_flag_diary($public_flag),
1165    );
1166
1167    $where = array(
1168        'c_member_id' => intval($c_member_id),
1169    );
1170    return db_update('c_diary', $data, $where);
1171}
1172
1173/**
1174 * 現在の日記へのコメントのナンバーの最大値を返す
1175 */
1176function db_diary_get_max_number4diary($c_diary_id)
1177{
1178    $sql = 'SELECT MAX(number) FROM c_diary_comment WHERE c_diary_id = ?';
1179    $params = array(intval($c_diary_id));
1180    return db_get_one($sql, $params);
1181}
1182
1183/**
1184 * 日記コメント記入履歴の追加
1185 *
1186 * @param  int    $c_member_id
1187 * @param  int    $c_diary_id
1188 */
1189function db_diary_insert_c_diary_comment_summary($c_member_id, $c_diary_id)
1190{
1191    $sql = 'SELECT c_diary_id FROM c_diary_comment_summary'
1192         . ' WHERE c_member_id = ? AND c_diary_id = ?';
1193    $params = array(intval($c_member_id),intval($c_diary_id));
1194    $summary_id = db_get_one($sql,$params,'main');
1195    if(!$summary_id){
1196        $data = array(
1197            'c_member_id' => intval($c_member_id),
1198            'c_diary_id' => intval($c_diary_id),
1199            'r_datetime' => db_now(),
1200        );
1201        $ins_id = db_insert('c_diary_comment_summary', $data);
1202    }
1203}
1204
1205/**
1206 * 日記コメント記入履歴の更新
1207 *
1208 * @param  int    $c_diary_id
1209 */
1210function db_diary_update_c_diary_comment_summary($c_diary_id)
1211{
1212    $data = array(
1213        'r_datetime' => db_now(),
1214    );
1215    $where = array('c_diary_id' => intval($c_diary_id));
1216    $rtn = db_update('c_diary_comment_summary',$data,$where);
1217    return array($ins_id,$rtn);
1218}
1219
1220
1221/**
1222 * 日記コメント記入履歴の削除
1223 *
1224 * @param  int    $c_member_id
1225 * @param  int    $c_diary_id
1226 * 該当c_diary_idへのコメント数が0なら、日記コメント記入履歴も削除する。
1227 *
1228 */
1229function db_diary_delete_c_diary_comment_summary($c_member_id, $c_diary_id)
1230{
1231    // 投稿したコメントの有無
1232    $sql = 'SELECT COUNT(c_diary_comment_id) FROM c_diary_comment'
1233         . ' WHERE c_member_id = ? AND c_diary_id = ?';
1234    $params = array(intval($c_member_id),intval($c_diary_id));
1235    $count = db_get_one($sql,$params,'main');
1236    // コメントが無ければ履歴削除
1237    if(!$count){
1238        $sql = 'DELETE FROM c_diary_comment_summary'
1239             . ' WHERE c_member_id = ? AND c_diary_id = ?';
1240        $params = array(intval($c_member_id),intval($c_diary_id));
1241        db_query($sql, $params);
1242    }
1243    $sql = 'SELECT * FROM c_diary_comment WHERE c_diary_id = ?'
1244         . ' ORDER BY c_diary_comment_id DESC';
1245    $params = array(intval($c_diary_id));
1246    $comment = db_get_row($sql,$params,'main');
1247    // 最新コメントの日付で履歴更新
1248    $data = array(
1249        'r_datetime' => $comment['r_datetime'],
1250    );
1251    $where = array('c_diary_id' => intval($c_diary_id));
1252    $rtn = db_update('c_diary_comment_summary',$data,$where);
1253}
1254
1255?>
Note: See TracBrowser for help on using the repository browser.