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

source: OpenPNE/branches/2.6.x/webapp/lib/db/diary.php @ 2829

Last change on this file since 2829 was 2829, checked in by ogawa, 13 years ago

#699:日記カテゴリでカテゴリ区切り文字の半角スペースを2つ以上続けるとカテゴリ数が多く計算されてしまう

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