회원에게 if (!$member[mb_id]) 값이 null로 나오는 이유가 뭘까요? > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

회원에게 if (!$member[mb_id]) 값이 null로 나오는 이유가 뭘까요? 정보

회원에게 if (!$member[mb_id]) 값이 null로 나오는 이유가 뭘까요?

본문

쪽지 기능을 보면 memo.php의 가장 앞에 아래처럼 $member[mb_id]의 값으로
회원여부를 확인 합니다. 그런데, 가끔씩 일반회원들이 로그인할 때 회원만 이용
할 수 있다고 하면서 오류메시지가 나옵니다. 일반 게시판의 이용은 정상인데
팝업으로 창이 뜨는 메모에서만 회원만 이용할 수 있다는 메시지가 가끔씩 나오는
이유가 뭘까요???

저도 몇번 보기는 했지만 지속적인 재현이 안되네요. ㅠ..ㅠ...

/bbs/memo.php의 가장 앞부분

if (!$member[mb_id])
    alert_close("회원만 이용하실 수 있습니다.");

/js/common.js의 메모호출 부분

    function win_memo(url)
    {
        if (!url)
            url = g4_path + "/" + g4_bbs + "/memo.php";
        win_open(url, "winMemo", "left=50,top=50,width=616,height=460,scrollbars=1");
    }

common.php의 $member 변수 setting 부분

// 자동로그인 부분에서 첫로그인에 포인트 부여하던것을 로그인중일때로 변경하면서 코드도 대폭 수정하였습니다.
if ($_SESSION['ss_mb_id']) // 로그인중이라면
{
    $member = get_member($_SESSION['ss_mb_id']);

    // 오늘 처음 로그인 이라면
    if (substr($member['mb_today_login'], 0, 10) != $g4['time_ymd'])
    {
        // 첫 로그인 포인트 지급
        insert_point($member['mb_id'], $config['cf_login_point'], "{$g4['time_ymd']} 첫로그인", "@login", $member['mb_id'], $g4['time_ymd']);

        // 오늘의 로그인이 될 수도 있으며 마지막 로그인일 수도 있음
        // 해당 회원의 접근일시와 IP 를 저장
        $sql = " update {$g4['member_table']} set mb_today_login = '{$g4['time_ymdhis']}', mb_login_ip = '{$_SERVER['REMOTE_ADDR']}' where mb_id = '{$member['mb_id']}' ";
        sql_query($sql);
    }
}
else
{
    // 자동로그인 ---------------------------------------
    // 회원아이디가 쿠키에 저장되어 있다면 (3.27)
    if ($tmp_mb_id = get_cookie("ck_mb_id"))
    {
        // 최고관리자는 자동로그인 금지
        if ($tmp_mb_id != $config['cf_admin'])
        {
            $sql = " select mb_password, mb_intercept_date, mb_leave_date, mb_email_certify
                      from {$g4['member_table']} where mb_id = '$tmp_mb_id' ";
            $row = sql_fetch($sql);
            $key = md5($_SERVER['SERVER_ADDR'] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . $row['mb_password']);
            // 쿠키에 저장된 키와 같다면
            $tmp_key = get_cookie("ck_auto");
            if ($tmp_key == $key && $tmp_key)
            {
                // 차단, 탈퇴가 아니고 메일인증이 사용이면서 인증을 받았다면
                if ($row['mb_intercept_date'] == "" &&
                    $row['mb_leave_date'] == "" &&
                    (!$config['cf_use_email_certify'] || preg_match('/[1-9]/', $row['mb_email_certify'])) )
                {
                    // 세션에 회원아이디를 저장하여 로그인으로 간주
                    set_session("ss_mb_id", $tmp_mb_id);

                    // 페이지를 재실행
                    echo "<script language='javascript'> window.location.reload(); </script>";
                    exit;
                }
            }
            // $row 배열변수 해제
            unset($row);
        }
    }
    // 자동로그인 end ---------------------------------------
}
  • 복사

댓글 전체

ㅜ_ㅜ; 도움은 안되겠지만

include_once("./_common.php");

if ($_SESSION['ss_mb_id']) // 로그인중이라면
{
    $member = get_member($_SESSION['ss_mb_id']);
}

if ($member['mb_id'] == ""){
    alert_close("회원만 이용하실 수 있습니다.");
}

$g4[title] = "내 쪽지함";
include_once("$g4[path]/head.sub.php");

해보세요...

이것도 안되면

아래

if ((!$member['mb_id']) && (!$_SESSION['ss_mb_id'])){

    alert_close("회원만 이용하실 수 있습니다.");

}
if ($_SESSION['ss_mb_id']) // 로그인중이라면
{
    $member = get_member($_SESSION['ss_mb_id']);
}

이부분은 앞에서 _common.php를 include했기 때문에 이미 실행된 것 입니다. ㅠ..ㅠ.
그럼
if ((!$member['mb_id']) && (!$_SESSION['ss_mb_id'])){

    alert_close("회원만 이용하실 수 있습니다.");

}else{

if (!$member['mb_id']){
    alert_close("회원만 이용하실 수 있습니다.");
    echo "<script language='javascript'> window.location.reload(); </script>";
    exit;
}
}

!!!!!!!!!!!ㅡ,..ㅡ;
그것도 아니면 마지막으로

if ((!$member['mb_id']) && (!$_SESSION['ss_mb_id'])){

    alert_close("회원만 이용하실 수 있습니다.");

}else{

if (!$member['mb_id']){
    alert_close("회원만 이용하실 수 있습니다.");
    echo "<script language='javascript'> window.location.reload(); </script>";
    exit;
}
}
질문의 요지가 /bbs/memo.php 에서 $member[mb_id]이 널이라는 거죠?
해당파일에서 print_r($member)를 찍어보셨나요?
어딘가에서 unset됐을테니까 그건 직접 찾으셔야겠고...
(unset이 아니라면 부모자식간의 세션공유가 안되는 경우?
부모는 www가 붙고 자식은 안붙고... 아님 그 반대... 아무튼...)

임시방편으로 /bbs/memo.php에서
$member = array();
$member = get_member($_SESSION['ss_mb_id']);
if (!$member[mb_id])
    alert_close("회원만 이용하실 수 있습니다.");
.....
앞에서 _common.php를 include를 하기 때문에 unset 된 것을 다시 set해주고 있어요.
부모자식간 세션공유의 문제일 수도 있는데 ( .도메인.co.kr 과 같이 쿠키 도메인을
주고는 있어요) ... 이게 재현이 안되고 계속 오류신고만 들어오니 황당한거죠. ㅠ..ㅠ..

임시방편은 _common.php에 있는 코드라서... 넣는다고 해결책은 아닌거 같아요.
세션은 배추팁으로 꾸준히 정리중이고, 가끔씩 전체삭제도 합니다.

사용자 PC에 문제가 있다면 그누 게시판도 안되야 하는데,
게시판은 잘 되면서 가끔씩 쪽지가 안된다는 사람들이 있어요. ㅠ..ㅠ...

이것은 윈도가 새로 뜨면서 뭔가 문제가 생기는거 같기도 하구요.
이미 있는 코드다~ 재현이 안된다~ 이렇게 하나하나 따지면 결국은 오류못잡아요.
메시지출력전에 에러리포팅 파일을 만들어서 주기적으로 관찰해보는 건 어떨지요...

if (!$member[mb_id])
{
  include_once('./error_reporting.php');
  alert_close("회원만 이용하실 수 있습니다.");
}

리포팅파일에는 의심되는 부분을 기록하는 코드를 심어야겠죠.
슈퍼전역변수를 모두 기록한다거나 엑스엠엘님 말처럼 그누보드의 전역변수를 찍어본다거나...
애러 리포팅은 생각도 안했네요. ㅋㅋ

문제가 되는 경우에 ss_mb_id, uri, time_stamp를 찍어두면 되겠네요.
지금 추측은 윈도가 새로 쓰는 과정에서 세션정보가 없어지는거 같아요.
© SIRSOFT
현재 페이지 제일 처음으로