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

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

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

#744:SQLの「IN ()」でカッコ内が空の場合にMySQLエラーが発生する

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