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

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

Last change on this file since 1381 was 1381, checked in by takanashi, 16 years ago

#385/#386/#388/#389/#390修正

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