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

source: OpenPNE/branches/ebihara/dev_2_6/webapp/lib/db/diary.php @ 816

Last change on this file since 816 was 816, checked in by ebihara, 14 years ago

カテゴリに関連付いた日記が存在しない場合は、そのカテゴリ自体を削除するようにした。

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