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

source: OpenPNE/branches/stable-2.10.x/webapp/lib/db/member.php @ 7610

Last change on this file since 7610 was 7610, checked in by ogawa, 12 years ago

#1502:スレーブPNEで使われるdb_member_create_member()でc_member_idを返すようにした、またINSERT失敗時に不要なデータを削除する処理を加えた

File size: 61.9 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 * メンバー情報を取得する
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 (IS_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, 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, 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    $hint = db_mysql_hint('FORCE INDEX (sort_order)');
485    $sql = 'SELECT * FROM c_profile' . $hint . ' ORDER BY sort_order';
486    return db_get_all($sql);
487}
488
489function db_member_c_profile_option_list4c_profile_id($c_profile_id)
490{
491    $sql = 'SELECT * FROM c_profile_option WHERE c_profile_id = ? ORDER BY sort_order';
492    $params = array(intval($c_profile_id));
493    return db_get_all($sql, $params);
494}
495
496function db_member_c_profile_list()
497{
498    static $is_recurred = false;  //再帰処理中かどうかの判定フラグ
499
500    if (!$is_recurred) {  //function cacheのために再帰処理を行う
501        $is_recurred = true;
502        $funcargs = func_get_args();
503        return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_FAST, __FUNCTION__, $funcargs);
504    }
505
506    $is_recurred = false;
507
508    $list = db_member_c_profile_list4null();
509
510    $profile_list = array();
511    foreach ($list as $value) {
512        $profile_list[$value['name']] = $value;
513        $profile_list[$value['name']]['options'] = db_member_c_profile_option_list4c_profile_id($value['c_profile_id']);
514    }
515    return $profile_list;
516}
517
518function db_member_main_image_filename_number($c_member_id)
519{
520    $c_member = db_member_c_member4c_member_id($c_member_id);
521    if (empty($c_member['image_filename'])) {
522        return 0;
523    }
524
525    if ($c_member['image_filename'] == $c_member['image_filename_1'])
526        return 1;
527    elseif ($c_member['image_filename'] == $c_member['image_filename_2'])
528        return 2;
529    elseif ($c_member['image_filename'] == $c_member['image_filename_3'])
530        return 3;
531    else
532        return 0;
533}
534
535function db_member_c_member_pre4sid($sid)
536{
537    $sql = 'SELECT * FROM c_member_pre WHERE session = ?';
538    $params = array($sid);
539    return db_get_row($sql, $params);
540}
541
542function db_member_c_member_pre4pc_address($pc_address)
543{
544    $sql = 'SELECT * FROM c_member_pre WHERE pc_address = ?';
545    $params = array($pc_address);
546    return db_get_row($sql, $params);
547}
548
549function db_member_c_member4pc_address($pc_address)
550{
551    $sql = 'SELECT * FROM c_member_secure WHERE pc_address = ?';
552    $params = array(t_encrypt($pc_address));
553    return db_get_row($sql, $params);
554}
555
556function db_member_c_member_list4daily_news()
557{
558    $sql = 'SELECT c_member_id, is_receive_daily_news FROM c_member' .
559            ' WHERE is_receive_daily_news > 0';
560    return db_get_all($sql);
561}
562
563/***
564 * デイリーニュース配信対象者数を取得する
565 *
566 * @return array
567 */
568function db_member_count_c_member_is_receive_daily_news()
569{
570    $list = array();
571
572    // 毎日デイリーニュースを受け取るメンバー数の取得
573    $sql = 'SELECT COUNT(*) FROM c_member' .
574        ' WHERE is_receive_daily_news = 1';
575    $list['every_day'] = db_get_one($sql);
576
577    // DAILY_NEWS_DAY(管理画面から設定)のみデイリーニュースを受け取るメンバー数の取得
578    $sql = 'SELECT COUNT(*) FROM c_member' .
579        ' WHERE is_receive_daily_news = 2';
580    $list['daily_news_day'] = db_get_one($sql);
581
582    return $list;
583}
584
585function db_member_c_member_list4birthday_mail()
586{
587    // この日が誕生日の人を対称にする
588    $target_date = "+1 week";
589
590    $timestamp = strtotime($target_date);
591    $month = date("n", $timestamp);
592    $day   = date("j", $timestamp);
593
594    $sql = 'SELECT * FROM c_member WHERE birth_month = ? AND birth_day = ?';
595    $params = array(intval($month), intval($day));
596    return db_get_all($sql, $params);
597}
598
599/**
600 * パスワードクエリが合っているか判定
601 */
602function db_member_is_password_query_complete($pc_address, $query_id, $query_answer)
603{
604    $sql = "SELECT c_member.c_member_id" .
605        " FROM c_member, c_member_secure" .
606        " WHERE c_member_secure.pc_address = ?" .
607        " AND c_member.c_password_query_id = ?" .
608        " AND c_member_secure.hashed_password_query_answer = ?" .
609        " AND c_member.c_member_id = c_member_secure.c_member_id";
610    $params = array(
611        t_encrypt($pc_address),
612        intval($query_id),
613        md5($query_answer)
614    );
615    if ($c_member_id = db_get_one($sql, $params)) {
616        return $c_member_id;
617    }
618
619    // 1.8以前との互換性を保つため、SJISでのチェックも行う
620    $params = array(
621        t_encrypt($pc_address),
622        intval($query_id),
623        md5(mb_convert_encoding($query_answer, 'SJIS-win', 'UTF-8'))
624    );
625    return db_get_one($sql, $params);
626}
627
628function db_member_c_member_id4ktai_address2($ktai_address)
629{
630    if (!$ktai_address) {
631        return null;
632    }
633
634    $sql = "SELECT c_member_id FROM c_member_secure WHERE ktai_address = ?";
635    $params = array(t_encrypt($ktai_address));
636    return db_get_one($sql, $params);
637}
638
639function db_member_inviting_member4c_member_id2($c_member_id)
640{
641    $sql = "SELECT * FROM c_member_ktai_pre WHERE c_member_id_invite = ?";
642    $params = array(intval($c_member_id));
643    return db_get_all($sql, $params);
644}
645
646/**
647 * 対象のメールアドレスが、登録されてるか否か
648 *
649 * @param string $mail_address
650 * @param int $c_member_id チェックから除外するメンバーID
651 * @param bool $is_check_pre    c_member_pre をチェックするかどうか
652 */
653function db_member_is_sns_join4mail_address($mail_address, $c_member_id = 0, $is_check_pre = false)
654{
655    $params = array(t_encrypt($mail_address), intval($c_member_id));
656
657    $sql = "SELECT c_member_id FROM c_member_secure WHERE pc_address = ? AND c_member_id <> ?";
658    $array = db_get_row($sql, $params);
659
660    $sql = "SELECT c_member_id FROM c_member_secure WHERE ktai_address = ? AND c_member_id <> ?";
661    $k_array = db_get_row($sql, $params);
662
663    if ($is_check_pre) {
664        $sql = 'SELECT c_member_pre_id FROM c_member_pre WHERE ktai_address = ?';
665        $params = array($mail_address);
666        $p_array = db_get_row($sql, $params);
667    } else {
668        $p_array = array();
669    }
670
671    //対象のメールアドレスが登録済み
672    if ($array['c_member_id'] || $k_array['c_member_id'] || $p_array['c_member_pre_id']) {
673        return true;
674    } else {
675        return false;
676    }
677}
678
679//対象のメールアドレスが、ドメイン制限に合致しているかどうか
680function db_member_is_limit_domain4mail_address($mail_address)
681{
682    // メールアドレスとして正しくない
683    if (!db_common_is_mailaddress($mail_address)) {
684        return false;
685    }
686
687    // 携帯メールアドレスは制限しない
688    if (is_ktai_mail_address($mail_address)) {
689        return true;
690    }
691
692    //ドメイン未設定なら無条件でOK
693    if (LIMIT_DOMAIN1 == '' &&
694        LIMIT_DOMAIN2 == '' &&
695        LIMIT_DOMAIN3 == '' &&
696        LIMIT_DOMAIN4 == '' &&
697        LIMIT_DOMAIN5 == '' 
698    ) {
699        return true;
700    }
701
702    $arr = explode('@', $mail_address);
703    $mail_domain = $arr[1];
704
705    $domains = array(LIMIT_DOMAIN1,
706                     LIMIT_DOMAIN2,
707                     LIMIT_DOMAIN3,
708                     LIMIT_DOMAIN4,
709                     LIMIT_DOMAIN5,
710               );
711
712    foreach ($domains as $domain) {
713        if ($domain) {
714            $regexp = str_replace('\*', '.*', preg_quote($domain, '/'));
715            if (preg_match(sprintf('/%s/', $regexp), $mail_domain)) {
716                return true;
717            }
718        }
719    }
720    return false;
721}
722function db_member_c_member_ktai_pre4ktai_address($ktai_address)
723{
724    $sql = 'SELECT * FROM c_member_ktai_pre WHERE ktai_address = ?';
725    $params = array($ktai_address);
726    return db_get_row($sql, $params);
727}
728
729/**
730 * 携帯認証用
731 */
732function db_member_k_auth($c_member_id)
733{
734    $sql = 'SELECT c_member_id FROM c_member WHERE c_member_id = ?';
735    $params = array(intval($c_member_id));
736    return db_get_one($sql, $params);
737}
738
739function db_member_k_auth_login($ktai_address, $password)
740{
741    if (!$ktai_address or !$password) {
742        return false;
743    }
744   
745    $c_member_id = db_member_c_member_id4username($ktai_address, true);
746    $sql = "SELECT hashed_password FROM c_member_secure " .
747            " WHERE c_member_id = ? ";
748    if (md5($password) != db_get_one($sql, array($c_member_id))) {
749        return false;
750    }
751   
752    return $c_member_id;
753}
754
755function db_member_c_ktai_address_pre4session($session)
756{
757    $sql = 'SELECT * FROM c_ktai_address_pre WHERE session = ?';
758    $params = array($session);
759    return db_get_row($sql, $params);
760}
761
762function db_member_c_member_ktai_pre4session($session)
763{
764    $sql = 'SELECT * FROM c_member_ktai_pre WHERE session = ?';
765    $params = array($session);
766    return db_get_row($sql, $params);
767}
768
769function db_member_c_member_pre4ktai_session($ktai_session)
770{
771    $sql = 'SELECT * FROM c_member_pre WHERE ktai_session = ?';
772    $params = array($ktai_session);
773    return db_get_row($sql, $params);
774}
775
776/**
777 * メンバーIDからハッシュ化されたパスワードを取得
778 * (携帯の認証に暫定的に用いる)
779 *
780 * @param int $c_member_id
781 * @return string hashed password
782 */
783function db_member_hashed_password4c_member_id($c_member_id)
784{
785    $sql = 'SELECT hashed_password FROM c_member_secure WHERE c_member_id = ?';
786    $params = array(intval($c_member_id));
787    return db_get_one($sql, $params);
788}
789
790function db_member_is_password_query_complete2($ktai_address, $query_id, $query_answer)
791{
792    $sql = "SELECT c_member.c_member_id" .
793        " FROM c_member, c_member_secure" .
794        " WHERE c_member_secure.ktai_address = ?" .
795        " AND c_member.c_password_query_id = ?" .
796        " AND c_member_secure.hashed_password_query_answer = ?" .
797        " AND c_member.c_member_id = c_member_secure.c_member_id";
798    $params = array(
799        t_encrypt($ktai_address),
800        intval($query_id),
801        md5($query_answer)
802    );
803    if ($c_member_id = db_get_one($sql, $params)) {
804        return $c_member_id;
805    }
806
807    // 1.8以前との互換性を保つため、SJISでのチェックも行う
808    $params = array(
809        t_encrypt($ktai_address),
810        intval($query_id),
811        md5(mb_convert_encoding($query_answer, 'SJIS-win', 'UTF-8'))
812    );
813    return db_get_one($sql, $params);
814}
815
816function db_member_c_member_id4easy_access_id($easy_access_id, $md5 = true)
817{
818    if (!$easy_access_id) return false;
819
820    $sql = 'SELECT c_member_id FROM c_member_secure WHERE easy_access_id = ?';
821    if ($md5) {
822        $easy_access_id = md5($easy_access_id);
823    }
824    $params = array($easy_access_id);
825    return db_get_one($sql, $params);
826}
827
828function db_member_check_profile($profile_list, $public_flag_list)
829{
830    $result_list = array();
831
832    foreach ($profile_list as $key => $v) {
833        $sql = 'SELECT c_profile_id, is_required, public_flag_edit, public_flag_default, form_type, name' .
834                ' FROM c_profile WHERE name = ?';
835        $params = array($key);
836        $c_profile = db_get_row($sql, $params);
837
838        switch ($c_profile['form_type']) {
839        case 'text':
840        case 'textlong':
841        case 'textarea':
842            $value = $v;
843            $c_profile_option_id = 0;
844            break;
845        case 'select':
846        case 'radio':
847            $sql = 'SELECT value FROM c_profile_option' .
848                    ' WHERE c_profile_option_id = ? AND c_profile_id = ?';
849            $params = array(intval($v), intval($c_profile['c_profile_id']));
850            $value = db_get_one($sql, $params);
851            $c_profile_option_id = $v;
852            break;
853        case 'checkbox':
854            $value = array();
855            $c_profile_option_id = $v;
856            if (!$v) break;
857
858            $sql = "SELECT c_profile_option_id, value FROM c_profile_option" .
859                " WHERE c_profile_option_id IN (". implode(",", array_map('intval', $v)). ")" .
860                " AND c_profile_id = ?".
861                " ORDER BY sort_order";
862            $params = array(intval($c_profile['c_profile_id']));
863            $list = db_get_all($sql, $params);
864            foreach ($list as $item) {
865                $value[$item['c_profile_option_id']] = $item['value'];
866            }
867            break;
868        default:
869            $value = '';
870            $c_profile_option_id = 0;
871            break;
872        }
873
874        $public_flags = array('public', 'friend', 'private');
875        if ($c_profile['public_flag_edit']
876            && in_array($public_flag_list[$key], $public_flags)) {
877            $public_flag = $public_flag_list[$key];
878        } else {
879            $public_flag = $c_profile['public_flag_default'];
880        }
881
882        $result_list[$c_profile['name']] = array(
883            'c_profile_id' => $c_profile['c_profile_id'],
884            'c_profile_option_id' => $c_profile_option_id,
885            'value' => $value,
886            'public_flag' => $public_flag,
887        );
888    }
889
890    return $result_list;
891}
892
893/**
894 * すべてのメンバーのメンバーIDを取得
895 */
896function db_member_c_member_id_list4null()
897{
898    $sql = 'SELECT c_member_id FROM c_member';
899
900    return db_get_col($sql);
901}
902
903function db_member_is_login_rejected($c_member_id)
904{
905    $sql = 'SELECT is_login_rejected FROM c_member WHERE c_member_id = ?';
906    $params = array(intval($c_member_id));
907    return db_get_one($sql, $params);
908}
909
910/**
911 * メンバーが忍び足(あしあとをつけない)状態かどうかを取得
912 *
913 * @param   int $c_member_id
914 * @return  bool
915 */
916function db_member_is_shinobiashi($c_member_id)
917{
918    $sql = "SELECT is_shinobiashi FROM c_member WHERE c_member_id = ?";
919    $params = array(intval($c_member_id));
920    return db_get_one($sql, $params);
921}
922
923/*** write ***/
924
925//--- c_member
926
927/**
928 * プロフィール変更(c_memberテーブル分)
929 */
930function db_member_config_prof_new($c_member_id, $prof_list)
931{
932    //function cacheの削除
933    cache_drop_c_member_profile($c_member_id);
934
935    $data = array(
936        'nickname' => $prof_list['nickname'],
937        'birth_year'  => intval($prof_list['birth_year']),
938        'birth_month' => intval($prof_list['birth_month']),
939        'birth_day'   => intval($prof_list['birth_day']),
940        'public_flag_birth_year' => $prof_list['public_flag_birth_year'],
941        'u_datetime' => db_now(),
942    );
943    $where = array('c_member_id' => intval($c_member_id));
944    return db_update('c_member', $data, $where);
945}
946
947/**
948 * アクセス日時を更新
949 */
950function db_member_do_access($c_member_id)
951{
952    $data = array('access_date' => db_now());
953    $where = array('c_member_id' => intval($c_member_id));
954    return db_update('c_member', $data, $where);
955}
956
957//(image)
958
959/**
960 * プロフィール画像の変更
961 */
962function db_member_config_image_new($c_member_id, $image_filename, $img_num)
963{
964    //function cacheの削除
965    cache_drop_c_member_profile($c_member_id);
966
967    $data = array('image_filename_'.intval($img_num) => $image_filename);
968    $where = array('c_member_id' => intval($c_member_id));
969    return db_update('c_member', $data, $where);
970}
971
972/**
973 * プロフィール画像の削除
974 */
975function db_member_delete_c_member_image_new($c_member_id, $img_num)
976{
977    //function cacheの削除
978    cache_drop_c_member_profile($c_member_id);
979
980    $sql = 'UPDATE c_member SET';
981    if ($img_num == 1) {
982        $sql .= ' image_filename_1 = image_filename_2,';
983    }
984    if ($img_num == 1 || $img_num == 2) {
985        $sql .= ' image_filename_2 = image_filename_3,';
986    }
987    $sql .= ' image_filename_3 = \'\'';
988    $sql .= ' WHERE c_member_id = ?';
989    $params = array(intval($c_member_id));
990    return db_query($sql, $params);
991}
992
993/**
994 * メイン画像の変更
995 */
996function db_member_change_c_member_main_image($c_member_id, $img_num)
997{
998    //function cacheの削除
999    cache_drop_c_member_profile($c_member_id);
1000
1001    $sql = 'UPDATE c_member SET image_filename = image_filename_'.intval($img_num).
1002        ' WHERE c_member_id = ?';
1003    $params = array(intval($c_member_id));
1004    return db_query($sql, $params);
1005}
1006
1007/**
1008 * メイン画像を登録する
1009 */
1010function db_member_update_c_member_image($c_member_id, $image_filename, $img_num)
1011{
1012    //function cacheの削除
1013    cache_drop_c_member_profile($c_member_id);
1014
1015    $data = array(
1016        'image_filename' => $image_filename,
1017        'image_filename_'.intval($img_num) => $image_filename,
1018    );
1019    $where = array('c_member_id' => intval($c_member_id));
1020    return db_update('c_member', $data, $where);
1021}
1022
1023/**
1024 * My Newsを更新する
1025 */
1026function db_member_update_c_profile_my_news($c_member_id, $prof_my_news, $my_news_datetime)
1027{
1028    $sql = 'SELECT c_profile_id FROM c_profile WHERE name = ? ';
1029    $prof_my_news_id = db_get_one($sql, array('PNE_MY_NEWS'));
1030    $my_news_datetime_id = db_get_one($sql, array('PNE_MY_NEWS_DATETIME'));
1031   
1032    // function cache削除
1033    cache_drop_c_member_profile($c_member_id);
1034   
1035    $sql = 'DELETE FROM c_member_profile' .
1036            ' WHERE c_member_id = ? AND c_profile_id = ?';
1037    $params = array(intval($c_member_id), $prof_my_news_id);
1038    db_query($sql, $params);
1039    do_config_prof_insert_c_member_profile($c_member_id, $prof_my_news_id, '', $prof_my_news, 'private');
1040   
1041    $sql = 'DELETE FROM c_member_profile' .
1042            ' WHERE c_member_id = ? AND c_profile_id = ?';
1043    $params = array(intval($c_member_id), $my_news_datetime_id);
1044    db_query($sql, $params);
1045    do_config_prof_insert_c_member_profile($c_member_id, $my_news_datetime_id, '', $my_news_datetime, 'private');
1046}
1047
1048//--- c_member_secure
1049
1050function db_member_insert_c_member($c_member, $c_member_secure, $is_password_encrypted = false)
1051{
1052    if ($c_member_secure['pc_address'] && !util_is_regist_mail_address($c_member_secure['pc_address'])) {
1053        return false;
1054    }
1055
1056    if ($c_member_secure['ktai_address'] && !util_is_regist_mail_address($c_member_secure['ktai_address'])) {
1057        return false;
1058    }
1059
1060    if (!util_is_regist_mail_address($c_member_secure['regist_address'])) {
1061        return false;
1062    }
1063
1064    $data = array(
1065        'nickname'    => $c_member['nickname'],
1066        'birth_year'  => $c_member['birth_year'],
1067        'birth_month' => $c_member['birth_month'],
1068        'birth_day'   => $c_member['birth_day'],
1069        'public_flag_birth_year' => $c_member['public_flag_birth_year'],
1070        'c_member_id_invite'  => intval($c_member['c_member_id_invite']),
1071        'c_password_query_id' => intval($c_member['c_password_query_id']),
1072        'is_receive_mail' => (bool)$c_member['is_receive_mail'],
1073        'is_receive_ktai_mail'  => (bool)$c_member['is_receive_ktai_mail'],
1074        'is_receive_daily_news' => intval($c_member['is_receive_daily_news']),
1075        'r_date' => db_now(),
1076        'u_datetime' => db_now(),
1077        'image_filename' => '',
1078        'image_filename_1' => '',
1079        'image_filename_2' => '',
1080        'image_filename_3' => '',
1081        'rss' => '',
1082    );
1083    $c_member_id = db_insert('c_member', $data);
1084
1085    //function cacheの削除
1086    cache_drop_c_member_profile($c_member_id);
1087
1088    if ($c_member_secure['ktai_address']) {
1089        $c_member_secure['ktai_address'] = str_replace('"', '', $c_member_secure['ktai_address']);
1090        $c_member_secure['regist_address'] = str_replace('"', '', $c_member_secure['regist_address']);
1091    }
1092
1093    $data = array(
1094        'c_member_id' => intval($c_member_id),
1095        'hashed_password' => md5($c_member_secure['password']),
1096        'hashed_password_query_answer' => md5($c_member_secure['password_query_answer']),
1097        'pc_address'     => t_encrypt($c_member_secure['pc_address']),
1098        'ktai_address'   => t_encrypt($c_member_secure['ktai_address']),
1099        'regist_address' => t_encrypt($c_member_secure['regist_address']),
1100        'easy_access_id' => '',
1101    );
1102
1103    if ($is_password_encrypted) {
1104        $data['hashed_password'] = $c_member_secure['password'];
1105        $data['hashed_password_query_answer'] = $c_member_secure['password_query_answer'];
1106    }
1107
1108    db_insert('c_member_secure', $data);
1109
1110    return $c_member_id;
1111}
1112
1113function db_member_ktai_insert_c_member($profs)
1114{
1115    if (!util_is_regist_mail_address($profs['ktai_address'])) {
1116        return false;
1117    }
1118
1119    $data = array(
1120        'nickname' => $profs['nickname'],
1121        'birth_year' => intval($profs['birth_year']),
1122        'birth_month' => intval($profs['birth_month']),
1123        'birth_day' => intval($profs['birth_day']),
1124        'public_flag_birth_year' => $profs['public_flag_birth_year'],
1125        'r_date' => 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'  => $c_member_pre_secure['birth_year'],
1161        'birth_month' => $c_member_pre_secure['birth_month'],
1162        'birth_day'   => $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    return db_update('c_member_pre', $data, array('c_member_pre_id' => $c_member_pre_id));
1179}
1180
1181function db_member_h_config_3(
1182                $c_member_id,
1183                $is_receive_mail,
1184                $rss,
1185                $ashiato_mail_num,
1186                $is_receive_daily_news,
1187                $c_password_query_id,
1188                $c_password_query_answer,
1189                $public_flag_diary,
1190                $is_shinobiashi,
1191                $schedule_start_day)
1192{
1193    //function cacheの削除
1194    cache_drop_c_member_profile($c_member_id);
1195   
1196    $data = array(
1197        'is_receive_mail' => (bool)$is_receive_mail,
1198        'is_receive_daily_news' => intval($is_receive_daily_news),
1199        'rss' => $rss,
1200        'ashiato_mail_num' => intval($ashiato_mail_num),
1201        'c_password_query_id' => intval($c_password_query_id),
1202        'public_flag_diary' => util_cast_public_flag_diary($public_flag_diary),
1203        'is_shinobiashi' => $is_shinobiashi,
1204        'schedule_start_day' => $schedule_start_day,
1205        'u_datetime' => db_now(),
1206    );
1207    $where = array('c_member_id' => intval($c_member_id));
1208    db_update('c_member', $data, $where);
1209
1210    if (!empty($c_password_query_answer)) {
1211        $data = array(
1212            'hashed_password_query_answer' => md5($c_password_query_answer)
1213        );
1214        db_update('c_member_secure', $data, $where);
1215    }
1216}
1217
1218function db_member_update_easy_access_id($c_member_id, $easy_access_id)
1219{
1220    // function cacheを削除
1221    cache_drop_c_member_profile($c_member_id);
1222
1223    $hashed_easy_access_id = '';
1224    if ($easy_access_id) {
1225        $hashed_easy_access_id = md5($easy_access_id);
1226    }
1227    $data = array('easy_access_id' => $hashed_easy_access_id);
1228    $where = array('c_member_id' => intval($c_member_id));
1229    return db_update('c_member_secure', $data, $where);
1230}
1231
1232function db_member_update_password_query($c_member_id, $c_password_query_id, $password_query_answer)
1233{
1234    // function cacheを削除
1235    cache_drop_c_member_profile($c_member_id);
1236
1237    $data = array('c_password_query_id' => intval($c_password_query_id));
1238    $where = array('c_member_id' => intval($c_member_id));
1239    db_update('c_member', $data, $where);
1240
1241    if (empty($password_query_answer)) {
1242        $password_query_answer = '';
1243    } else {
1244        $password_query_answer = md5($password_query_answer);
1245    }
1246    $data = array('hashed_password_query_answer' => $password_query_answer);
1247    $where = array('c_member_id' => intval($c_member_id));
1248    db_update('c_member_secure', $data, $where);
1249}
1250
1251//(pc_address)
1252
1253function db_member_update_c_member_pc_address4c_member_id($c_member_id, $pc_address)
1254{
1255    // function cacheを削除
1256    cache_drop_c_member_profile($c_member_id);
1257
1258    if (!util_is_regist_mail_address($pc_address, $c_member_id)) {
1259        return false;
1260    }
1261
1262    $data = array('pc_address' => t_encrypt($pc_address));
1263    $where = array('c_member_id' => intval($c_member_id));
1264    return db_update('c_member_secure', $data, $where);
1265}
1266
1267function db_member_regist_c_member_pc_address4c_member_id($c_member_id, $pc_address)
1268{
1269    // function cacheを削除
1270    cache_drop_c_member_profile($c_member_id);
1271
1272    if (!util_is_regist_mail_address($pc_address, $c_member_id)) {
1273        return false;
1274    }
1275
1276    $data = array(
1277    'pc_address' => t_encrypt($pc_address),
1278    'regist_address' => t_encrypt($pc_address),
1279    );
1280    $where = array('c_member_id' => intval($c_member_id));
1281    return db_update('c_member_secure', $data, $where);
1282}
1283
1284//(ktai_address)
1285
1286function db_member_update_ktai_address($c_member_id, $ktai_address)
1287{
1288    // function cacheを削除
1289    cache_drop_c_member_profile($c_member_id);
1290
1291    if ($ktai_address == ''){
1292        $data = array(
1293            'ktai_address' => '',
1294            'easy_access_id' => '',
1295        );
1296    } elseif (util_is_regist_mail_address($ktai_address, $c_member_id)) {
1297        $ktai_address = str_replace('"', '', $ktai_address);
1298        $data = array('ktai_address' => t_encrypt($ktai_address));
1299    } else {
1300        return false;
1301    }
1302    $where = array('c_member_id' => intval($c_member_id));
1303    return db_update('c_member_secure', $data, $where);
1304}
1305
1306//(password)
1307
1308function db_member_update_password($c_member_id, $password)
1309{
1310    // function cacheを削除
1311    cache_drop_c_member_profile($c_member_id);
1312
1313    $data = array('hashed_password' => md5($password));
1314    $where = array('c_member_id' => intval($c_member_id));
1315    return db_update('c_member_secure', $data, $where);
1316}
1317
1318//--- c_pc_address_pre
1319
1320function db_member_h_config_1($c_member_id, $pc_address)
1321{
1322    $insert_id = 0;
1323    $session = create_hash();
1324
1325    // 既にpreに存在するメールアドレスかどうか
1326    if (do_common_c_pc_address_pre4pc_address($pc_address)) {
1327        $data = array(
1328            'c_member_id' => intval($c_member_id),
1329            'session' => $session,
1330            'r_datetime' => db_now(),
1331        );
1332        $where = array('pc_address' => $pc_address);
1333        db_update('c_pc_address_pre', $data, $where);
1334    } else {
1335        $data = array(
1336            'c_member_id' => intval($c_member_id),
1337            'pc_address' => $pc_address,
1338            'session' => $session,
1339            'r_datetime' => db_now(),
1340        );
1341        $insert_id = db_insert('c_pc_address_pre', $data);
1342    }
1343
1344    do_h_config_1_mail_send($c_member_id, $session, $pc_address);
1345    return $insert_id;
1346}
1347
1348function db_member_h_regist_mail($c_member_id, $pc_address)
1349{
1350    $insert_id = 0;
1351    $session = create_hash();
1352
1353    // 既にpreに存在するメールアドレスかどうか
1354    if (do_common_c_pc_address_pre4pc_address($pc_address)) {
1355        $data = array(
1356            'c_member_id' => intval($c_member_id),
1357            'session' => $session,
1358            'r_datetime' => db_now(),
1359        );
1360        $where = array('pc_address' => $pc_address);
1361        db_update('c_pc_address_pre', $data, $where);
1362    } else {
1363        $data = array(
1364            'c_member_id' => intval($c_member_id),
1365            'pc_address' => $pc_address,
1366            'session' => $session,
1367            'r_datetime' => db_now(),
1368        );
1369        $insert_id = db_insert('c_pc_address_pre', $data);
1370    }
1371
1372    //function cache削除
1373    cache_drop_c_member_profile($c_member_id);
1374
1375    do_h_regist_mail_mail_send($c_member_id, $session, $pc_address);
1376    return $insert_id;
1377}
1378
1379function db_member_delete_c_pc_address_pre4sid($sid)
1380{
1381    $sql = 'DELETE FROM c_pc_address_pre WHERE session = ?';
1382    $params = array($sid);
1383    return db_query($sql, $params);
1384}
1385
1386function db_member_change_mail($sid, $password)
1387{
1388    if (!$c_pc_address_pre = do_common_c_pc_address_pre4sid($sid)) {
1389        return false;
1390    }
1391
1392    $c_member_id = $c_pc_address_pre['c_member_id'];
1393    $pc_address = $c_pc_address_pre['pc_address'];
1394
1395    if (!db_common_authenticate_password($c_member_id, $password)) {
1396        return false;
1397    }
1398
1399    db_member_update_c_member_pc_address4c_member_id($c_member_id, $pc_address);
1400    db_member_delete_c_pc_address_pre4sid($sid);
1401    return true;
1402}
1403
1404function db_member_regist_mail($sid, $password)
1405{
1406    if (!$c_pc_address_pre = do_common_c_pc_address_pre4sid($sid)) {
1407        return false;
1408    }
1409
1410    $c_member_id = $c_pc_address_pre['c_member_id'];
1411    $pc_address = $c_pc_address_pre['pc_address'];
1412
1413    if (!db_common_authenticate_password($c_member_id, $password)) {
1414        return false;
1415    }
1416
1417    db_member_regist_c_member_pc_address4c_member_id($c_member_id, $pc_address);
1418    db_member_delete_c_pc_address_pre4sid($sid);
1419    return true;
1420}
1421
1422//--- c_ktai_address_pre
1423
1424/**
1425 * 携帯メールアドレス変更
1426 */
1427function db_member_insert_c_ktai_address_pre($c_member_id, $session, $ktai_address)
1428{
1429    $ktai_address = str_replace('"', '', $ktai_address);
1430
1431    $data = array(
1432        'c_member_id' => intval($c_member_id),
1433        'session' => $session,
1434        'ktai_address' => $ktai_address,
1435        'r_datetime' => db_now(),
1436    );
1437    return db_insert('c_ktai_address_pre', $data);
1438}
1439
1440function db_member_delete_ktai_address_pre($c_ktai_address_pre_id)
1441{
1442    $sql = 'DELETE FROM c_ktai_address_pre WHERE c_ktai_address_pre_id = ?';
1443    $params = array(intval($c_ktai_address_pre_id));
1444    db_query($sql, $params);
1445}
1446
1447function db_member_delete_c_ktai_address_pre4ktai_address($ktai_address)
1448{
1449    $sql = 'DELETE FROM c_ktai_address_pre WHERE ktai_address = ?';
1450    $params = array($ktai_address);
1451    db_query($sql, $params);
1452}
1453
1454//--- c_member_pre
1455
1456/**
1457 * 招待メール送信
1458 */
1459function db_member_insert_c_invite($c_member_id_invite, $pc_address, $message, $session, $is_disabled_regist_easy_access_id = false)
1460{
1461    $data = array(
1462        'pc_address' => $pc_address,
1463        'regist_address' => $pc_address,
1464        'c_member_id_invite' => intval($c_member_id_invite),
1465        'session' => $session,
1466        'r_date' => db_now(),
1467        'nickname' => '',
1468        'password' => '',
1469        'ktai_address' => '',
1470        'easy_access_id' => '',
1471        'is_disabled_regist_easy_access_id' => $is_disabled_regist_easy_access_id,
1472        'c_password_query_answer' => '',
1473    );
1474    return db_insert('c_member_pre', $data);
1475}
1476
1477/**
1478 * 招待メール送信
1479 */
1480function db_member_update_c_invite($c_member_id_invite, $pc_address, $message, $session, $is_disabled_regist_easy_access_id = false)
1481{
1482    $sql = 'SELECT c_member_pre_id,ktai_session FROM c_member_pre WHERE pc_address = ?';
1483    $pre = db_get_row($sql, array($pc_address));
1484
1485    $data = array(
1486        'c_member_id_invite' => intval($c_member_id_invite),
1487        'session' => $session,
1488        'regist_address' => $pc_address,
1489        'is_disabled_regist_easy_access_id' => $is_disabled_regist_easy_access_id,
1490        'r_date' => db_now(),
1491    );
1492
1493    // プロフィール項目登録済みで携帯版未登録の場合(個体識別番号必須制)
1494    if (!empty($pre['ktai_session'])) {
1495        // プロフィール情報を削除
1496        db_member_delete_c_member_pre_profile4c_member_pre_id($pre['c_member_pre_id']);
1497        $tmp = array(
1498            'nickname' => '',
1499            'birth_year' => 0,
1500            'birth_month' => 0,
1501            'birth_day' => 0,
1502            'ktai_address' => '',
1503            'password' => '',
1504            'c_password_query_id' => 0,
1505            'c_password_query_answer' => '',
1506            'ktai_session' => '',
1507        );
1508        $data = array_merge($data, $tmp);
1509    }
1510
1511    $where = array('pc_address' => $pc_address);
1512    return db_update('c_member_pre', $data, $where);
1513}
1514
1515function db_member_delete_c_member_pre($c_member_id, $delete_c_member_ids)
1516{
1517    if (!(is_array($delete_c_member_ids) && $delete_c_member_ids)) {
1518        return false;
1519    }
1520    $ids = implode(',', array_map('intval', $delete_c_member_ids));
1521
1522    $sql = 'DELETE FROM c_member_pre WHERE c_member_id_invite = ?'.
1523            ' AND c_member_pre_id IN ('.$ids.')';
1524    $params =  array(intval($c_member_id));
1525    db_query($sql, $params);
1526}
1527
1528function db_member_delete_c_member_pre4sid($sid)
1529{
1530    $sql = 'DELETE FROM c_member_pre WHERE session = ?';
1531    $params = array($sid);
1532    return db_query($sql, $params);
1533}
1534
1535function db_member_delete_c_member_pre4ktai_session($ktai_session)
1536{
1537    $sql = 'DELETE FROM c_member_pre WHERE ktai_session = ?';
1538    $params = array($ktai_session);
1539    return db_query($sql, $params);
1540}
1541
1542function db_member_delete_c_member_pre_profile4c_member_pre_id($c_member_pre_id)
1543{
1544    $sql = 'DELETE FROM c_member_pre_profile WHERE c_member_pre_id = ?';
1545    $params = array($c_member_pre_id);
1546    return db_query($sql, $params);
1547}
1548
1549//--- c_member_ktai_pre
1550
1551function db_member_delete_c_member_ktai_pre($c_member_id, $delete_c_member_ids)
1552{
1553    if (!is_array($delete_c_member_ids) && $delete_c_member_ids) {
1554        return false;
1555    }
1556    $ids = implode(',', array_map('intval', $delete_c_member_ids));
1557
1558    $sql = 'DELETE FROM c_member_ktai_pre WHERE c_member_id_invite = ?' .
1559            ' AND c_member_ktai_pre_id IN ('.$ids.')';
1560    $params = array(intval($c_member_id));
1561    db_query($sql, $params);
1562}
1563
1564function db_member_delete_c_member_ktai_pre4id($c_member_ktai_pre_id)
1565{
1566    $sql = 'DELETE FROM c_member_ktai_pre WHERE c_member_ktai_pre_id = ?';
1567    $params = array(intval($c_member_ktai_pre_id));
1568    db_query($sql, $params);
1569}
1570
1571/**
1572 * c_member_ktai_preを更新
1573 */
1574function db_member_update_c_member_ktai_pre($session, $ktai_address, $c_member_id_invite, $is_disabled_regist_easy_access_id = false)
1575{
1576    $data = array(
1577        'session' => $session,
1578        'r_datetime' => db_now(),
1579        'c_member_id_invite' => intval($c_member_id_invite),
1580        'is_disabled_regist_easy_access_id' => $is_disabled_regist_easy_access_id,
1581    );
1582    $where = array('ktai_address' => $ktai_address);
1583    return db_update('c_member_ktai_pre', $data, $where);
1584}
1585
1586function db_member_delete_c_member_ktai_pre4ktai_address($ktai_address)
1587{
1588    $sql = 'DELETE FROM c_member_ktai_pre WHERE ktai_address = ?';
1589    $params = array($ktai_address);
1590    db_query($sql, $params);
1591}
1592
1593function db_member_insert_c_member_ktai_pre($session, $ktai_address, $c_member_id_invite, $is_disabled_regist_easy_access_id = false)
1594{
1595    $ktai_address = str_replace('"', '', $ktai_address);
1596    if (db_member_c_member_ktai_pre4ktai_address($ktai_address)) {  // 二重引用符を除去した結果、DB内メールアドレスと重複する
1597        return db_member_update_c_member_ktai_pre($session, $ktai_address, $c_member_id_invite, $is_disabled_regist_easy_access_id);
1598    }
1599
1600    $data = array(
1601        'session' => $session,
1602        'ktai_address' => $ktai_address,
1603        'c_member_id_invite' => intval($c_member_id_invite),
1604        'r_datetime' => db_now(),
1605        'is_disabled_regist_easy_access_id' => $is_disabled_regist_easy_access_id,
1606    );
1607    return db_insert('c_member_ktai_pre', $data);
1608}
1609
1610//--- profile関連
1611
1612function db_member_c_profile4name($name)
1613{
1614    $sql = 'SELECT * FROM c_profile WHERE name = ?';
1615    return db_get_row($sql, array($name));
1616}
1617
1618function db_member_update_c_member_profile($c_member_id, $c_member_profile_list)
1619{
1620    //function cache削除
1621    cache_drop_c_member_profile($c_member_id);
1622
1623    foreach ($c_member_profile_list as $item) {
1624        $sql = 'DELETE FROM c_member_profile' .
1625                ' WHERE c_member_id = ? AND c_profile_id = ?';
1626        $params = array(intval($c_member_id), intval($item['c_profile_id']));
1627        db_query($sql, $params);
1628
1629        if (!(is_null($item['value']) || $item['value'] === '')) {
1630            if (is_array($item['value'])) {
1631                foreach ($item['value'] as $key => $value) {
1632                    do_config_prof_insert_c_member_profile($c_member_id, $item['c_profile_id'], $key, $value, $item['public_flag']);
1633                }
1634            } else {
1635                do_config_prof_insert_c_member_profile($c_member_id, $item['c_profile_id'], $item['c_profile_option_id'], $item['value'], $item['public_flag']);
1636            }
1637        }
1638    }
1639}
1640
1641function db_member_insert_c_member_profile($c_member_id, $c_profile_id, $c_profile_option_id, $value, $public_flag)
1642{
1643    //function cache削除
1644    cache_drop_c_member_profile($c_member_id);
1645
1646    $data = array(
1647        'c_member_id' => intval($c_member_id),
1648        'c_profile_id' => intval($c_profile_id),
1649        'c_profile_option_id' => intval($c_profile_option_id),
1650        'value' => $value,
1651        'public_flag' => $public_flag,
1652    );
1653    return db_insert('c_member_profile', $data);
1654}
1655
1656/***
1657 * 一時的に c_member_pre_profile にプロフィール情報をインサートする
1658 *
1659 * 個体識別番号登録必須制が「必須にする」である場合など、c_member ではなく c_member_pre を使うのが望ましい場面で使用する。
1660 *
1661 * @param int $c_member_pre_id
1662 * @param int $c_profile_id
1663 * @param int $c_profile_option_id
1664 * @param int $value
1665 * @param string $public_flag
1666 * @return mixed
1667 */
1668function db_member_insert_c_member_pre_profile($c_member_pre_id, $c_profile_id, $c_profile_option_id, $value, $public_flag)
1669{
1670    $data = array(
1671        'c_member_pre_id' => intval($c_member_pre_id),
1672        'c_profile_id' => intval($c_profile_id),
1673        'c_profile_option_id' => intval($c_profile_option_id),
1674        'value' => $value,
1675        'public_flag' => $public_flag,
1676    );
1677    return db_insert('c_member_pre_profile', $data);
1678}
1679
1680/***
1681 * c_member_pre_profile のプロフィール情報を更新する
1682 *
1683 * @param int $c_member_pre_id
1684 * @param array $c_member_profile_list
1685 * @return mixed
1686 */
1687function db_member_update_c_member_pre_profile($c_member_pre_id, $c_member_profile_list)
1688{
1689    foreach ($c_member_profile_list as $item) {
1690        $sql = 'DELETE FROM c_member_pre_profile' .
1691                ' WHERE c_member_pre_id = ? AND c_profile_id = ?';
1692        $params = array(intval($c_member_pre_id), intval($item['c_profile_id']));
1693        db_query($sql, $params);
1694   
1695        if (!(is_null($item['value']) || $item['value'] === '')) {
1696            if (is_array($item['value'])) {
1697                foreach ($item['value'] as $key => $value) {
1698                    db_member_insert_c_member_pre_profile($c_member_pre_id, $item['c_profile_id'], $key, $value, $item['public_flag']);
1699                }
1700            } else {
1701                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']);
1702            }
1703        }
1704    }
1705}
1706
1707/***
1708 * c_member_pre_profile のプロフィール情報を取得する
1709 *
1710 * @param int $c_member_pre_id
1711 * @return array
1712 */
1713function db_member_c_member_pre_profile4c_member_pre_id($c_member_pre_id)
1714{
1715    $sql = 'SELECT * FROM c_member_pre_profile WHERE c_member_pre_id = ?';
1716    $params = array(intval($c_member_pre_id));
1717    return db_get_all($sql, $params);
1718}
1719
1720//--- c_access_block
1721
1722function db_member_insert_c_access_block($c_member_id, $c_member_id_block)
1723{
1724    // 存在するIDのみを抽出
1725    $c_member_id_block = db_member_filter_c_access_block_id($c_member_id, $c_member_id_block);
1726
1727    $sql = 'DELETE FROM c_access_block WHERE c_member_id = ?';
1728    $params = array(intval($c_member_id));
1729    db_query($sql, $params);
1730
1731    foreach ($c_member_id_block as $id) {
1732        $data = array(
1733            'c_member_id' => intval($c_member_id),
1734            'c_member_id_block' => intval($id),
1735            'r_datetime' => db_now(),
1736        );
1737        db_insert('c_access_block', $data);
1738    }
1739}
1740
1741function db_member_filter_c_access_block_id($c_member_id, $c_member_id_block)
1742{
1743    $c_member_id_block = array_unique(array_map('intval', $c_member_id_block));
1744    if (!$c_member_id_block) {
1745        return array();
1746    }
1747    $ids = implode(',', $c_member_id_block);
1748    $sql = 'SELECT c_member_id FROM c_member WHERE (c_member_id IN ('.$ids.')) AND (c_member_id <> ?) ';
1749    return db_get_col($sql, array($c_member_id));
1750}
1751
1752//---
1753
1754function db_member_update_mail_receive($c_member_id, $is_receive_ktai_mail)
1755{
1756    // function cacheを削除
1757    cache_drop_c_member_profile($c_member_id);
1758
1759    $data = array('is_receive_ktai_mail' => intval($is_receive_ktai_mail));
1760    $where = array('c_member_id' => intval($c_member_id));
1761    db_update('c_member', $data, $where);
1762}
1763
1764function db_member_update_ashiato_mail_num($c_member_id, $ashiato_mail_num)
1765{
1766    // function cacheを削除
1767    cache_drop_c_member_profile($c_member_id);
1768
1769    $data = array('ashiato_mail_num' => intval($ashiato_mail_num));
1770    $where = array('c_member_id' => intval($c_member_id));
1771    db_update('c_member', $data, $where);
1772}
1773
1774function db_member_update_public_flag_diary($c_member_id, $public_flag_diary)
1775{
1776    // function cacheを削除
1777    cache_drop_c_member_profile($c_member_id);
1778
1779    $data = array('public_flag_diary' => util_cast_public_flag_diary($public_flag_diary));
1780    $where = array('c_member_id' => intval($c_member_id));
1781    db_update('c_member', $data, $where);
1782}
1783
1784function db_member_update_is_shinobiashi($c_member_id, $is_shinobiashi)
1785{
1786    // function cacheを削除
1787    cache_drop_c_member_profile($c_member_id);
1788
1789    $data = array('is_shinobiashi' => intval($is_shinobiashi));
1790    $where = array('c_member_id' => intval($c_member_id));
1791    db_update('c_member', $data, $where);
1792}
1793
1794function db_member_insert_username($c_member_id, $username)
1795{
1796    $data = array(
1797    "c_member_id"=>$c_member_id,
1798    "username"=>$username,
1799    );
1800    db_insert('c_username', $data);
1801}
1802
1803/**
1804 * ログインIDからc_member_idを取得
1805 */
1806function db_member_c_member_id4username($username, $is_ktai = false)
1807{
1808    if (!IS_SLAVEPNE) {
1809        $username = t_encrypt($username);
1810    }
1811    return db_member_c_member_id4username_encrypted($username, $is_ktai);
1812}
1813
1814/**
1815 * ログインIDからc_member_idを取得
1816 *
1817 * @param string $username 暗号化されたメールアドレス or SlavePNEのusername
1818 * @return int c_member_id
1819 */
1820function db_member_c_member_id4username_encrypted($username, $is_ktai = false)
1821{
1822    if (IS_SLAVEPNE) {
1823        $sql = 'SELECT c_member_id FROM c_username WHERE username = ?';
1824        $params = array($username);
1825        $c_member_id = db_get_one($sql, $params);
1826    } else {
1827        if ($is_ktai) {
1828            $c_member_id = db_member_c_member_id4ktai_address_encrypted($username);
1829        } else {
1830            $c_member_id = db_member_c_member_id4pc_address_encrypted($username);
1831        }
1832    }
1833    return $c_member_id;
1834}
1835
1836/**
1837 * ログインIDからc_member_idを取得
1838 */
1839function db_member_username4c_member_id($c_member_id, $is_ktai = false)
1840{
1841    if (IS_SLAVEPNE) {
1842        $sql = 'SELECT username FROM c_username WHERE c_member_id = ?';
1843        $params = array($c_member_id);
1844        $username = db_get_one($sql, $params);
1845    } else {
1846        $c_member_secure = db_member_c_member_secure4c_member_id($c_member_id);
1847        if ($is_ktai) {
1848            $username = $c_member_secure['ktai_address'];
1849        } else {
1850            $username = $c_member_secure['pc_address'];
1851        }
1852    }
1853    return $username;
1854}
1855
1856/**
1857 * ログインしたメンバーの情報が存在しない場合自動で生成
1858 */
1859function db_member_create_member($username)
1860{
1861    $data = array(
1862        'nickname'    => "NO NAME",
1863        'birth_year'  => 0,
1864        'birth_month' => 0,
1865        'birth_day'   => 0,
1866        'public_flag_birth_year' => "public",
1867        'c_member_id_invite'  => 1,
1868        'c_password_query_id' => 0,
1869        'is_receive_mail' => true,
1870        'is_receive_ktai_mail'  => true,
1871        'is_receive_daily_news' => true,
1872        'r_date' => db_now(),
1873        'u_datetime' => db_now(),
1874        'image_filename' => '',
1875        'image_filename_1' => '',
1876        'image_filename_2' => '',
1877        'image_filename_3' => '',
1878        'rss' => '',
1879    );
1880    $c_member_id = db_insert('c_member', $data);
1881    if (!$c_member_id) {
1882        return false;
1883    }
1884
1885    $data = array(
1886        'c_member_id' => intval($c_member_id),
1887        'hashed_password' => "",
1888        'hashed_password_query_answer' => "",
1889        'pc_address'     => "",
1890        'ktai_address'   => "",
1891        'regist_address' => "",
1892        'easy_access_id' => '',
1893    );
1894    if (!db_insert('c_member_secure', $data)) {
1895        $sql = 'DELETE FROM c_member WHERE c_member_id = ?';
1896        db_query($sql, array($c_member_id));
1897
1898        return false;
1899    }
1900   
1901    $data = array(
1902        'c_member_id' => intval($c_member_id),
1903        'username' => $username,
1904    );
1905    if (!db_insert('c_username', $data)) {
1906        $sql = 'DELETE FROM c_member WHERE c_member_id = ?';
1907        db_query($sql, array($c_member_id));
1908
1909        $sql = 'DELETE FROM c_member_secure WHERE c_member_id = ?';
1910        db_query($sql, array($c_member_id));
1911
1912        return false;
1913    }
1914
1915    return $c_member_id;
1916}
1917
1918/**
1919 * プロフィールに必須項目が入力されているかを返す。
1920 * 0:入力済み
1921 * 1:プロフィール未入力
1922 * 2:メールアドレス未登録
1923 */
1924function db_member_check_param_inputed($c_member_id, $is_ktai = false)
1925{
1926    $c_member = db_member_c_member4c_member_id($c_member_id, true);
1927
1928    if (($c_member['nickname'] === '')
1929     || !$c_member['birth_year']
1930     || !$c_member['birth_month']
1931     || !$c_member['birth_day']
1932    ) {
1933        return 1;
1934    }
1935
1936    if ($c_member['secure']['pc_address'] === '' && !$is_ktai) {
1937        return 2;
1938    }
1939    if ($c_member['secure']['ktai_address'] === '' && $is_ktai) {
1940        return 2;
1941    }
1942
1943    return 0;
1944}
1945
1946function db_member_is_ktai_id_registed($c_member_id)
1947{
1948    $sql = 'SELECT easy_access_id FROM c_member_secure WHERE c_member_id = ?';
1949    $params = array(intval($c_member_id));
1950    return (db_get_one($sql, $params) != '');
1951}
1952
1953function db_member_is_blacklist($c_member_id)
1954{
1955    $sql = 'SELECT COUNT(*) FROM c_blacklist'
1956         . ' INNER JOIN c_member_secure USING (easy_access_id)'
1957         . ' WHERE c_member_secure.c_member_id = ?';
1958    $params = array(intval($c_member_id));
1959    return (bool)db_get_one($sql, $params);
1960}
1961
1962function db_member_easy_access_id_is_blacklist($easy_access_id, $c_blacklist_id = 0)
1963{
1964    $sql = 'SELECT COUNT(*) FROM c_blacklist WHERE easy_access_id = ? AND c_blacklist_id <> ?';
1965    $param = array(
1966        $easy_access_id,
1967        intval($c_blacklist_id),
1968    );
1969    return (bool)db_get_one($sql, $param);
1970}
1971
1972?>
Note: See TracBrowser for help on using the repository browser.