Hello,

kok nae-ga ha-myun an-dweneun MAGIC...🧚

웹 프로그래밍/PHP

회원가입 및 로그인 페이지 만들기 03

✿도담도담 2018. 10. 30. 12:49

1편 - [Web Programming/PHP] - 회원가입 및 로그인 페이지 만들기 01

2편 - [Web Programming/PHP] - 회원가입 및 로그인 페이지 만들기 02


1편, 2편에 이어 3편으로는 회원가입 부분을 살펴보자😉


< register.php >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?php
include("./dbconn.php");  // DB연결을 위한 같은 경로의 dbconn.php를 인클루드합니다.
 
if(isset($_SESSION['ss_mb_id']) && $_GET['mode'== 'modify') { // 세션이 있고 회원수정 mode라면 회원 정보를 가져옴
    $mb_id = $_SESSION['ss_mb_id'];
    
    $sql = " SELECT * FROM member WHERE mb_id = '$mb_id' "// 회원 정보를 조회
    $result = mysqli_query($conn$sql);
    $mb = mysqli_fetch_assoc($result);
    mysqli_close($conn); // 데이터베이스 접속 종료
 
    $mode = "modify";
    $title = "회원수정";
    $modify_mb_info = "readonly";
else {
    $mode = "insert";
    $title = "회원가입";
    $modify_mb_info = '';
}
?>
<html>
<head>
    <title>Register</title>
    <link href="./style.css" rel="stylesheet" type="text/css">
</head>
<body>
 
<h1><?php echo $title ?></h1>
 
<form action="./register_update.php" onsubmit="return fregisterform_submit(this);" method="post">
    <input type="hidden" name="mode" value="<?php echo $mode ?>">
 
    <table>
        <tr>
            <th>아이디</th>
            <td><input type="text" name="mb_id" value="<?php echo $mb['mb_id'] ?>" <?php echo $modify_mb_info ?>></td>
        </tr>
        <tr>
            <th>비밀번호</th>
            <td><input type="password" name="mb_password"></td>
        </tr>
        <tr>
            <th>비밀번호 확인</th>
            <td><input type="password" name="mb_password_re"></td>
        </tr>
        <tr>
            <th>이름</th>
            <td><input type="text" name="mb_name" value="<?php echo $mb['mb_name'] ?>" <?php echo $modify_mb_info ?>></td>
        </tr>
        <tr>
            <th>이메일</th>
            <td><input type="text" name="mb_email" value="<?php echo $mb['mb_email'] ?>"></td>
        </tr>
        <tr>
            <th>성별</th>
            <td>
                <label><input type="radio" name="mb_gender" value="남자" <?php echo ($mb['mb_gender'== "남자") ? "checked" : "";?> >남자</label>
                <label><input type="radio" name="mb_gender" value="여자" <?php echo ($mb['mb_gender'== "여자") ? "checked" : "";?> >여자</label>
            </td>
        </tr>
        <tr>
            <th>직업</th>
            <td>
                <select name="mb_job">
                    <option value="">선택하세요</option>
                    <option value="학생" <?php echo ($mb['mb_job'== "학생") ? "selected" : "";?> >학생</option>
                    <option value="회사원" <?php echo ($mb['mb_job'== "회사원") ? "selected" : "";?> >회사원</option>
                    <option value="공무원" <?php echo ($mb['mb_job'== "공무원") ? "selected" : "";?> >공무원</option>
                    <option value="주부" <?php echo ($mb['mb_job'== "주부") ? "selected" : "";?> >주부</option>
                    <option value="무직" <?php echo ($mb['mb_job'== "무직") ? "selected" : "";?> >무직</option>
                </select>
            </td>
        </tr>
        <tr>
            <th>관심언어</th>
            <td>
                <label><input type="checkbox" name="mb_language[]" value="HTML" <?php echo strpos($mb['mb_language'], 'HTML'!== false ? 'checked' : '' ?>>HTML</label>
                <label><input type="checkbox" name="mb_language[]" value="CSS" <?php echo strpos($mb['mb_language'], 'CSS'!== false ? 'checked' : '' ?>>CSS</label>
                <label><input type="checkbox" name="mb_language[]" value="PHP" <?php echo strpos($mb['mb_language'], 'PHP'!== false ? 'checked' : '' ?>>PHP</label>
                <label><input type="checkbox" name="mb_language[]" value="MySQL" <?php echo strpos($mb['mb_language'], 'MySQL'!== false ? 'checked' : '' ?>>MySQL</label>
            </td>
        </tr>
        <tr>
            <td colspan="2" class="td_center"><input type="submit" value="<?php echo $title ?>"> <a href="./login.php">취소</a></td>
        </tr>
    </table>
</form>
 
<script>
function fregisterform_submit(f) { // submit 최종 폼체크
 
    if (f.mb_id.value.length < 1) { // 회원아이디 검사
        alert("아이디를 입력하십시오.");
        f.mb_id.focus();
        return false;
    }
 
    if (f.mb_name.value.length < 1) { // 이름 검사
        alert("이름을 입력하십시오.");
        f.mb_name.focus();
        return false;
    }
 
    if (f.mb_password.value.length < 3) {
        alert("비밀번호를 3글자 이상 입력하십시오.");
        f.mb_password.focus();
        return false;
    }
 
    if (f.mb_password.value != f.mb_password_re.value) {
        alert("비밀번호가 같지 않습니다.");
        f.mb_password_re.focus();
        return false;
    }
 
    if (f.mb_password.value.length > 0) {
        if (f.mb_password_re.value.length < 3) {
            alert("비밀번호를 3글자 이상 입력하십시오.");
            f.mb_password_re.focus();
            return false;
        }
    }
 
    if (f.mb_email.value.length < 1) { // 이메일 검사
        alert("이메일을 입력하십시오.");
        f.mb_email.focus();
        return false;
    }
 
    if (f.mb_email.value.length > 0) { // 이메일 형식 검사
        var regExp = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;
        if (f.mb_email.value.match(regExp) == null) {
            alert("이메일 주소가 형식에 맞지 않습니다.");
            f.mb_email.focus();
            return false;
        }        
    }
 
    return true;
 
}
</script>
 
</body>
</html>
cs


어우 길다..^^

우선 큰 흐름을 보면 IF 세션이 있고 회원 수정 모드라면 데이터베이스에서 회원정보를 가져오고,

그렇지 않다면 회원가입 화면을 보여준다.

3개의 변수를 사용해 ( $mode, $title, $modify_mb_info ) 모드와 타이틀 명을 나타내고 수정 모드일 경우 input태그의 속성으로 readonly를 주도록 해놓았다.

그리고 수정 모드에서 값을 바로 나타내주기 위해 라디오 버튼의 속성을 삼항연산자로 체크 후 설정해주었다. ( ex. ($mb['mb_job'== "학생") ? "selected" : ""; )

.

.

하단에 위치한 회원 수정 또는 회원 가입의 버튼을 누를 시 form태그의 onsubmit이벤트를 설정해주어 function fregisterform_submit(f) 함수를 실행 후 register_update.php로 넘어가게 된다.

처음 보고있는 php코드이지만 별로 어려운 부분은 없는것 같다 😒



< register_update.php >


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php
include("./dbconn.php");  // DB연결을 위한 같은 경로의 dbconn.php를 인클루드합니다.
 
$mode = $_POST['mode'];
 
if($mode != 'insert' && $mode != 'modify') { // 아무런 모드가 없다면 중단
    echo "<script>alert('mode 값이 제대로 넘어오지 않았습니다.');</script>";
    echo "<script>location.replace('./register.php');</script>";
    exit;
}
 
switch ($mode) {
    case 'insert' :
        $mb_id = trim($_POST['mb_id']);
        $title = "회원가입";
        break;
    case 'modify' :
        $mb_id = trim($_SESSION['ss_mb_id']);
        $title = "회원수정";
        break;
}
 
$mb_password            = trim($_POST['mb_password']); // 첫번째 입력 패스워드
$mb_password_re        = trim($_POST['mb_password_re']); // 두번째 입력 패스워드
$mb_name                = trim($_POST['mb_name']); // 이름
$mb_email                = trim($_POST['mb_email']); // 이메일
$mb_gender                = $_POST['mb_gender']; // 성별
$mb_job                    = $_POST['mb_job']; // 직업
$mb_ip                    = $_SERVER['REMOTE_ADDR']; // 접속 아이피
$mb_language            = implode(","$_POST['mb_language']); // 관심언어 (,) 구분으로 저장
$mb_datetime            = date('Y-m-d H:i:s'time()); // 가입일
$mb_modify_datetime    = date('Y-m-d H:i:s'time()); // 수정일
 
if (!$mb_id) {
    echo "<script>alert('아이디가 넘어오지 않았습니다.');</script>";
    echo "<script>location.replace('./register.php');</script>";
    exit;
}
 
if (!$mb_password) {
    echo "<script>alert('비밀번호가 넘어오지 않았습니다.');</script>";
    echo "<script>location.replace('./register.php');</script>";
    exit;
}
 
if ($mb_password != $mb_password_re) {
    echo "<script>alert('비밀번호가 일치하지 않습니다.');</script>";
    echo "<script>location.replace('./register.php');</script>";
    exit;
}
 
if (!$mb_name) {
    echo "<script>alert('이름이 넘어오지 않았습니다.');</script>";
    echo "<script>location.replace('./register.php');</script>";
    exit;
}
 
if (!$mb_email) {
    echo "<script>alert('이메일이 넘어오지 않았습니다.');</script>";
    echo "<script>location.replace('./register.php');</script>";
    exit;
}
 
$sql = " SELECT PASSWORD('$mb_password') AS pass "// 입력한 비밀번호를 MySQL password() 함수를 이용해 암호화해서 가져옴
$result = mysqli_query($conn$sql);
$row = mysqli_fetch_assoc($result);
$mb_password = $row['pass'];
 
if($mode == "insert") { // 신규 등록 상태
 
    $sql = " SELECT * FROM member WHERE mb_id = '$mb_id' "// 회원가입을 시도하는 아이디가 사용중인 아이디인지 체크
    $result = mysqli_query($conn$sql);
 
    if (mysqli_num_rows($result> 0) { // 만약 사용중인 아이디라면 알림창을 띄우고 회원가입 페이지로 이동
        echo "<script>alert('이미 사용중인 회원아이디 입니다.');</script>";
        echo "<script>location.replace('./register.php');</script>";
        exit;
    }
 
    $sql = " INSERT INTO member
                SET mb_id = '$mb_id',
                     mb_password = '$mb_password',
                     mb_name = '$mb_name',
                     mb_email = '$mb_email',
                     mb_gender = '$mb_gender',
                     mb_job = '$mb_job',
                     mb_ip = '$mb_ip',
                     mb_language = '$mb_language',
                     mb_datetime = '$mb_datetime' ";
    $result = mysqli_query($conn$sql);
 
else if ($mode == "modify") { // 회원 수정 상태
 
    $sql = " UPDATE member
                SET mb_password = '$mb_password',
                     mb_email = '$mb_email',
                     mb_gender = '$mb_gender',
                     mb_job = '$mb_job',
                     mb_language = '$mb_language',
                     mb_modify_datetime = '$mb_modify_datetime'
             WHERE mb_id = '$mb_id' ";
    $result = mysqli_query($conn$sql);
}
 
if ($result) {
    
    if($mode == "insert") { // 신규 가입의 경우 무조건 메일 인증확인 메일 발송
        include_once('./function.php'); // 메일 전송을 위한 파일을 인클루드합니다.
 
        $mb_md5 = md5(pack('V*'rand(), rand(), rand(), rand())); // 어떠한 회원정보도 포함되지 않은 일회용 난수를 생성하여 인증에 사용
 
        $sql = " UPDATE member SET mb_email_certify2 = '$mb_md5' WHERE mb_id = '$mb_id' "// 회원가입을 시도하는 아이디에 메일 인증을 위한 일회용 난수를 업데이트
        $result = mysqli_query($conn$sql);
        mysqli_close($conn); // 데이터베이스 접속 종료
 
        $certify_href = 'http://localhost/test/email_certify.php?&amp;mb_id='.$mb_id.'&amp;mb_md5='.$mb_md5// 메일 인증 주소
 
        $subject = '인증확인 메일입니다.'// 메일 제목
 
        ob_start();
        include_once ('./register_update_mail.php');
        $content = ob_get_contents(); // 메일 내용
        ob_end_clean();
 
        $mail_from = "gnuwiz@naver.com"// 보내는 이메일 주소
        $mail_to = $mb_email// 받을 이메일 주소
 
        mailer('관리자'$mail_from$mail_to$subject$content); // 메일 전송
    }
 
    echo "<script>alert('".$title."이 완료 되었습니다.\\n신규가입의 경우 메일인증을 받으셔야 로그인 가능합니다.');</script>";
    echo "<script>location.replace('./login.php');</script>";
    exit;
else {
    echo "생성 실패: " . mysqli_error($conn);
    mysqli_close($conn); // 데이터베이스 접속 종료
}
?>
cs


주석이 워낙 잘되어있어서 이해하는데에 큰 어려움은 없었다.

모드가 안넘어 왔다면 종료, 모드가 있다면 그에따라 실행된다.

회원가입을 한 것이라면 post로 넘어온 아이디를 앞뒤 공백을 없애주고 ( trim 함수 ) 가져오고, 회원 수정이라면 세션에서 아이디를 가져온다.

가져온 값들이 ( 아이디, 비밀번호 등등 ) 정상적으로 넘어왔다면 모드에따라 insert또는 update 해준다.

그리고 나서 인증 메일을 보내는데 한번만 사용할 파일 이기때문에 include_once('./function.php'); 와 같이 include_once라고 해놓은 것 같다.

( 테스트를 위해 네이버메일에서 설정에 POP3/SMTP를 허용 해주어야한다. )


난수를 하나 만들어 url에 추가해 메일로 전송된다.

만들어진 url은 데이터베이스에 저장되어 이후 비교하여 인증하는 방법같다.

날라온 메일에 첨부된 url을 클릭하면 email_certify.php로 넘어와 확인하게 된다.


< email_certify.php >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
include("./dbconn.php");  // DB연결을 위한 같은 경로의 dbconn.php를 인클루드합니다.
 
$mb_id                = trim($_GET['mb_id']); // 회원 아이디
$mb_md5                = trim($_GET['mb_md5']); // 인증메일에서 넘어온 인증번호
$mb_email_certify    = date('Y-m-d H:i:s'time()); // 인증일
 
$sql = " SELECT mb_id, mb_email_certify2 FROM member WHERE mb_id = '$mb_id' ";
$result = mysqli_query($conn$sql);
$mb = mysqli_fetch_assoc($result);
 
if (!$mb['mb_id']) {
    echo "<script>alert('존재하는 회원이 아닙니다.');</script>";
    echo "<script>location.replace('/login.php');</script>";
    exit;
}
 
$sql = " UPDATE member set mb_email_certify2 = '' WHERE mb_id = '$mb_id' "// 인증 링크는 한번만 처리가 되게 한다.
$result = mysqli_query($conn$sql);
 
if ($mb_md5)
{
    if ($mb_md5 == $mb['mb_email_certify2'])
    {
        $sql = " UPDATE member set mb_email_certify = '$mb_email_certify' WHERE mb_id = '$mb_id' ";
        $result = mysqli_query($conn$sql);
        echo "<script>alert('메일인증 처리를 완료 하였습니다.\\n\\n지금부터 ".$mb_id." 아이디로 로그인 가능합니다.');</script>";
    }
    else
    {
        echo "<script>alert('메일인증 요청 정보가 올바르지 않습니다.');</script>";
    }
}
 
mysqli_close($conn); // 데이터베이스 접속 종료
echo "<script>location.replace('./login.php');</script>";
exit;
?>
cs