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

source: OpenPNE/trunk/webapp/lib/db/album.php @ 6587

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

#135:c_imageについてのDB関数でイメージサーバを読みに行かないものがあったのを修正

File size: 20.2 KB
Line 
1<?php
2/**
3 * @copyright 2005-2007 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7/**
8 * db_album_public_flag_condition
9 *
10 * @param int $c_member_id target c_member_id
11 * @param int $u viewer's c_member_id
12 * @param string $force
13 * @return string
14 */
15function db_album_public_flag_condition($c_member_id, $u = null, $force = null)
16{
17    $pf_cond = '';
18    if ($force) {
19        switch ($force) {
20        case 'friend':
21            $pf_cond = " AND c_album.public_flag <> 'private'";
22            break;
23        case 'private':
24            $pf_cond = " AND c_album.public_flag = 'public'";
25            break;
26        }
27    } else {
28        if (!is_null($u) && $c_member_id != $u) {
29            $is_friend = db_friend_is_friend($c_member_id, $u);
30            if ($is_friend) {
31                $pf_cond = " AND c_album.public_flag <> 'private'";
32            } else {
33                $pf_cond = " AND c_album.public_flag = 'public'";
34            }
35        }
36    }
37    return $pf_cond;
38}
39
40/**
41 * アルバム情報を取得
42 * @param int $c_album_id
43 */
44function db_album_get_c_album4c_album_id($c_album_id)
45{
46    $sql = 'SELECT * FROM c_album WHERE c_album_id = ?';
47    $params = array(intval($c_album_id));
48   
49    $album = db_get_row($sql, $params);
50
51    return $album;
52}
53
54/**
55 * あるメンバーのアルバム一覧を取得
56 *
57 * @param int $c_member_id target_member_id
58 * @param int $count
59 * @param int $u viewer's member_id
60 * @param string $force
61 */
62function db_album_get_c_album_subject_list4c_member_id($c_member_id, $count= 10, $u = null, $force = null)
63{
64    $pf_condition = db_album_public_flag_condition($c_member_id, $u, $force);
65    $sql = 'SELECT * FROM c_album WHERE c_member_id = ? ' 
66         . $pf_condition
67         . ' ORDER BY u_datetime DESC';
68   
69    $params = array(intval($c_member_id));       
70    return db_get_all_limit($sql, 0, $count, $params);
71}
72
73/**
74 * アルバム画像を取得
75 * @param int $c_album_image_id
76 */
77function db_album_image_get_c_album_image4id($c_album_image_id)
78{
79    $sql = 'SELECT * FROM c_album_image WHERE c_album_image_id = ?';
80    $params = array(intval($c_album_image_id));
81
82    return db_get_row($sql,$params);
83}
84
85/**
86 * c_album_idをキーとしてc_albumデータが存在するか判定
87 * @param int $c_album_id
88 * @return bool true,false
89 */
90function p_common_is_active_c_album_id($c_album_id)
91{
92    $sql = 'SELECT c_album_id FROM c_album WHERE c_album_id = ?';
93    return (bool)db_get_one($sql, array(intval($c_album_id)));
94}
95
96/**
97 * c_album_image_idをキーとしてc_album_imageデータが存在するか判定
98 * @param int $c_album_image_id
99 * @return bool true,false
100 */
101function p_common_is_active_c_album_image_id($c_album_image_id)
102{
103    $sql = 'SELECT c_album_image_id FROM c_album_image WHERE c_album_image_id = ?';
104    $params = array(intval($c_album_image_id));
105   
106    return (bool)db_get_one($sql,$params);
107}
108
109/**
110 * アルバムIDからアルバムに登録された画像を取得
111 * @param   int   $c_album_id
112 * @return  array
113 */
114function db_album_get_c_album_page4id($c_album_id,$page_size=10,$page=0)
115{
116    $select = 'SELECT ab.*,i.c_album_image_id,i.image_filename,i.image_description';
117    $from  = ' FROM c_album AS ab,c_album_image AS i';
118    $where = ' WHERE ab.c_album_id = i.c_album_id' .
119             ' AND ab.c_album_id = ?';
120    $orderby = ' ORDER BY i.c_album_image_id ASC';
121    $sql = $select .$from . $where .$orderby;
122   
123    $params = array(intval($c_album_id));
124    $list = db_get_all_limit($sql, $page_size * ($page - 1), $page_size, $params);
125   
126    $sql = 'SELECT COUNT(c_album_image_id) FROM c_album_image WHERE c_album_id = ?';
127    $params = array(intval($c_album_id));
128    $total_num = db_get_one($sql, $params);
129
130    if ($total_num != 0) {
131        $total_page_num =  ceil($total_num / $page_size);
132        if ($page >= $total_page_num) {
133            $next = false;
134        } else {
135            $next = true;
136        }
137
138        if ($page <= 1) {
139            $prev = false;
140        } else {
141            $prev = true;
142        }
143    }
144    return array($list, $prev, $next, $total_num);
145}
146
147/**
148 * 指定したアルバム画像の前の画像IDを取得する
149 * @param int $c_member_id
150 * @param int $c_album_id
151 * @param int $c_album_image_id
152 * @param int $u
153 */
154function db_album_image_c_album_image_id_prev4c_album_id($c_member_id, $c_album_id, $c_album_image_id, $u = null)
155{
156    $public_flag_condition = db_album_public_flag_condition($c_member_id, $u);
157   
158    $select  = 'SELECT c_album_image.c_album_image_id ';
159    $from    = ' FROM c_album_image, c_album';
160    $where   = ' WHERE c_album.c_album_id = c_album_image.c_album_id' . 
161                ' AND c_album.c_member_id = ?' .
162                ' AND c_album.c_album_id = ?' .
163                ' AND c_album_image.c_album_image_id < ?'
164                . $public_flag_condition;
165    $orderby = ' ORDER BY c_album_image.c_album_image_id DESC';
166    $sql = $select . $from . $where . $orderby;
167    $params = array(intval($c_member_id),intval($c_album_id),intval($c_album_image_id));
168       
169    return db_get_one($sql, $params);
170}
171
172/**
173 * 指定したアルバム画像の次の画像IDを取得する
174 * @param int $c_member_id
175 * @param int $c_album_id
176 * @param int $c_album_image_id
177 * @param int $u
178 */
179function db_album_image_c_album_image_id_next4c_album_id($c_member_id, $c_album_id, $c_album_image_id, $u = null)
180{
181    $public_flag_condition = db_album_public_flag_condition($c_member_id, $u);
182   
183    $select  = 'SELECT c_album_image.c_album_image_id ';
184    $from    = ' FROM c_album_image, c_album';
185    $where   = ' WHERE c_album.c_album_id = c_album_image.c_album_id' . 
186                ' AND c_album.c_member_id = ?' .
187                ' AND c_album.c_album_id = ?' .
188                ' AND c_album_image.c_album_image_id > ?'
189                . $public_flag_condition;
190    $orderby = ' ORDER BY c_album_image.c_album_image_id ASC';
191    $sql = $select . $from . $where . $orderby;
192    $params = array(intval($c_member_id),intval($c_album_id),intval($c_album_image_id));
193       
194    return db_get_one($sql, $params);
195}
196
197/**
198 * c_albumの閲覧権限チェック
199 * @param int $c_album_id
200 * @param int $c_member_id
201 */
202function pne_check_album_public_flag($c_album_id, $c_member_id)
203{
204    $c_album = db_album_get_c_album4c_album_id($c_album_id);
205    if ($c_album['c_member_id'] == $c_member_id) {
206        return true;
207    }
208
209    switch ($c_album['public_flag']) {
210    case 'public':
211        $allowed = true;
212        break;
213    case 'friend':
214        $allowed = db_friend_is_friend($c_album['c_member_id'], $c_member_id);
215        break;
216    case 'private':
217    default:
218        $allowed = false;
219        break;
220    }
221
222    return $allowed;
223}
224
225/**
226 * 特定ユーザーのアルバムリスト取得
227 *
228 * @param int $c_member_id target_c_member_id
229 * @param int $page_size
230 * @param int $page
231 * @param int $u viewer's c_member_id
232 */
233function p_fh_album_list_fh_my_album_list4c_member_id($c_member_id, $page_size, $page, $u = null)
234{
235    $pf_cond = db_album_public_flag_condition($c_member_id, $u);
236    $sql = 'SELECT * FROM c_album WHERE c_member_id = ?'. $pf_cond.
237           ' ORDER BY r_datetime DESC';
238    $params = array(intval($c_member_id));
239    $list = db_get_all_page($sql,$page, $page_size,$params);
240   
241    $sql = 'SELECT COUNT(c_album_id) FROM c_album WHERE c_member_id = ?' . $pf_cond;
242    $total_num = db_get_one($sql, $params);
243   
244    if ($total_num != 0) {
245        $total_page_num =  ceil($total_num / $page_size);
246        if ($page >= $total_page_num) {
247            $next = false;
248        } else {
249            $next = true;
250        }
251
252        if ($page <= 1) {
253            $prev = false;
254        } else {
255            $prev = true;
256        }
257    }
258   
259    return array($list, $prev, $next, $total_num);
260}
261
262/**
263 * アルバム検索
264 * 検索ポイントはアルバムタイトル・アルバム説明
265 * 空白(全角半角問わない)でand検索可
266 */
267function p_h_album_list_all_search_c_album4c_album($keyword, $page_size, $page, $c_member_id = '')
268{
269    $params = array();
270
271    $select = 'SELECT *';
272    $from = ' FROM c_album';
273
274    //自分のアルバムだけを対象にする事も出来る
275    if ($c_member_id) {
276        $where = ' WHERE c_member_id = ?';
277        $params[] = intval($c_member_id);
278    } else {
279        $where = " WHERE public_flag = 'public'";
280    }
281
282    //and検索を実装
283    //subject,body を検索
284    if ($keyword) {
285        //全角空白を半角に統一
286        $keyword = str_replace(' ', ' ', $keyword);
287
288        $keyword_list = explode(' ', $keyword);
289        foreach ($keyword_list as $word) {
290            $word = check_search_word($word);
291           
292            $where .= ' AND (subject LIKE ? OR description LIKE ?)';
293            $params[] = '%'.$word.'%';
294            $params[] = '%'.$word.'%';
295        }
296    }
297    $order = " ORDER BY r_datetime DESC";
298
299    $sql = $select . $from . $where . $order;
300   
301    $list = db_get_all_page($sql, $page, $page_size, $params);
302    foreach($list as $key => $value) {
303        $list[$key]['c_member'] = db_common_c_member_with_profile($value['c_member_id']);
304    }
305
306
307    $sql = 'SELECT COUNT(c_album_id)' . $from . $where;
308    $total_num = db_get_one($sql, $params);
309
310    if ($total_num != 0) {
311        $total_page_num =  ceil($total_num / $page_size);
312        if ($page >= $total_page_num) {
313            $next = false;
314        } else {
315            $next = true;
316        }
317        if ($page <= 1) {
318            $prev = false;
319        } else {
320            $prev = true;
321        }
322    }
323    return array($list , $prev , $next, $total_num);
324}
325
326/**
327 * フレンドの最新アルバムリスト
328 */
329function p_h_album_list_friend_h_album_list_friend4c_member_id($c_member_id, $page_size, $page)
330{
331    $from = "c_album, c_friend";
332    $where = "c_friend.c_member_id_from = ?" .
333            " AND c_album.c_member_id = c_friend.c_member_id_to";
334
335    $sql = "SELECT c_album.* FROM {$from} WHERE {$where}" .
336            " ORDER BY c_album.r_datetime DESC";
337    $params = array(intval($c_member_id));
338    $lst = db_get_all_page($sql, $page, $page_size, $params);
339
340    foreach ($lst as $key=>$value) {
341        $lst[$key]['c_member'] = db_common_c_member4c_member_id($value['c_member_id']);
342    }
343
344    $sql = "SELECT count(*) FROM {$from} WHERE {$where}";
345    $total_num = db_get_one($sql, $params);
346
347    if ($total_num != 0) {
348        $total_page_num =  ceil($total_num / $page_size);
349        if ($page >= $total_page_num) {
350            $next = false;
351        } else {
352            $next = true;
353        }
354
355        if ($page <= 1) {
356            $prev = false;
357        } else {
358            $prev = true;
359        }
360    }
361
362    return array($lst, $prev, $next, $total_num);
363}
364
365/**
366 * フレンド最新アルバムリスト取得
367 * 日記公開範囲を考慮
368 *
369 * @param   int $c_member_id
370 * @param   int $limit
371 * @return  array
372 */
373function p_h_home_c_album_friend_list4c_member_id($c_member_id, $limit)
374{
375    $friends = db_friend_c_member_id_list($c_member_id, true);
376    if (!$friends) {
377        return array();
378    }
379    $ids = implode(',', array_map('intval', $friends));
380
381    $sql = 'SELECT * FROM c_album' .
382            ' WHERE c_member_id IN (' . $ids . ')' .
383            ' AND public_flag <> \'private\'' .
384            ' ORDER BY u_datetime DESC';
385
386    $c_album_friend_list = db_get_all_limit($sql, 0, $limit);
387
388    foreach ($c_album_friend_list as $key => $value) {
389        $c_member = db_common_c_member4c_member_id_LIGHT($value['c_member_id']);
390        $c_album_friend_list[$key]['nickname'] = $c_member['nickname'];
391    }
392
393    return $c_album_friend_list;
394}
395
396/**
397 * アルバムを追加
398 */
399function db_album_insert_c_album($c_member_id, $subject, $description,$public_flag)
400{
401    $data = array(
402        'c_member_id' => intval($c_member_id),
403        'subject' => $subject,
404        'description' => $description,
405        'public_flag' => $public_flag,
406        'u_datetime' => db_now(),
407        'r_datetime' => db_now(),
408    );
409   
410    return db_insert('c_album', $data);
411}
412
413
414function db_album_update_c_album($c_album_id,$subject,$description,$public_flag,$image_filename)
415{
416    $data = array(
417        'subject' => $subject,
418        'description' => $description,
419        'public_flag' => $public_flag,
420        'u_datetime' => db_now(),
421    );
422    if ($image_filename) $data['album_cover_image'] = $image_filename;
423
424    $where = array(
425        'c_album_id' => intval($c_album_id),
426    );
427    return db_update('c_album', $data, $where);
428   
429}
430
431function db_album_update_c_album_image($c_album_image_id,$image_filename,$image_description,$filesize)
432{
433    $data = array(
434        'image_description' => $image_description,
435    );
436
437     if ($image_filename) {
438        $data['image_filename'] = $image_filename;
439        $data['filesize'] = $filesize;
440     }
441
442    $where = array(
443        'c_album_image_id' => intval($c_album_image_id),
444    );
445   
446    return db_update('c_album_image', $data, $where);
447
448}
449
450/**
451 * アルバムの情報を更新
452 */
453function db_album_update_c_album_cover($c_album_id,$subject,$description,$album_cover_image,$public_flag)
454{
455    $data = array(
456        'subject' => $subject,
457        'description' => $description,
458        'public_flag' => $public_flag,
459        'u_datetime' => db_now(),
460    );
461    if ($album_cover_image) $data['album_cover_image'] = $album_cover_image;
462
463    $where = array(
464        'c_album_id' => intval($c_album_id),
465    );
466
467    return db_update('c_album', $data, $where);
468}
469
470/**
471 * アルバムの表紙画像の名前を更新
472 */
473function db_album_update_c_album_album_cover_image($c_album_id,$album_cover_image)
474{
475    $data = array(
476        'album_cover_image' => $album_cover_image,
477        'u_datetime' => db_now(),
478    );
479
480    $where = array(
481        'c_album_id' => intval($c_album_id),
482    );
483    return db_update('c_album', $data, $where);
484}
485
486/**
487 * アルバムの更新日時を更新
488 * @param int $album_id
489 */
490function db_album_update_c_album_u_datetime($album_id)
491{
492        $data = array(
493        'u_datetime' => db_now(),
494    );
495   
496    $where =array(
497        'c_album_id' => $album_id,
498    );
499    return db_update('c_album',$data,$where);
500}
501
502/**
503 * c_album_imageの新規登録
504 *
505 * @param int $c_album_id
506 * @param int $c_member_id
507 * @param string $image_filename
508 * @param string $image_description
509 * @param int $filesize
510 */
511function db_insert_c_album_image($c_album_id, $c_member_id, $image_filename, $image_description, $filesize = 0)
512{
513    $data = array(
514        'c_album_id' => $c_album_id,
515        'c_member_id' => $c_member_id,
516        'image_description' => $image_description,
517        'image_filename' => $image_filename,
518        'filesize' => $filesize,
519        'r_datetime' => db_now(),
520    );
521
522    $insert_id = db_insert('c_album_image', $data);
523    if ($insert_id) {
524        db_album_update_c_album_u_datetime($c_album_id);
525    }
526
527    return $insert_id;
528}
529
530/**
531 * アルバムの削除、画像も削除
532 * @param int $c_album_id
533 */
534function db_album_delete_c_album($c_album_id)
535{
536    $sql = 'SELECT image_filename FROM c_album_image WHERE c_album_id = ?';
537    $filename_list = db_get_col($sql, array($c_album_id));
538
539    //アルバムに登録された画像
540    foreach ($filename_list as $filename) {
541        db_album_image_data_delete($filename);
542    }
543
544    // アルバムの表紙
545    $c_album = db_album_get_c_album4c_album_id($c_album_id);
546    if ($c_album['album_cover_image']) {
547        db_album_image_data_delete($c_album['album_cover_image']);
548    }
549
550    $params = array(intval($c_album_id));
551   
552    //アルバムと画像の関連
553    $sql = 'DELETE FROM c_album_image WHERE c_album_id = ?';
554    db_query($sql, $params);
555
556    // アルバム
557    $sql = 'DELETE FROM c_album WHERE c_album_id = ?';
558    db_query($sql, $params);
559
560    return;
561}
562
563/**
564 * c_album_image_idをキーとしてc_album_imageテーブルからデータを削除
565 */
566function db_album_delete_c_album_image($c_album_image_id)
567{
568    $sql = 'DELETE FROM c_album_image WHERE c_album_image_id = ?';
569    $params = array(intval($c_album_image_id));
570
571    return db_query($sql, $params);
572}
573
574/**
575 * アルバム用の画像を登録
576 */
577function image_insert_c_image_album4tmp($prefix, $tmpfile)
578{
579    if (!$tmpfile || preg_match('/[^\.\w]/', $tmpfile)) return false;
580
581    $path_parts = pathinfo($tmpfile);
582    $ext = $path_parts['extension'];
583    $ext = strtolower($ext);
584
585    $allowed_ext = array('jpg', 'jpeg', 'gif', 'png');
586    if (!in_array($ext, $allowed_ext)) {
587        return false;
588    }
589
590    $filename = sprintf('%s_%s.%s', $prefix, time(), $ext);
591
592    if (!OPENPNE_TMP_IMAGE_DB) {
593        $img_tmp_dir_path = OPENPNE_VAR_DIR . '/tmp/';
594        $filepath = $img_tmp_dir_path . basename($tmpfile);
595
596        if (db_image_insert_c_image_album2($filename, $filepath)) {
597            return $filename;
598        }
599    } else {
600        $c_tmp_image = c_tmp_image4filename($tmpfile);
601
602        $params = array(
603            'filename' => $filename,
604            'bin' => $c_tmp_image['bin'],
605            'r_datetime' => db_now(),
606            'type' => '',
607        );
608       
609        $db =& db_get_instance('image');
610        if ($db->insert("c_image", $params)) {
611            return $filename;
612        }
613    }
614    return false;
615}
616
617function db_image_insert_c_image_album2($filename, $filepath)
618{
619    if (!is_readable($filepath)) return false;
620
621    $fp = fopen($filepath, 'rb');
622    $image_data = fread($fp, filesize($filepath));
623    fclose($fp);
624
625    // 画像かどうかのチェック
626    if (!@imagecreatefromstring($image_data)) return false;
627
628    //TODO:typeフィールドを使う
629    return db_image_insert_c_image_album($filename, $image_data,$size);
630}
631
632function db_image_insert_c_image_album($filename, $bin, $type = '')
633{
634    $db =& db_get_instance('image');
635
636    $data = array(
637        'filename'   => $filename,
638        'bin'        => base64_encode($bin),
639        'type'       => $type,
640        'r_datetime' => db_now(),
641    );
642    return $db->insert('c_image', $data, 'c_image_id');
643}
644
645function db_album_image_data_delete($image_filename)
646{
647    if (!$image_filename) return false;
648
649    db_album_image_delete_c_image($image_filename);
650
651    // cacheの削除
652    image_cache_delete($image_filename);
653}
654
655function db_album_image_delete_c_image($filename)
656{
657    $db =& db_get_instance('image');
658
659    $sql = 'DELETE FROM c_image WHERE filename = ?';
660    $params = array($filename);
661    return $db->query($sql, $params);
662}
663
664function db_image_is_c_album_image4filename($filename)
665{
666    if (!$filename) return false;
667
668    $db =& db_get_instance('image');
669
670    $sql = 'SELECT c_image_id FROM c_image WHERE filename = ?';
671    $params = array($filename);
672    return (bool)$db->get_one($sql, $params);
673}
674
675/**
676 * メンバーのすべてのアルバム画像のファイルサイズの合計を取得する
677 *
678 * @params int $c_member_id
679 * @return int
680 */
681function db_album_sum_filesize4c_member_id($c_member_id)
682{
683    $sql = 'SELECT filesize FROM c_album_image WHERE c_member_id = ?';
684    $list = db_get_col($sql, array($c_member_id));
685    return array_sum($list);
686}
687
688/**
689 * メンバーが画像を投稿可能かどうか
690 *
691 * メンバーのファイルサイズの合計が OPENPNE_ALBUM_LIMIT を超過していないかどうかを返す
692 * $new_filesize を指定した場合は、メンバーのファイルサイズの合計に $new_filesize を
693 * 加算したものが OPENPNE_ALBUM_LIMIT を超過していないかどうかを返す
694 *
695 * @params int $c_member_id
696 * @params int $new_filesize
697 * @return bool
698 */ 
699function db_album_is_insertable4c_member_id($c_member_id, $new_filesize = 0)
700{
701    if (!OPENPNE_ALBUM_LIMIT) {
702        return true;
703    }
704
705    $size = db_album_sum_filesize4c_member_id($c_member_id) + $new_filesize;
706
707    $mb = 1048576;
708    if (OPENPNE_ALBUM_LIMIT * $mb < $size) {
709        return false;
710    }
711
712    return true;
713}
714
715?>
Note: See TracBrowser for help on using the repository browser.