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

source: OpenPNE/trunk/webapp/lib/db/member.php @ 6479

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

#2180:optionid->option_id

File size: 64.0 KB
Line 
1<?php
2/**
3 * @copyright 2005-2008 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 * @param bool $is_secure `c_member_secure`の項目を取得するかどうか
12 * @param bool $with_profile `c_member_profile`の項目を取得するかどうか
13 * @param string $public_flag プロフィール項目を取得する場合の公開設定(public, friend, private)
14 * @return array メンバー情報
15 */
16function db_member_c_member4c_member_id($c_member_id, $is_secure = false, $with_profile = false, $public_flag = 'public')
17{
18    static $is_recurred = false;  //再帰処理中かどうかの判定フラグ
19
20    if (!$is_recurred) {  //function cacheのために再帰処理を行う
21        $is_recurred = true;
22        $funcargs = func_get_args();
23        return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_FAST, __FUNCTION__, $funcargs);
24    }
25
26    $is_recurred = false;
27
28    if ($GLOBALS['_OPENPNE_DSN_LIST']['main']['dsn']['phptype'] == 'pgsql') {
29        $sql = "SELECT *,case when access_date = '0001-01-01 00:00:00 BC' THEN '0000-00-00 00:00:00' ELSE to_char(access_date,'YYYY-MM-DD HH24:MI:SS') END as access_date" .
30             " FROM c_member WHERE c_member_id = ?";
31    } else {
32        $sql = 'SELECT * FROM c_member WHERE c_member_id = ?';
33    }
34
35    $params = array(intval($c_member_id));
36    if (!$c_member = db_get_row($sql, $params))
37        return array();
38
39    if ($is_secure) {
40        $c_member['secure'] = db_member_c_member_secure4c_member_id($c_member_id);
41    }
42
43    if ($with_profile) {
44        $c_member['profile'] = db_member_c_member_profile_list4c_member_id($c_member_id, $public_flag);
45
46        // public_flag_birth_year
47        switch ($c_member['public_flag_birth_year']) {
48        case "friend":
49            if ($public_flag == 'public')
50                unset($c_member['birth_year']);
51            break;
52        case "private":
53            if ($public_flag == 'public' || $public_flag == 'friend')
54                unset($c_member['birth_year']);
55            break;
56        }
57    }
58   
59    if (OPENPNE_AUTH_MODE == 'slavepne' && $is_secure) {
60        $c_member['username'] = db_member_username4c_member_id($c_member_id);
61    }
62
63    return $c_member;
64}
65
66/**
67 * メンバーのプロフィールを取得
68 */
69function db_member_c_member_profile_list4c_member_id($c_member_id, $public_flag = 'public')
70{
71    switch ($public_flag) {
72    case "private":
73        $flags = "'public', 'friend', 'private'";
74        break;
75    case "friend":
76        $flags = "'public', 'friend'";
77        break;
78    case "public":
79    default:
80        $flags = "'public'";
81        break;
82    }
83
84    $sql = 'SELECT cp.name, cp.caption, cp.form_type, cm.value, cm.public_flag' .
85        ' FROM c_member_profile as cm, c_profile as cp' .
86        ' WHERE cm.c_member_id = ?'.
87            " AND cm.public_flag IN ($flags)" .
88            ' AND cm.c_profile_id = cp.c_profile_id' .
89        ' ORDER BY cp.sort_order, cp.c_profile_id, cm.c_member_profile_id';
90    $profile = db_get_all($sql, array(intval($c_member_id)));
91
92    $member_profile = array();
93    foreach ($profile as $value) {
94        $member_profile[$value['name']]['form_type'] = $value['form_type'];
95        if ($value['form_type'] == 'checkbox') {
96            $member_profile[$value['name']]['value'][] = $value['value'];
97        } else {
98            $member_profile[$value['name']]['value'] = $value['value'];
99        }
100        $member_profile[$value['name']]['caption'] = $value['caption'];
101        $member_profile[$value['name']]['public_flag'] = $value['public_flag'];
102    }
103
104    return $member_profile;
105}
106
107/**
108 * メンバーの暗号化された情報を復号化して取得
109 */
110function db_member_c_member_secure4c_member_id($c_member_id)
111{
112    $sql = 'SELECT pc_address, ktai_address, regist_address, easy_access_id, hashed_password, hashed_password_query_answer FROM c_member_secure WHERE c_member_id = ?';
113    $c_member_secure = db_get_row($sql, array(intval($c_member_id)));
114   
115    if (is_array($c_member_secure)) {
116        $c_member_secure['pc_address'] = t_decrypt($c_member_secure['pc_address']);
117        $c_member_secure['ktai_address'] = t_decrypt($c_member_secure['ktai_address']);
118        $c_member_secure['regist_address'] = t_decrypt($c_member_secure['regist_address']);
119    }
120    return $c_member_secure;
121}
122
123/**
124 * メンバー情報をプロフィール付きで取得する
125 * (secure情報は取得しない)
126 *
127 * @param int $c_member_id
128 * @param string $public_flag 取得するプロフィール項目の公開レベル(public, friend, private)
129 * @return array メンバー情報
130 */
131function db_member_c_member_with_profile($c_member_id, $public_flag = 'public')
132{
133    return db_member_c_member4c_member_id($c_member_id, false, true, $public_flag);
134}
135
136/**
137 * メンバー情報のよく使う部分のみを取得する
138 *
139 * - メンバーID
140 * - ニックネーム
141 * - メイン画像
142 * のみを取得する。
143 *
144 * @param int $c_member_id
145 * @return array メンバー情報
146 */
147function db_member_c_member4c_member_id_LIGHT($c_member_id)
148{
149    static $results;
150    if (!isset($results[$c_member_id])) {
151        $sql = 'SELECT c_member_id, nickname, image_filename FROM c_member WHERE c_member_id = ?';
152        $results[$c_member_id] = db_get_row($sql, array(intval($c_member_id)));
153    }
154    return $results[$c_member_id];
155}
156
157/**
158 * PCメールアドレスからメンバーIDを取得(ログインに必要)
159 *
160 * @param   string $pc_address
161 * @return  int    $c_member_id
162 */
163function db_member_c_member_id4pc_address($pc_address)
164{
165    return _db_c_member_id4pc_address_encrypted(t_encrypt($pc_address));
166}
167
168function db_member_c_member_id4pc_address_encrypted($pc_address_encoded)
169{
170    $sql = 'SELECT c_member_id FROM c_member_secure WHERE pc_address = ?';
171    $params = array($pc_address_encoded);
172    return db_get_one($sql, $params);
173}
174
175function db_member_c_member_id4ktai_address_encrypted($ktai_address_encoded)
176{
177    $sql = 'SELECT c_member_id FROM c_member_secure WHERE ktai_address = ?';
178    $params = array($ktai_address_encoded);
179    return db_get_one($sql, $params);
180}
181
182/**
183 * アクティブメンバーか?
184 */
185function db_member_is_active_c_member_id($c_member_id)
186{
187    $sql = 'SELECT c_member_id FROM c_member WHERE c_member_id = ?';
188    $params = array(intval($c_member_id));
189    return (bool)db_get_one($sql, $params);
190}
191
192/**
193 * セッションからc_member_preを返す
194 */
195function db_member_c_member_pre4c_member_pre_session($session)
196{
197    $sql = 'SELECT * FROM c_member_pre WHERE session = ?';
198    $params = array($session);
199    $c_member = db_get_row($sql, $params);
200
201    //秘密の質問
202    $c_password_query_id = $c_member['c_password_query_id'];
203    $c_password_query_list = p_common_c_password_query4null();
204
205    $c_member['c_password_query_name'] = $c_password_query_list["$c_password_query_id"];
206
207    $sql = 'SELECT p.name, p.caption, p.form_type, m.value, m.public_flag' .
208        ' FROM c_member_pre_profile AS m' .
209             ' INNER JOIN c_profile AS p USING (c_profile_id)' .
210        ' WHERE m.c_member_pre_id = ?' .
211        ' ORDER BY p.sort_order, p.c_profile_id, m.c_member_pre_profile_id';
212    $params = array(intval($c_member['c_member_pre_id']));
213    $profile = db_get_all($sql, $params);
214
215    $member_profile = array();
216    foreach ($profile as $value) {
217        $member_profile[$value['name']]['form_type'] = $value['form_type'];
218        if ($value['form_type'] == 'checkbox') {
219            $member_profile[$value['name']]['value'][] = $value['value'];
220        } else {
221            $member_profile[$value['name']]['value'] = $value['value'];
222        }
223        $member_profile[$value['name']]['caption'] = $value['caption'];
224        $member_profile[$value['name']]['public_flag'] = $value['public_flag'];
225    }
226
227    $c_member['profile'] = $member_profile;
228    return $c_member;
229}
230
231function db_member_is_active_sid($sid)
232{
233    $sql = 'SELECT c_member_pre_id FROM c_member_pre WHERE session = ?';
234    $params = array($sid);
235    return (bool)db_get_one($sql, $params);
236}
237
238function db_member_search($cond, $cond_like, $page_size, $page, $c_member_id, $profiles)
239{
240    $page = intval($page);
241    $page_size = intval($page_size);
242
243    $wheres = array();
244    $params = array();
245
246    foreach ($cond as $key => $value) {
247        if ($value) {
248            if ($key == 'image') {
249                $wheres[] = "image_filename <> '' AND image_filename <> '0'";
250            } else {
251                $wheres[] = db_escapeIdentifier($key) . ' = ?';
252                $params[] = $value;
253                if ($key == 'birth_year') {
254                    $wheres[] = "public_flag_birth_year = 'public'";
255                }
256            }
257        }
258    }
259    foreach ($cond_like as $key => $value) {
260        if ($value) {
261            $wheres[] = db_escapeIdentifier($key) . ' LIKE ?';
262            $params[] = '%' . $value . '%';
263        }
264    }
265    if ($wheres) {
266        $where = ' WHERE ' . implode(' AND ', $wheres);
267    } else {
268        $where = '';
269    }
270
271    $from = " FROM c_member" . $hint;
272    $order = " ORDER BY c_member_id DESC";
273    $sql = "SELECT c_member_id" . $from . $where . $order;
274
275    $result_ids = db_get_col($sql, $params);
276
277    foreach ($profiles as $key => $value) {
278        $sql = "SELECT c_member_id FROM c_member_profile";
279        $sql .= " WHERE c_profile_id = ? AND public_flag = 'public'";
280        $params = array(intval($value['c_profile_id']));
281
282        if ($value['form_type'] == "text" || $value['form_type'] == "textlong" || $value['form_type'] == 'textarea') {
283            $sql .= " AND value LIKE ?";
284            $params[] = '%'.$value['value'].'%';
285        } elseif (is_array($value['c_profile_option_id'])) {
286            $values = implode(',', array_map('intval', $value['c_profile_option_id']));
287            $sql .= " AND c_profile_option_id IN (". $values .")";
288        } else {
289            $sql .= " AND c_profile_option_id = ?";
290            $params[] = intval($value['c_profile_option_id']);
291        }
292        $sql .= " ORDER BY c_member_id DESC";
293
294        $ids = db_get_col($sql, $params);
295        $result_ids = array_values(array_intersect($result_ids, $ids));
296    }
297
298    $start = ($page - 1) * $page_size;
299
300    $list = array();
301    for ($i = $start; $i < $start + $page_size && $result_ids[$i]; $i++) {
302        $c_member = db_member_c_member_with_profile($result_ids[$i], 'public');
303        $c_member['last_login'] = p_f_home_last_login4access_date($c_member['access_date']);
304        $list[] = $c_member;
305    }
306
307    $total_num = count($result_ids);
308
309    if ($total_num != 0) {
310        $total_page_num =  ceil($total_num / $page_size);
311        if ($page >= $total_page_num) {
312            $next = false;
313        } else {
314            $next = $page + 1;
315        }
316        if ($page <= 1) {
317            $prev = false;
318        } else {
319            $prev = $page - 1;
320        }
321    }
322    return array($list, $prev, $next, $total_num);
323}
324
325function db_member_inviting_member4c_member_id($c_member_id)
326{
327    $sql = 'SELECT * FROM c_member_pre WHERE c_member_id_invite = ? ORDER BY r_date DESC';
328    $params = array(intval($c_member_id));
329    return db_get_all($sql, $params);
330}
331
332function db_member_birthday_flag4c_member_id($c_member_id)
333{
334    $c_member = db_member_c_member4c_member_id($c_member_id);
335    $birthday = $c_member['birth_month'] . "-" . $c_member['birth_day'];
336
337    return (bool)(date("n-j") == $birthday);
338}
339
340/**
341 * あるメンバーがアクセスブロックしているメンバーIDのリストを取得
342 */
343function db_member_c_member_id_block4c_member_id($c_member_id)
344{
345    $sql = 'SELECT c_member_id_block FROM c_access_block WHERE c_member_id = ?';
346    $params = array(intval($c_member_id));
347    return db_get_col($sql, $params);
348}
349
350/**
351 * あるメンバーをアクセスブロックしているメンバーIDのリストを取得
352 */
353function db_member_access_block_list4c_member_id_to($c_member_id_to)
354{
355    $sql = 'SELECT c_member_id FROM c_access_block WHERE c_member_id_block = ?';
356    $params = array(intval($c_member_id_to));
357    return db_get_col($sql, $params);
358}
359
360/**
361 * {c_member_id}が{target_...}にアクセスブロックされているかどうか
362 */
363function db_member_is_access_block($c_member_id, $target_c_member_id)
364{
365    $sql = 'SELECT c_access_block_id FROM c_access_block' .
366            ' WHERE c_member_id = ? AND c_member_id_block = ?';
367    $params = array(intval($target_c_member_id), intval($c_member_id));
368    return (bool)db_get_one($sql, $params);
369}
370
371/**
372 * 次の誕生日まであと何日?
373 *
374 * @param int $c_member_id
375 * @return int 日数(当日は0)
376 */
377function db_member_count_days_birthday4c_member_id($c_member_id)
378{
379    $c_member = db_member_c_member4c_member_id($c_member_id);
380    return getCountdownDays($c_member['birth_month'], $c_member['birth_day']);
381}
382
383function db_member_search_check_profile($profile)
384{
385    $result_list = array();
386
387    foreach ($profile as $key => $v) {
388        if (!$v) continue;
389
390        $sql = 'SELECT * FROM c_profile WHERE name = ?';
391        $params = array($key);
392        $c_profile = db_get_row($sql, $params);
393        if (!($c_profile && $c_profile['disp_search'])) continue;
394
395        $public_flags = array('public', 'friend', 'private');
396        if (!$c_profile['public_flag_edit']
397            && $c_profile['public_flag_default'] != 'public') {
398            // 公開項目以外は除外
399            continue;
400        }
401
402        switch ($c_profile['form_type']) {
403        case "text":
404        case "textarea":
405        case "textlong":
406            $value = $v;
407            $c_profile_option_id = 0;
408            break;
409        case "select":
410        case "radio":
411            $value = "";
412            $c_profile_option_id = $v;
413            break;
414        case "checkbox":
415            $value = array();
416            $c_profile_option_id = $v;
417            break;
418        default:
419            break;
420        }
421
422        $result_list[$c_profile['name']] = array(
423            "c_profile_id" => $c_profile['c_profile_id'],
424            "c_profile_option_id" => $c_profile_option_id,
425            "value" => $value,
426            "form_type" => $c_profile['form_type'],
427        );
428    }
429
430    return $result_list;
431}
432
433function db_member_count_c_member_profile()
434{
435    $sql = 'SELECT c_profile_option_id, COUNT(DISTINCT c_member_id)' .
436        ' FROM c_member_profile' .
437        ' WHERE public_flag = \'public\'' .
438        ' AND c_profile_option_id > 0' .
439        ' GROUP BY c_profile_option_id';
440    return db_get_assoc($sql);
441}
442
443function db_member_birth4c_member_id($month, $day, $c_member_id)
444{
445    static $is_recurred = false;  //再帰処理中かどうかの判定フラグ
446
447    if (!$is_recurred) {  //function cacheのために再帰処理を行う
448        $is_recurred = true;
449        $funcargs = func_get_args();
450        return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_LONG, __FUNCTION__, $funcargs);
451    }
452
453    $is_recurred = false;
454
455
456    $sql = "SELECT c_member_id_to FROM c_friend WHERE c_member_id_from = ?";
457    $params = array(intval($c_member_id));
458    $ids = db_get_col($sql, $params);
459    $ids[] = $c_member_id;
460    $ids = implode(", ", $ids);
461
462    $sql = "SELECT * FROM c_member" .
463        " WHERE c_member_id IN (". $ids . ")" .
464        " AND birth_day = ?" .
465        " AND birth_month = ?";
466    $params = array(intval($day), intval($month));
467    return db_get_all($sql, $params);
468}
469
470function db_member_c_member_list4exists_rss()
471{
472    $sql = "SELECT * FROM c_member WHERE rss <> ''";
473    return db_get_all($sql);
474}
475
476function db_member_c_member_list4no_exists_rss()
477{
478    $sql = "SELECT * FROM c_member WHERE rss = ''";
479    return db_get_all($sql);
480}
481
482function db_member_c_profile_list4null()
483{
484    $sql = 'SELECT * FROM c_profile ORDER BY sort_order, c_profile_id';
485    return db_get_all($sql);
486}
487
488function db_member_c_profile_option_list4c_profile_id($c_profile_id)
489{
490    $sql = 'SELECT * FROM c_profile_option WHERE c_profile_id = ? ORDER BY sort_order, c_profile_option_id';
491    $params = array(intval($c_profile_id));
492    return db_get_all($sql, $params);
493}
494
495function db_member_c_profile_list()
496{
497    static $is_recurred = false;  //再帰処理中かどうかの判定フラグ
498
499    if (!$is_recurred) {  //function cacheのために再帰処理を行う
500        $is_recurred = true;
501        $funcargs = func_get_args();
502        return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_FAST, __FUNCTION__, $funcargs);
503    }
504
505    $is_recurred = false;
506
507    $list = db_member_c_profile_list4null();
508
509    $profile_list = array();
510    foreach ($list as $value) {
511        $profile_list[$value['name']] = $value;
512        $profile_list[$value['name']]['options'] = db_member_c_profile_option_list4c_profile_id($value['c_profile_id']);
513    }
514    return $profile_list;
515}
516
517function db_member_main_image_filename_number($c_member_id)
518{
519    $c_member = db_member_c_member4c_member_id($c_member_id);
520    if (empty($c_member['image_filename'])) {
521        return 0;
522    }
523
524    if ($c_member['image_filename'] == $c_member['image_filename_1'])
525        return 1;
526    elseif ($c_member['image_filename'] == $c_member['image_filename_2'])
527        return 2;
528    elseif ($c_member['image_filename'] == $c_member['image_filename_3'])
529        return 3;
530    else
531        return 0;
532}
533
534function db_member_c_member_pre4sid($sid)
535{
536    $sql = 'SELECT * FROM c_member_pre WHERE session = ?';
537    $params = array($sid);
538    return db_get_row($sql, $params);
539}
540
541function db_member_c_member_pre4pc_address($pc_address)
542{
543    $sql = 'SELECT * FROM c_member_pre WHERE pc_address = ?';
544    $params = array($pc_address);
545    return db_get_row($sql, $params);
546}
547
548function db_member_c_member4pc_address($pc_address)
549{
550    $sql = 'SELECT * FROM c_member_secure WHERE pc_address = ?';
551    $params = array(t_encrypt($pc_address));
552    return db_get_row($sql, $params);
553}
554
555function db_member_c_member_list4daily_news()
556{
557    $sql = 'SELECT c_member_id, is_receive_daily_news FROM c_member' .
558            ' WHERE is_receive_daily_news > 0';
559    return db_get_all($sql);
560}
561
562/***
563 * デイリーニュース配信対象者数を取得する
564 *
565 * @return array
566 */
567function db_member_count_c_member_is_receive_daily_news()
568{
569    $list = array();
570
571    // 毎日デイリーニュースを受け取るメンバー数の取得
572    $sql = 'SELECT COUNT(*) FROM c_member' .
573        ' WHERE is_receive_daily_news = 1';
574    $list['every_day'] = db_get_one($sql);
575
576    // DAILY_NEWS_DAY(管理画面から設定)のみデイリーニュースを受け取るメンバー数の取得
577    $sql = 'SELECT COUNT(*) FROM c_member' .
578        ' WHERE is_receive_daily_news = 2';
579    $list['daily_news_day'] = db_get_one($sql);
580
581    return $list;
582}
583
584function db_member_c_member_list4birthday_mail()
585{
586    // この日が誕生日の人を対称にする
587    $target_date = "+1 week";
588
589    $timestamp = strtotime($target_date);
590    $month = date("n", $timestamp);
591    $day   = date("j", $timestamp);
592
593    $sql = 'SELECT * FROM c_member WHERE birth_month = ? AND birth_day = ?';
594    $params = array(intval($month), intval($day));
595    return db_get_all($sql, $params);
596}
597
598/**
599 * パスワードクエリが合っているか判定
600 */
601function db_member_is_password_query_complete($pc_address, $query_id, $query_answer)
602{
603    $sql = "SELECT c_member.c_member_id" .
604        " FROM c_member, c_member_secure" .
605        " WHERE c_member_secure.pc_address = ?" .
606        " AND c_member.c_password_query_id = ?" .
607        " AND c_member_secure.hashed_password_query_answer = ?" .
608        " AND c_member.c_member_id = c_member_secure.c_member_id";
609    $params = array(
610        t_encrypt($pc_address),
611        intval($query_id),
612        md5($query_answer)
613    );
614    if ($c_member_id = db_get_one($sql, $params)) {
615        return $c_member_id;
616    }
617
618    // 1.8以前との互換性を保つため、SJISでのチェックも行う
619    $params = array(
620        t_encrypt($pc_address),
621        intval($query_id),
622        md5(mb_convert_encoding($query_answer, 'SJIS-win', 'UTF-8'))
623    );
624    return db_get_one($sql, $params);
625}
626
627function db_member_c_member_id4ktai_address2($ktai_address)
628{
629    if (!$ktai_address) {
630        return null;
631    }
632
633    $sql = "SELECT c_member_id FROM c_member_secure WHERE ktai_address = ?";
634    $params = array(t_encrypt($ktai_address));
635    return db_get_one($sql, $params);
636}
637
638function db_member_inviting_member4c_member_id2($c_member_id)
639{
640    $sql = "SELECT * FROM c_member_ktai_pre WHERE c_member_id_invite = ?";
641    $params = array(intval($c_member_id));
642    return db_get_all($sql, $params);
643}
644
645/**
646 * 対象のメールアドレスが、登録されてるか否か
647 *
648 * @param string $mail_address
649 * @param int $c_member_id チェックから除外するメンバーID
650 * @param bool $is_check_pre    c_member_pre をチェックするかどうか
651 */
652function db_member_is_sns_join4mail_address($mail_address, $c_member_id = 0, $is_check_pre = false)
653{
654    $params = array(t_encrypt($mail_address), intval($c_member_id));
655
656    $sql = "SELECT c_member_id FROM c_member_secure WHERE pc_address = ? AND c_member_id <> ?";
657    $array = db_get_row($sql, $params);
658
659    $sql = "SELECT c_member_id FROM c_member_secure WHERE ktai_address = ? AND c_member_id <> ?";
660    $k_array = db_get_row($sql, $params);
661
662    if ($is_check_pre) {
663        $sql = 'SELECT c_member_pre_id FROM c_member_pre WHERE ktai_address = ?';
664        $params = array($mail_address);
665        $p_array = db_get_row($sql, $params);
666    } else {
667        $p_array = array();
668    }
669
670    //対象のメールアドレスが登録済み
671    if ($array['c_member_id'] || $k_array['c_member_id'] || $p_array['c_member_pre_id']) {
672        return true;
673    } else {
674        return false;
675    }
676}
677
678//対象のメールアドレスが、ドメイン制限に合致しているかどうか
679function db_member_is_limit_domain4mail_address($mail_address)
680{
681    // メールアドレスとして正しくない
682    if (!db_common_is_mailaddress($mail_address)) {
683        return false;
684    }
685
686    // 携帯メールアドレスは制限しない
687    if (is_ktai_mail_address($mail_address)) {
688        return true;
689    }
690
691    //ドメイン未設定なら無条件でOK
692    if (LIMIT_DOMAIN1 == '' &&
693        LIMIT_DOMAIN2 == '' &&
694        LIMIT_DOMAIN3 == '' &&
695        LIMIT_DOMAIN4 == '' &&
696        LIMIT_DOMAIN5 == '' 
697    ) {
698        return true;
699    }
700
701    $arr = explode('@', $mail_address);
702    $mail_domain = $arr[1];
703
704    $domains = array(LIMIT_DOMAIN1,
705                     LIMIT_DOMAIN2,
706                     LIMIT_DOMAIN3,
707                     LIMIT_DOMAIN4,
708                     LIMIT_DOMAIN5,
709               );
710
711    foreach ($domains as $domain) {
712        if ($domain) {
713            $regexp = str_replace('\*', '.*', preg_quote($domain, '/'));
714            if (preg_match(sprintf('/%s/', $regexp), $mail_domain)) {
715                return true;
716            }
717        }
718    }
719    return false;
720}
721function db_member_c_member_ktai_pre4ktai_address($ktai_address)
722{
723    $sql = 'SELECT * FROM c_member_ktai_pre WHERE ktai_address = ?';
724    $params = array($ktai_address);
725    return db_get_row($sql, $params);
726}
727
728/**
729 * 携帯認証用
730 */
731function db_member_k_auth($c_member_id)
732{
733    $sql = 'SELECT c_member_id FROM c_member WHERE c_member_id = ?';
734    $params = array(intval($c_member_id));
735    return db_get_one($sql, $params);
736}
737
738function db_member_k_auth_login($ktai_address, $password)
739{
740    if (!$ktai_address or !$password) {
741        return false;
742    }
743   
744    $c_member_id = db_member_c_member_id4username($ktai_address, true);
745    $sql = "SELECT hashed_password FROM c_member_secure " .
746            " WHERE c_member_id = ? ";
747    if (md5($password) != db_get_one($sql, array($c_member_id))) {
748        return false;
749    }
750   
751    return $c_member_id;
752}
753
754function db_member_c_ktai_address_pre4session($session)
755{
756    $sql = 'SELECT * FROM c_ktai_address_pre WHERE session = ?';
757    $params = array($session);
758    return db_get_row($sql, $params);
759}
760
761function db_member_c_member_ktai_pre4session($session)
762{
763    $sql = 'SELECT * FROM c_member_ktai_pre WHERE session = ?';
764    $params = array($session);
765    return db_get_row($sql, $params);
766}
767
768function db_member_c_member_pre4ktai_session($ktai_session)
769{
770    $sql = 'SELECT * FROM c_member_pre WHERE ktai_session = ?';
771    $params = array($ktai_session);
772    return db_get_row($sql, $params);
773}
774
775/**
776 * メンバーIDからハッシュ化されたパスワードを取得
777 * (携帯の認証に暫定的に用いる)
778 *
779 * @param int $c_member_id
780 * @return string hashed password
781 */
782function db_member_hashed_password4c_member_id($c_member_id)
783{
784    $sql = 'SELECT hashed_password FROM c_member_secure WHERE c_member_id = ?';
785    $params = array(intval($c_member_id));
786    return db_get_one($sql, $params);
787}
788
789function db_member_is_password_query_complete2($ktai_address, $query_id, $query_answer)
790{
791    $sql = "SELECT c_member.c_member_id" .
792        " FROM c_member, c_member_secure" .
793        " WHERE c_member_secure.ktai_address = ?" .
794        " AND c_member.c_password_query_id = ?" .
795        " AND c_member_secure.hashed_password_query_answer = ?" .
796        " AND c_member.c_member_id = c_member_secure.c_member_id";
797    $params = array(
798        t_encrypt($ktai_address),
799        intval($query_id),
800        md5($query_answer)
801    );
802    if ($c_member_id = db_get_one($sql, $params)) {
803        return $c_member_id;
804    }
805
806    // 1.8以前との互換性を保つため、SJISでのチェックも行う
807    $params = array(
808        t_encrypt($ktai_address),
809        intval($query_id),
810        md5(mb_convert_encoding($query_answer, 'SJIS-win', 'UTF-8'))
811    );
812    return db_get_one($sql, $params);
813}
814
815function db_member_c_member_id4easy_access_id($easy_access_id, $md5 = true)
816{
817    if (!$easy_access_id) return false;
818
819    $sql = 'SELECT c_member_id FROM c_member_secure WHERE easy_access_id = ?';
820    if ($md5) {
821        $easy_access_id = md5($easy_access_id);
822    }
823    $params = array($easy_access_id);
824    return db_get_one($sql, $params);
825}
826
827function db_member_check_profile($profile_list, $public_flag_list)
828{
829    $result_list = array();
830
831    foreach ($profile_list as $key => $v) {
832        $sql = 'SELECT c_profile_id, is_required, public_flag_edit, public_flag_default, form_type, name' .
833                ' FROM c_profile WHERE name = ?';
834        $params = array($key);
835        $c_profile = db_get_row($sql, $params);
836
837        switch ($c_profile['form_type']) {
838        case 'text':
839        case 'textlong':
840        case 'textarea':
841            $value = $v;
842            $c_profile_option_id = 0;
843            break;
844        case 'select':
845        case 'radio':
846            $sql = 'SELECT value FROM c_profile_option' .
847                    ' WHERE c_profile_option_id = ? AND c_profile_id = ?';
848            $params = array(intval($v), intval($c_profile['c_profile_id']));
849            $value = db_get_one($sql, $params);
850            $c_profile_option_id = $v;
851            break;
852        case 'checkbox':
853            $value = array();
854            $c_profile_option_id = $v;
855            if (!$v) break;
856
857            $sql = "SELECT c_profile_option_id, value FROM c_profile_option" .
858                " WHERE c_profile_option_id IN (". implode(",", array_map('intval', $v)). ")" .
859                " AND c_profile_id = ?".
860                " ORDER BY sort_order, c_profile_option_id";
861            $params = array(intval($c_profile['c_profile_id']));
862            $list = db_get_all($sql, $params);
863            foreach ($list as $item) {
864                $value[$item['c_profile_option_id']] = $item['value'];
865            }
866            break;
867        default:
868            $value = '';
869            $c_profile_option_id = 0;
870            break;
871        }
872
873        $public_flags = array('public', 'friend', 'private');
874        if ($c_profile['public_flag_edit']
875            && in_array($public_flag_list[$key], $public_flags)) {
876            $public_flag = $public_flag_list[$key];
877        } else {
878            $public_flag = $c_profile['public_flag_default'];
879        }
880
881        $result_list[$c_profile['name']] = array(
882            'c_profile_id' => $c_profile['c_profile_id'],
883            'c_profile_option_id' => $c_profile_option_id,
884            'value' => $value,
885            'public_flag' => $public_flag,
886        );
887    }
888
889    return $result_list;
890}
891
892/**
893 * すべてのメンバーのメンバーIDを取得
894 */
895function db_member_c_member_id_list4null()
896{
897    $sql = 'SELECT c_member_id FROM c_member';
898
899    return db_get_col($sql);
900}
901
902function db_member_is_login_rejected($c_member_id)
903{
904    $sql = 'SELECT is_login_rejected FROM c_member WHERE c_member_id = ?';
905    $params = array(intval($c_member_id));
906    return db_get_one($sql, $params);
907}
908
909/**
910 * メンバーが忍び足(あしあとをつけない)状態かどうかを取得
911 *
912 * @param   int $c_member_id
913 * @return  bool
914 */
915function db_member_is_shinobiashi($c_member_id)
916{
917    $sql = "SELECT is_shinobiashi FROM c_member WHERE c_member_id = ?";
918    $params = array(intval($c_member_id));
919    return db_get_one($sql, $params);
920}
921
922/*** write ***/
923
924//--- c_member
925
926/**
927 * プロフィール変更(c_memberテーブル分)
928 */
929function db_member_config_prof_new($c_member_id, $prof_list)
930{
931    //function cacheの削除
932    cache_drop_c_member_profile($c_member_id);
933
934    $data = array(
935        'nickname' => $prof_list['nickname'],
936        'birth_year'  => intval($prof_list['birth_year']),
937        'birth_month' => intval($prof_list['birth_month']),
938        'birth_day'   => intval($prof_list['birth_day']),
939        'public_flag_birth_year' => $prof_list['public_flag_birth_year'],
940        'u_datetime' => db_now(),
941    );
942    $where = array('c_member_id' => intval($c_member_id));
943    return db_update('c_member', $data, $where);
944}
945
946/**
947 * アクセス日時を更新
948 */
949function db_member_do_access($c_member_id)
950{
951    $data = array('access_date' => db_now());
952    $where = array('c_member_id' => intval($c_member_id));
953    return db_update('c_member', $data, $where);
954}
955
956//(image)
957
958/**
959 * プロフィール画像の変更
960 */
961function db_member_config_image_new($c_member_id, $image_filename, $img_num)
962{
963    //function cacheの削除
964    cache_drop_c_member_profile($c_member_id);
965
966    $data = array('image_filename_'.intval($img_num) => $image_filename);
967    $where = array('c_member_id' => intval($c_member_id));
968    return db_update('c_member', $data, $where);
969}
970
971/**
972 * プロフィール画像の削除
973 */
974function db_member_delete_c_member_image_new($c_member_id, $img_num)
975{
976    //function cacheの削除
977    cache_drop_c_member_profile($c_member_id);
978
979    $sql = 'UPDATE c_member SET';
980    if ($img_num == 1) {
981        $sql .= ' image_filename_1 = image_filename_2,';
982    }
983    if ($img_num == 1 || $img_num == 2) {
984        $sql .= ' image_filename_2 = image_filename_3,';
985    }
986    $sql .= ' image_filename_3 = \'\'';
987    $sql .= ' WHERE c_member_id = ?';
988    $params = array(intval($c_member_id));
989    return db_query($sql, $params);
990}
991
992/**
993 * メイン画像の変更
994 */
995function db_member_change_c_member_main_image($c_member_id, $img_num)
996{
997    //function cacheの削除
998    cache_drop_c_member_profile($c_member_id);
999
1000    $sql = 'UPDATE c_member SET image_filename = image_filename_'.intval($img_num).
1001        ' WHERE c_member_id = ?';
1002    $params = array(intval($c_member_id));
1003    return db_query($sql, $params);
1004}
1005
1006/**
1007 * メイン画像を登録する
1008 */
1009function db_member_update_c_member_image($c_member_id, $image_filename, $img_num)
1010{
1011    //function cacheの削除
1012    cache_drop_c_member_profile($c_member_id);
1013
1014    $data = array(
1015        'image_filename' => $image_filename,
1016        'image_filename_'.intval($img_num) => $image_filename,
1017    );
1018    $where = array('c_member_id' => intval($c_member_id));
1019    return db_update('c_member', $data, $where);
1020}
1021
1022/**
1023 * My Newsを更新する
1024 */
1025function db_member_update_c_profile_my_news($c_member_id, $prof_my_news, $my_news_datetime)
1026{
1027    $sql = 'SELECT c_profile_id FROM c_profile WHERE name = ? ';
1028    $prof_my_news_id = db_get_one($sql, array('PNE_MY_NEWS'));
1029    $my_news_datetime_id = db_get_one($sql, array('PNE_MY_NEWS_DATETIME'));
1030   
1031    // function cache削除
1032    cache_drop_c_member_profile($c_member_id);
1033   
1034    $sql = 'DELETE FROM c_member_profile' .
1035            ' WHERE c_member_id = ? AND c_profile_id = ?';
1036    $params = array(intval($c_member_id), $prof_my_news_id);
1037    db_query($sql, $params);
1038    do_config_prof_insert_c_member_profile($c_member_id, $prof_my_news_id, '', $prof_my_news, 'private');
1039   
1040    $sql = 'DELETE FROM c_member_profile' .
1041            ' WHERE c_member_id = ? AND c_profile_id = ?';
1042    $params = array(intval($c_member_id), $my_news_datetime_id);
1043    db_query($sql, $params);
1044    do_config_prof_insert_c_member_profile($c_member_id, $my_news_datetime_id, '', $my_news_datetime, 'private');
1045}
1046
1047//--- c_member_secure
1048
1049function db_member_insert_c_member($c_member, $c_member_secure, $is_password_encrypted = false)
1050{
1051    if ($c_member_secure['pc_address'] && !util_is_regist_mail_address($c_member_secure['pc_address'])) {
1052        return false;
1053    }
1054
1055    if ($c_member_secure['ktai_address'] && !util_is_regist_mail_address($c_member_secure['ktai_address'])) {
1056        return false;
1057    }
1058
1059    if (!util_is_regist_mail_address($c_member_secure['regist_address'])) {
1060        return false;
1061    }
1062
1063    $data = array(
1064        'nickname'    => $c_member['nickname'],
1065        'birth_year'  => intval($c_member['birth_year']),
1066        'birth_month' => intval($c_member['birth_month']),
1067        'birth_day'   => intval($c_member['birth_day']),
1068        'public_flag_birth_year' => $c_member['public_flag_birth_year'],
1069        'c_member_id_invite'  => intval($c_member['c_member_id_invite']),
1070        'c_password_query_id' => intval($c_member['c_password_query_id']),
1071        'is_receive_mail' => (bool)$c_member['is_receive_mail'],
1072        'is_receive_ktai_mail'  => (bool)$c_member['is_receive_ktai_mail'],
1073        'is_receive_daily_news' => intval($c_member['is_receive_daily_news']),
1074        'r_date' => db_now(),
1075        'u_datetime' => db_now(),
1076        'image_filename' => '',
1077        'image_filename_1' => '',
1078        'image_filename_2' => '',
1079        'image_filename_3' => '',
1080        'rss' => '',
1081    );
1082    $c_member_id = db_insert('c_member', $data);
1083
1084    //function cacheの削除
1085    cache_drop_c_member_profile($c_member_id);
1086
1087    if ($c_member_secure['ktai_address']) {
1088        $c_member_secure['ktai_address'] = str_replace('"', '', $c_member_secure['ktai_address']);
1089        $c_member_secure['regist_address'] = str_replace('"', '', $c_member_secure['regist_address']);
1090    }
1091
1092    $data = array(
1093        'c_member_id' => intval($c_member_id),
1094        'hashed_password' => md5($c_member_secure['password']),
1095        'hashed_password_query_answer' => md5($c_member_secure['password_query_answer']),
1096        'pc_address'     => t_encrypt($c_member_secure['pc_address']),
1097        'ktai_address'   => t_encrypt($c_member_secure['ktai_address']),
1098        'regist_address' => t_encrypt($c_member_secure['regist_address']),
1099        'easy_access_id' => '',
1100    );
1101
1102    if ($is_password_encrypted) {
1103        $data['hashed_password'] = $c_member_secure['password'];
1104        $data['hashed_password_query_answer'] = $c_member_secure['password_query_answer'];
1105    }
1106
1107    db_insert('c_member_secure', $data);
1108
1109    return $c_member_id;
1110}
1111
1112function db_member_ktai_insert_c_member($profs)
1113{
1114    if (!util_is_regist_mail_address($profs['ktai_address'])) {
1115        return false;
1116    }
1117
1118    $data = array(
1119        'nickname' => $profs['nickname'],
1120        'birth_year' => intval($profs['birth_year']),
1121        'birth_month' => intval($profs['birth_month']),
1122        'birth_day' => intval($profs['birth_day']),
1123        'public_flag_birth_year' => $profs['public_flag_birth_year'],
1124        'r_date' => db_now(),
1125        'u_datetime' => db_now(),
1126        'is_receive_ktai_mail' => 1,
1127        'c_member_id_invite' => intval($profs['c_member_id_invite']),
1128        'c_password_query_id' => intval($profs['c_password_query_id']),
1129        'image_filename' => '',
1130        'image_filename_1' => '',
1131        'image_filename_2' => '',
1132        'image_filename_3' => '',
1133        'rss' => '',
1134    );
1135    $c_member_id_new = db_insert('c_member', $data);
1136
1137    if ($profs['ktai_address']) {
1138        $profs['ktai_address'] = str_replace('"', '', $profs['ktai_address']);
1139        $profs['regist_address'] = str_replace('"', '', $profs['regist_address']);
1140    }
1141    $data = array(
1142        'c_member_id' => intval($c_member_id_new),
1143        'hashed_password' => md5($profs['password']),
1144        'hashed_password_query_answer' => md5($profs['password_query_answer']),
1145        'pc_address' => '',
1146        'ktai_address' => t_encrypt($profs['ktai_address']),
1147        'regist_address' => t_encrypt($profs['ktai_address']),
1148        'easy_access_id' => '',
1149    );
1150    db_insert('c_member_secure', $data);
1151
1152    return $c_member_id_new;
1153}
1154
1155function db_member_update_c_member_pre_secure($c_member_pre_id, $c_member_pre_secure, $is_encrypted_password = false)
1156{
1157    $data = array(
1158        'session' => $c_member_pre_secure['session'],
1159        'nickname'    => $c_member_pre_secure['nickname'],
1160        'birth_year'  => intval($c_member_pre_secure['birth_year']),
1161        'birth_month' => intval($c_member_pre_secure['birth_month']),
1162        'birth_day'   => intval($c_member_pre_secure['birth_day']),
1163        'public_flag_birth_year' => $c_member_pre_secure['public_flag_birth_year'],
1164        'c_password_query_id' => intval($c_member_pre_secure['c_password_query_id']),
1165        'password' => md5($c_member_pre_secure['password']),
1166        'c_password_query_answer' => md5($c_member_pre_secure['password_query_answer']),
1167        'pc_address'     => $c_member_pre_secure['pc_address'],
1168        'ktai_address'     => $c_member_pre_secure['ktai_address'],
1169        'regist_address' => $c_member_pre_secure['regist_address'],
1170        'ktai_session' => $c_member_pre_secure['ktai_session'],
1171    );
1172
1173    if ($is_encrypted_password) {
1174        $data['password'] = $c_member_pre_secure['password'];
1175        $data['c_password_query_answer'] = $c_member_pre_secure['password_query_answer'];
1176    }
1177
1178    if (OPENPNE_AUTH_MODE == 'pneid') {
1179        $data['login_id'] = $c_member_pre_secure['login_id'];
1180    }
1181
1182    return db_update('c_member_pre', $data, array('c_member_pre_id' => $c_member_pre_id));
1183}
1184
1185function db_member_h_config_3(
1186                $c_member_id,
1187                $is_receive_mail,
1188                $rss,
1189                $ashiato_mail_num,
1190                $is_receive_daily_news,
1191                $c_password_query_id,
1192                $c_password_query_answer,
1193                $public_flag_diary,
1194                $is_shinobiashi,
1195                $schedule_start_day)
1196{
1197    //function cacheの削除
1198    cache_drop_c_member_profile($c_member_id);
1199   
1200    $data = array(
1201        'is_receive_mail' => (bool)$is_receive_mail,
1202        'is_receive_daily_news' => intval($is_receive_daily_news),
1203        'rss' => $rss,
1204        'ashiato_mail_num' => intval($ashiato_mail_num),
1205        'c_password_query_id' => intval($c_password_query_id),
1206        'public_flag_diary' => util_cast_public_flag_diary($public_flag_diary),
1207        'is_shinobiashi' => $is_shinobiashi,
1208        'schedule_start_day' => $schedule_start_day,
1209        'u_datetime' => db_now(),
1210    );
1211    $where = array('c_member_id' => intval($c_member_id));
1212    db_update('c_member', $data, $where);
1213
1214    if (!empty($c_password_query_answer)) {
1215        $data = array(
1216            'hashed_password_query_answer' => md5($c_password_query_answer)
1217        );
1218        db_update('c_member_secure', $data, $where);
1219    }
1220}
1221
1222function db_member_update_easy_access_id($c_member_id, $easy_access_id)
1223{
1224    // function cacheを削除
1225    cache_drop_c_member_profile($c_member_id);
1226
1227    $hashed_easy_access_id = '';
1228    if ($easy_access_id) {
1229        $hashed_easy_access_id = md5($easy_access_id);
1230    }
1231    $data = array('easy_access_id' => $hashed_easy_access_id);
1232    $where = array('c_member_id' => intval($c_member_id));
1233    return db_update('c_member_secure', $data, $where);
1234}
1235
1236function db_member_update_password_query($c_member_id, $c_password_query_id, $password_query_answer)
1237{
1238    // function cacheを削除
1239    cache_drop_c_member_profile($c_member_id);
1240
1241    $data = array('c_password_query_id' => intval($c_password_query_id));
1242    $where = array('c_member_id' => intval($c_member_id));
1243    db_update('c_member', $data, $where);
1244
1245    if (empty($password_query_answer)) {
1246        $password_query_answer = '';
1247    } else {
1248        $password_query_answer = md5($password_query_answer);
1249    }
1250    $data = array('hashed_password_query_answer' => $password_query_answer);
1251    $where = array('c_member_id' => intval($c_member_id));
1252    db_update('c_member_secure', $data, $where);
1253}
1254
1255//(pc_address)
1256
1257function db_member_update_c_member_pc_address4c_member_id($c_member_id, $pc_address)
1258{
1259    // function cacheを削除
1260    cache_drop_c_member_profile($c_member_id);
1261
1262    if (!util_is_regist_mail_address($pc_address, $c_member_id)) {
1263        return false;
1264    }
1265
1266    $data = array('pc_address' => t_encrypt($pc_address));
1267    $where = array('c_member_id' => intval($c_member_id));
1268    return db_update('c_member_secure', $data, $where);
1269}
1270
1271function db_member_regist_c_member_pc_address4c_member_id($c_member_id, $pc_address)
1272{
1273    // function cacheを削除
1274    cache_drop_c_member_profile($c_member_id);
1275
1276    if (!util_is_regist_mail_address($pc_address, $c_member_id)) {
1277        return false;
1278    }
1279
1280    $data = array(
1281    'pc_address' => t_encrypt($pc_address),
1282    'regist_address' => t_encrypt($pc_address),
1283    );
1284    $where = array('c_member_id' => intval($c_member_id));
1285    return db_update('c_member_secure', $data, $where);
1286}
1287
1288//(ktai_address)
1289
1290function db_member_update_ktai_address($c_member_id, $ktai_address)
1291{
1292    // function cacheを削除
1293    cache_drop_c_member_profile($c_member_id);
1294
1295    if ($ktai_address == ''){
1296        $data = array(
1297            'ktai_address' => '',
1298            'easy_access_id' => '',
1299        );
1300    } elseif (util_is_regist_mail_address($ktai_address, $c_member_id)) {
1301        $ktai_address = str_replace('"', '', $ktai_address);
1302        $data = array('ktai_address' => t_encrypt($ktai_address));
1303    } else {
1304        return false;
1305    }
1306    $where = array('c_member_id' => intval($c_member_id));
1307    return db_update('c_member_secure', $data, $where);
1308}
1309
1310//(password)
1311
1312function db_member_update_password($c_member_id, $password)
1313{
1314    // function cacheを削除
1315    cache_drop_c_member_profile($c_member_id);
1316
1317    $data = array('hashed_password' => md5($password));
1318    $where = array('c_member_id' => intval($c_member_id));
1319    return db_update('c_member_secure', $data, $where);
1320}
1321
1322//--- c_pc_address_pre
1323
1324function db_member_h_config_1($c_member_id, $pc_address)
1325{
1326    $insert_id = 0;
1327    $session = create_hash();
1328
1329    // 既にpreに存在するメールアドレスかどうか
1330    if (do_common_c_pc_address_pre4pc_address($pc_address)) {
1331        $data = array(
1332            'c_member_id' => intval($c_member_id),
1333            'session' => $session,
1334            'r_datetime' => db_now(),
1335        );
1336        $where = array('pc_address' => $pc_address);
1337        db_update('c_pc_address_pre', $data, $where);
1338    } else {
1339        $data = array(
1340            'c_member_id' => intval($c_member_id),
1341            'pc_address' => $pc_address,
1342            'session' => $session,
1343            'r_datetime' => db_now(),
1344        );
1345        $insert_id = db_insert('c_pc_address_pre', $data);
1346    }
1347
1348    do_h_config_1_mail_send($c_member_id, $session, $pc_address);
1349    return $insert_id;
1350}
1351
1352function db_member_h_regist_mail($c_member_id, $pc_address)
1353{
1354    $insert_id = 0;
1355    $session = create_hash();
1356
1357    // 既にpreに存在するメールアドレスかどうか
1358    if (do_common_c_pc_address_pre4pc_address($pc_address)) {
1359        $data = array(
1360            'c_member_id' => intval($c_member_id),
1361            'session' => $session,
1362            'r_datetime' => db_now(),
1363        );
1364        $where = array('pc_address' => $pc_address);
1365        db_update('c_pc_address_pre', $data, $where);
1366    } else {
1367        $data = array(
1368            'c_member_id' => intval($c_member_id),
1369            'pc_address' => $pc_address,
1370            'session' => $session,
1371            'r_datetime' => db_now(),
1372        );
1373        $insert_id = db_insert('c_pc_address_pre', $data);
1374    }
1375
1376    //function cache削除
1377    cache_drop_c_member_profile($c_member_id);
1378
1379    do_h_regist_mail_mail_send($c_member_id, $session, $pc_address);
1380    return $insert_id;
1381}
1382
1383function db_member_delete_c_pc_address_pre4sid($sid)
1384{
1385    $sql = 'DELETE FROM c_pc_address_pre WHERE session = ?';
1386    $params = array($sid);
1387    return db_query($sql, $params);
1388}
1389
1390function db_member_change_mail($sid, $password)
1391{
1392    if (!$c_pc_address_pre = do_common_c_pc_address_pre4sid($sid)) {
1393        return false;
1394    }
1395
1396    $c_member_id = $c_pc_address_pre['c_member_id'];
1397    $pc_address = $c_pc_address_pre['pc_address'];
1398
1399    if (!db_common_authenticate_password($c_member_id, $password)) {
1400        return false;
1401    }
1402
1403    db_member_update_c_member_pc_address4c_member_id($c_member_id, $pc_address);
1404    db_member_delete_c_pc_address_pre4sid($sid);
1405    return true;
1406}
1407
1408function db_member_regist_mail($sid, $password)
1409{
1410    if (!$c_pc_address_pre = do_common_c_pc_address_pre4sid($sid)) {
1411        return false;
1412    }
1413
1414    $c_member_id = $c_pc_address_pre['c_member_id'];
1415    $pc_address = $c_pc_address_pre['pc_address'];
1416
1417    if (!db_common_authenticate_password($c_member_id, $password)) {
1418        return false;
1419    }
1420
1421    db_member_regist_c_member_pc_address4c_member_id($c_member_id, $pc_address);
1422    db_member_delete_c_pc_address_pre4sid($sid);
1423    return true;
1424}
1425
1426//--- c_ktai_address_pre
1427
1428/**
1429 * 携帯メールアドレス変更
1430 */
1431function db_member_insert_c_ktai_address_pre($c_member_id, $session, $ktai_address)
1432{
1433    $ktai_address = str_replace('"', '', $ktai_address);
1434
1435    $data = array(
1436        'c_member_id' => intval($c_member_id),
1437        'session' => $session,
1438        'ktai_address' => $ktai_address,
1439        'r_datetime' => db_now(),
1440    );
1441    return db_insert('c_ktai_address_pre', $data);
1442}
1443
1444function db_member_delete_ktai_address_pre($c_ktai_address_pre_id)
1445{
1446    $sql = 'DELETE FROM c_ktai_address_pre WHERE c_ktai_address_pre_id = ?';
1447    $params = array(intval($c_ktai_address_pre_id));
1448    db_query($sql, $params);
1449}
1450
1451function db_member_delete_c_ktai_address_pre4ktai_address($ktai_address)
1452{
1453    $sql = 'DELETE FROM c_ktai_address_pre WHERE ktai_address = ?';
1454    $params = array($ktai_address);
1455    db_query($sql, $params);
1456}
1457
1458//--- c_member_pre
1459
1460/**
1461 * 招待メール送信
1462 */
1463function db_member_insert_c_invite($c_member_id_invite, $pc_address, $message, $session, $is_disabled_regist_easy_access_id = false)
1464{
1465    $data = array(
1466        'pc_address' => $pc_address,
1467        'regist_address' => $pc_address,
1468        'c_member_id_invite' => intval($c_member_id_invite),
1469        'session' => $session,
1470        'r_date' => db_now(),
1471        'nickname' => '',
1472        'password' => '',
1473        'ktai_address' => '',
1474        'easy_access_id' => '',
1475        'is_disabled_regist_easy_access_id' => $is_disabled_regist_easy_access_id,
1476        'c_password_query_answer' => '',
1477    );
1478    return db_insert('c_member_pre', $data);
1479}
1480
1481/**
1482 * 招待メール送信
1483 */
1484function db_member_update_c_invite($c_member_id_invite, $pc_address, $message, $session, $is_disabled_regist_easy_access_id = false)
1485{
1486    $sql = 'SELECT c_member_pre_id,ktai_session FROM c_member_pre WHERE pc_address = ?';
1487    $pre = db_get_row($sql, array($pc_address));
1488
1489    $data = array(
1490        'c_member_id_invite' => intval($c_member_id_invite),
1491        'session' => $session,
1492        'regist_address' => $pc_address,
1493        'is_disabled_regist_easy_access_id' => $is_disabled_regist_easy_access_id,
1494        'r_date' => db_now(),
1495    );
1496
1497    // プロフィール項目登録済みで携帯版未登録の場合(個体識別番号必須制)
1498    if (!empty($pre['ktai_session'])) {
1499        // プロフィール情報を削除
1500        db_member_delete_c_member_pre_profile4c_member_pre_id($pre['c_member_pre_id']);
1501        $tmp = array(
1502            'nickname' => '',
1503            'birth_year' => 0,
1504            'birth_month' => 0,
1505            'birth_day' => 0,
1506            'ktai_address' => '',
1507            'password' => '',
1508            'c_password_query_id' => 0,
1509            'c_password_query_answer' => '',
1510            'ktai_session' => '',
1511        );
1512        $data = array_merge($data, $tmp);
1513    }
1514
1515    $where = array('pc_address' => $pc_address);
1516    return db_update('c_member_pre', $data, $where);
1517}
1518
1519function db_member_delete_c_member_pre($c_member_id, $delete_c_member_ids)
1520{
1521    if (!(is_array($delete_c_member_ids) && $delete_c_member_ids)) {
1522        return false;
1523    }
1524    $ids = implode(',', array_map('intval', $delete_c_member_ids));
1525
1526    $sql = 'DELETE FROM c_member_pre WHERE c_member_id_invite = ?'.
1527            ' AND c_member_pre_id IN ('.$ids.')';
1528    $params =  array(intval($c_member_id));
1529    db_query($sql, $params);
1530}
1531
1532function db_member_delete_c_member_pre4sid($sid)
1533{
1534    $sql = 'DELETE FROM c_member_pre WHERE session = ?';
1535    $params = array($sid);
1536    return db_query($sql, $params);
1537}
1538
1539function db_member_delete_c_member_pre4ktai_session($ktai_session)
1540{
1541    $sql = 'DELETE FROM c_member_pre WHERE ktai_session = ?';
1542    $params = array($ktai_session);
1543    return db_query($sql, $params);
1544}
1545
1546function db_member_delete_c_member_pre_profile4c_member_pre_id($c_member_pre_id)
1547{
1548    $sql = 'DELETE FROM c_member_pre_profile WHERE c_member_pre_id = ?';
1549    $params = array($c_member_pre_id);
1550    return db_query($sql, $params);
1551}
1552
1553//--- c_member_ktai_pre
1554
1555function db_member_delete_c_member_ktai_pre($c_member_id, $delete_c_member_ids)
1556{
1557    if (!is_array($delete_c_member_ids) && $delete_c_member_ids) {
1558        return false;
1559    }
1560    $ids = implode(',', array_map('intval', $delete_c_member_ids));
1561
1562    $sql = 'DELETE FROM c_member_ktai_pre WHERE c_member_id_invite = ?' .
1563            ' AND c_member_ktai_pre_id IN ('.$ids.')';
1564    $params = array(intval($c_member_id));
1565    db_query($sql, $params);
1566}
1567
1568function db_member_delete_c_member_ktai_pre4id($c_member_ktai_pre_id)
1569{
1570    $sql = 'DELETE FROM c_member_ktai_pre WHERE c_member_ktai_pre_id = ?';
1571    $params = array(intval($c_member_ktai_pre_id));
1572    db_query($sql, $params);
1573}
1574
1575/**
1576 * c_member_ktai_preを更新
1577 */
1578function db_member_update_c_member_ktai_pre($session, $ktai_address, $c_member_id_invite, $is_disabled_regist_easy_access_id = false)
1579{
1580    $data = array(
1581        'session' => $session,
1582        'r_datetime' => db_now(),
1583        'c_member_id_invite' => intval($c_member_id_invite),
1584        'is_disabled_regist_easy_access_id' => $is_disabled_regist_easy_access_id,
1585    );
1586    $where = array('ktai_address' => $ktai_address);
1587    return db_update('c_member_ktai_pre', $data, $where);
1588}
1589
1590function db_member_delete_c_member_ktai_pre4ktai_address($ktai_address)
1591{
1592    $sql = 'DELETE FROM c_member_ktai_pre WHERE ktai_address = ?';
1593    $params = array($ktai_address);
1594    db_query($sql, $params);
1595}
1596
1597function db_member_insert_c_member_ktai_pre($session, $ktai_address, $c_member_id_invite, $is_disabled_regist_easy_access_id = false)
1598{
1599    $ktai_address = str_replace('"', '', $ktai_address);
1600    if (db_member_c_member_ktai_pre4ktai_address($ktai_address)) {  // 二重引用符を除去した結果、DB内メールアドレスと重複する
1601        return db_member_update_c_member_ktai_pre($session, $ktai_address, $c_member_id_invite, $is_disabled_regist_easy_access_id);
1602    }
1603
1604    $data = array(
1605        'session' => $session,
1606        'ktai_address' => $ktai_address,
1607        'c_member_id_invite' => intval($c_member_id_invite),
1608        'r_datetime' => db_now(),
1609        'is_disabled_regist_easy_access_id' => $is_disabled_regist_easy_access_id,
1610    );
1611    return db_insert('c_member_ktai_pre', $data);
1612}
1613
1614//--- profile関連
1615
1616function db_member_c_profile4name($name)
1617{
1618    $sql = 'SELECT * FROM c_profile WHERE name = ?';
1619    return db_get_row($sql, array($name));
1620}
1621
1622function db_member_update_c_member_profile($c_member_id, $c_member_profile_list)
1623{
1624    //function cache削除
1625    cache_drop_c_member_profile($c_member_id);
1626
1627    foreach ($c_member_profile_list as $item) {
1628        $sql = 'DELETE FROM c_member_profile' .
1629                ' WHERE c_member_id = ? AND c_profile_id = ?';
1630        $params = array(intval($c_member_id), intval($item['c_profile_id']));
1631        db_query($sql, $params);
1632
1633        if (!(is_null($item['value']) || $item['value'] === '')) {
1634            if (is_array($item['value'])) {
1635                foreach ($item['value'] as $key => $value) {
1636                    do_config_prof_insert_c_member_profile($c_member_id, $item['c_profile_id'], $key, $value, $item['public_flag']);
1637                }
1638            } else {
1639                do_config_prof_insert_c_member_profile($c_member_id, $item['c_profile_id'], $item['c_profile_option_id'], $item['value'], $item['public_flag']);
1640            }
1641        }
1642    }
1643}
1644
1645function db_member_insert_c_member_profile($c_member_id, $c_profile_id, $c_profile_option_id, $value, $public_flag)
1646{
1647    //function cache削除
1648    cache_drop_c_member_profile($c_member_id);
1649
1650    $data = array(
1651        'c_member_id' => intval($c_member_id),
1652        'c_profile_id' => intval($c_profile_id),
1653        'c_profile_option_id' => intval($c_profile_option_id),
1654        'value' => $value,
1655        'public_flag' => $public_flag,
1656    );
1657    return db_insert('c_member_profile', $data);
1658}
1659
1660/***
1661 * 一時的に c_member_pre_profile にプロフィール情報をインサートする
1662 *
1663 * 個体識別番号登録必須制が「必須にする」である場合など、c_member ではなく c_member_pre を使うのが望ましい場面で使用する。
1664 *
1665 * @param int $c_member_pre_id
1666 * @param int $c_profile_id
1667 * @param int $c_profile_option_id
1668 * @param int $value
1669 * @param string $public_flag
1670 * @return mixed
1671 */
1672function db_member_insert_c_member_pre_profile($c_member_pre_id, $c_profile_id, $c_profile_option_id, $value, $public_flag)
1673{
1674    $data = array(
1675        'c_member_pre_id' => intval($c_member_pre_id),
1676        'c_profile_id' => intval($c_profile_id),
1677        'c_profile_option_id' => intval($c_profile_option_id),
1678        'value' => $value,
1679        'public_flag' => $public_flag,
1680    );
1681    return db_insert('c_member_pre_profile', $data);
1682}
1683
1684/***
1685 * c_member_pre_profile のプロフィール情報を更新する
1686 *
1687 * @param int $c_member_pre_id
1688 * @param array $c_member_profile_list
1689 * @return mixed
1690 */
1691function db_member_update_c_member_pre_profile($c_member_pre_id, $c_member_profile_list)
1692{
1693    foreach ($c_member_profile_list as $item) {
1694        $sql = 'DELETE FROM c_member_pre_profile' .
1695                ' WHERE c_member_pre_id = ? AND c_profile_id = ?';
1696        $params = array(intval($c_member_pre_id), intval($item['c_profile_id']));
1697        db_query($sql, $params);
1698   
1699        if (!(is_null($item['value']) || $item['value'] === '')) {
1700            if (is_array($item['value'])) {
1701                foreach ($item['value'] as $key => $value) {
1702                    db_member_insert_c_member_pre_profile($c_member_pre_id, $item['c_profile_id'], $key, $value, $item['public_flag']);
1703                }
1704            } else {
1705                db_member_insert_c_member_pre_profile($c_member_pre_id, $item['c_profile_id'], $item['c_profile_option_id'], $item['value'], $item['public_flag']);
1706            }
1707        }
1708    }
1709}
1710
1711/***
1712 * c_member_pre_profile のプロフィール情報を取得する
1713 *
1714 * @param int $c_member_pre_id
1715 * @return array
1716 */
1717function db_member_c_member_pre_profile4c_member_pre_id($c_member_pre_id)
1718{
1719    $sql = 'SELECT * FROM c_member_pre_profile WHERE c_member_pre_id = ?';
1720    $params = array(intval($c_member_pre_id));
1721    return db_get_all($sql, $params);
1722}
1723
1724//--- c_access_block
1725
1726function db_member_insert_c_access_block($c_member_id, $c_member_id_block)
1727{
1728    // 存在するIDのみを抽出
1729    $c_member_id_block = db_member_filter_c_access_block_id($c_member_id, $c_member_id_block);
1730
1731    $sql = 'DELETE FROM c_access_block WHERE c_member_id = ?';
1732    $params = array(intval($c_member_id));
1733    db_query($sql, $params);
1734
1735    foreach ($c_member_id_block as $id) {
1736        $data = array(
1737            'c_member_id' => intval($c_member_id),
1738            'c_member_id_block' => intval($id),
1739            'r_datetime' => db_now(),
1740        );
1741        db_insert('c_access_block', $data);
1742    }
1743}
1744
1745function db_member_filter_c_access_block_id($c_member_id, $c_member_id_block)
1746{
1747    $c_member_id_block = array_unique(array_map('intval', $c_member_id_block));
1748    if (!$c_member_id_block) {
1749        return array();
1750    }
1751    $ids = implode(',', $c_member_id_block);
1752    $sql = 'SELECT c_member_id FROM c_member WHERE (c_member_id IN ('.$ids.')) AND (c_member_id <> ?) ';
1753    return db_get_col($sql, array($c_member_id));
1754}
1755
1756//---
1757
1758function db_member_update_mail_receive($c_member_id, $is_receive_ktai_mail)
1759{
1760    // function cacheを削除
1761    cache_drop_c_member_profile($c_member_id);
1762
1763    $data = array('is_receive_ktai_mail' => intval($is_receive_ktai_mail));
1764    $where = array('c_member_id' => intval($c_member_id));
1765    db_update('c_member', $data, $where);
1766}
1767
1768function db_member_update_ashiato_mail_num($c_member_id, $ashiato_mail_num)
1769{
1770    // function cacheを削除
1771    cache_drop_c_member_profile($c_member_id);
1772
1773    $data = array('ashiato_mail_num' => intval($ashiato_mail_num));
1774    $where = array('c_member_id' => intval($c_member_id));
1775    db_update('c_member', $data, $where);
1776}
1777
1778function db_member_update_public_flag_diary($c_member_id, $public_flag_diary)
1779{
1780    // function cacheを削除
1781    cache_drop_c_member_profile($c_member_id);
1782
1783    $data = array('public_flag_diary' => util_cast_public_flag_diary($public_flag_diary));
1784    $where = array('c_member_id' => intval($c_member_id));
1785    db_update('c_member', $data, $where);
1786}
1787
1788function db_member_insert_username($c_member_id, $username)
1789{
1790    $data = array(
1791        'c_member_id' => intval($c_member_id),
1792        'username' => $username,
1793    );
1794    db_insert('c_username', $data);
1795}
1796
1797/**
1798 * ログインIDからc_member_idを取得
1799 */
1800function db_member_c_member_id4username($username, $is_ktai = false)
1801{
1802    if (OPENPNE_AUTH_MODE != 'slavepne' && OPENPNE_AUTH_MODE != 'pneid') {
1803        $username = t_encrypt($username);
1804    }
1805    return db_member_c_member_id4username_encrypted($username, $is_ktai);
1806}
1807
1808/**
1809 * ログインIDからc_member_idを取得
1810 *
1811 * @param string $username 暗号化されたメールアドレス or SlavePNEのusername
1812 * @return int c_member_id
1813 */
1814function db_member_c_member_id4username_encrypted($username, $is_ktai = false)
1815{
1816    if (OPENPNE_AUTH_MODE == 'slavepne' || OPENPNE_AUTH_MODE == 'pneid') {
1817        $sql = 'SELECT c_member_id FROM c_username WHERE username = ?';
1818        $params = array($username);
1819        $c_member_id = db_get_one($sql, $params);
1820    } else {
1821        if ($is_ktai) {
1822            $c_member_id = db_member_c_member_id4ktai_address_encrypted($username);
1823        } else {
1824            $c_member_id = db_member_c_member_id4pc_address_encrypted($username);
1825        }
1826    }
1827    return $c_member_id;
1828}
1829
1830/**
1831 * ログインIDからc_member_idを取得
1832 */
1833function db_member_username4c_member_id($c_member_id, $is_ktai = false)
1834{
1835    if (OPENPNE_AUTH_MODE == 'slavepne' || OPENPNE_AUTH_MODE == 'pneid') {
1836        $sql = 'SELECT username FROM c_username WHERE c_member_id = ?';
1837        $params = array($c_member_id);
1838        $username = db_get_one($sql, $params);
1839    } else {
1840        $c_member_secure = db_member_c_member_secure4c_member_id($c_member_id);
1841        if ($is_ktai) {
1842            $username = $c_member_secure['ktai_address'];
1843        } else {
1844            $username = $c_member_secure['pc_address'];
1845        }
1846    }
1847    return $username;
1848}
1849
1850/**
1851 * ログインしたメンバーの情報が存在しない場合自動で生成
1852 */
1853function db_member_create_member($username)
1854{
1855    $data = array(
1856        'nickname'    => "NO NAME",
1857        'birth_year'  => 0,
1858        'birth_month' => 0,
1859        'birth_day'   => 0,
1860        'public_flag_birth_year' => "public",
1861        'c_member_id_invite'  => 1,
1862        'c_password_query_id' => 0,
1863        'is_receive_mail' => true,
1864        'is_receive_ktai_mail'  => true,
1865        'is_receive_daily_news' => true,
1866        'r_date' => db_now(),
1867        'u_datetime' => db_now(),
1868        'image_filename' => '',
1869        'image_filename_1' => '',
1870        'image_filename_2' => '',
1871        'image_filename_3' => '',
1872        'rss' => '',
1873    );
1874    $c_member_id = db_insert('c_member', $data);
1875   
1876    $data = array(
1877        'c_member_id' => intval($c_member_id),
1878        'hashed_password' => "",
1879        'hashed_password_query_answer' => "",
1880        'pc_address'     => "",
1881        'ktai_address'   => "",
1882        'regist_address' => "",
1883        'easy_access_id' => '',
1884    );
1885   
1886    if (!IS_SLAVEPNE_EMAIL_REGIST) {
1887        $data['pc_address'] = t_encrypt($c_member_id.'@pc.example.com');
1888        $data['ktai_address'] = t_encrypt($c_member_id.'@ktai.example.com');
1889    }
1890   
1891    db_insert('c_member_secure', $data);
1892   
1893    $data = array(
1894        'c_member_id' => intval($c_member_id),
1895        'username' => $username,
1896    );
1897    db_insert('c_username', $data);
1898}
1899
1900/**
1901 * プロフィールに必須項目が入力されているかを返す。
1902 * 0:入力済み
1903 * 1:プロフィール未入力
1904 * 2:メールアドレス未登録
1905 */
1906function db_member_check_param_inputed($c_member_id, $is_ktai = false)
1907{
1908    $c_member = db_member_c_member4c_member_id($c_member_id, true);
1909
1910    if (($c_member['nickname'] === '')
1911     || !$c_member['birth_year']
1912     || !$c_member['birth_month']
1913     || !$c_member['birth_day']
1914    ) {
1915        return 1;
1916    }
1917
1918    if ($c_member['secure']['pc_address'] === '' && !$is_ktai) {
1919        return 2;
1920    }
1921    if ($c_member['secure']['ktai_address'] === '' && $is_ktai) {
1922        return 2;
1923    }
1924
1925    return 0;
1926}
1927
1928function db_member_is_ktai_id_registed($c_member_id)
1929{
1930    $sql = 'SELECT easy_access_id FROM c_member_secure WHERE c_member_id = ?';
1931    $params = array(intval($c_member_id));
1932    return (db_get_one($sql, $params) != '');
1933}
1934
1935function db_member_is_blacklist($c_member_id)
1936{
1937    $sql = 'SELECT COUNT(*) FROM c_blacklist'
1938         . ' INNER JOIN c_member_secure USING (easy_access_id)'
1939         . ' WHERE c_member_secure.c_member_id = ?';
1940    $params = array(intval($c_member_id));
1941    return (bool)db_get_one($sql, $params);
1942}
1943
1944function db_member_easy_access_id_is_blacklist($easy_access_id, $c_blacklist_id = 0)
1945{
1946    $sql = 'SELECT COUNT(*) FROM c_blacklist WHERE easy_access_id = ? AND c_blacklist_id <> ?';
1947    $param = array(
1948        $easy_access_id,
1949        intval($c_blacklist_id),
1950    );
1951    return (bool)db_get_one($sql, $param);
1952}
1953
1954/**
1955 * c_member_configの値を取得する
1956 *
1957 * @param int $c_member_id
1958 * @return array メンバー設定情報
1959 */
1960function db_member_c_member_config4c_member_id($c_member_id)
1961{
1962    $sql = 'SELECT a.*,b.name FROM c_member_config a'
1963         . ' INNER JOIN c_member_config_option b USING(c_member_config_option_id)'
1964         . ' WHERE c_member_id = ?';
1965    $params = array(intval($c_member_id));
1966    $list = db_get_all($sql, $params);
1967
1968    $member_config = array();
1969    foreach ($list as $value){
1970        $member_config[$value['name']] = $value['value'];
1971    }
1972    return $member_config;
1973}
1974
1975/**
1976 * c_member_config_idに設定値があるかどうか
1977 *
1978 * @param int $c_member_id
1979 * @param int $c_member_config_option_id
1980 * @return bool
1981 */
1982function db_member_c_member_config4option_id($c_member_id,$c_member_config_option_id)
1983{
1984    $sql = 'SELECT COUNT(c_member_config_id) FROM c_member_config'
1985         . ' WHERE c_member_id = ? AND c_member_config_option_id = ?';
1986    $params = array(
1987        intval($c_member_id),
1988        intval($c_member_config_option_id),
1989    );
1990    return (bool)db_get_one($sql, $params, 'main');
1991}
1992
1993/**
1994 * c_member_config_option_id取得
1995 *
1996 * @param string $name
1997 * @return int
1998 */
1999function db_member_config_option_id4name($name)
2000{
2001    $sql = 'SELECT c_member_config_option_id FROM c_member_config_option'
2002         . ' WHERE name = ?';
2003    $params = array(strval($name));
2004    return db_get_one($sql, $params);   
2005}
2006
2007/**
2008 * c_member_config更新(無ければInsert)
2009 *
2010 * @param int $c_member_id
2011 * @param string $name
2012 * @param string $value
2013 */
2014function db_member_update_c_member_config($c_member_id, $name, $value)
2015{
2016    $option_id = db_member_config_option_id4name($name);
2017
2018    if (!db_member_c_member_config4option_id($c_member_id, $option_id)) {
2019        $data = array(
2020            'c_member_id' => intval($c_member_id),
2021            'c_member_config_option_id' => intval($option_id),
2022            'value' => $value,
2023        );
2024        db_insert('c_member_config', $data);
2025    } else {
2026        $data = array('value' => $value);
2027        $where = array(
2028            'c_member_id' => intval($c_member_id),
2029            'c_member_config_option_id' => intval($option_id),
2030        );
2031        db_update('c_member_config', $data, $where);
2032    }
2033}
2034
2035?>
Note: See TracBrowser for help on using the repository browser.