본문 바로가기

[게시판] 회원가입

1. 회원가입 폼: signUp_form.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
<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="utf-8" />
        <title> Sign up </title>
    </head>
 
    <body>
        </br>
        <div align="center" name="signUp">
            <form method="POST" action="./signUp.php">
                <table align="center" >
                    <tr>
                        <td align="left"> ID (4~14) </td>
                        <td align="center">  
                            <input type="text" name="id"/>  
                        </td>
                    </tr>
                    <tr
                        <td align="left"> Password (8~16) </td>
                        <td align="center"
                            <input type="password" name="password"/>  
                        </td>
                    </tr>
                    <tr
                        <td align="left"> Password confirm </td
                        <td align="center">
                            <input type="password" name="password_confirm"/>  
                        </td>
                    </tr>    
                    <tr
                        <td> Name(K: 2~8, E: 2~16) </td
                        <td>
                            <input type="text" name="name"/
                        </td>
                    </tr>
                    <tr>
                        <td align="right" colspan="2">
                            <input type="submit" value="회원가입" />
                        </td>
                    </tr>
                </table>
            </form>
        </div>
    </body>
</html>
cs

 

 

11행: 회원가입 정보 역시 로그인과 마찬가지로 URL에 노출되어선 안 되고,

  서버의 데이터베이스에 추가되는 내용이므로 POST 방식으로 전송한다.

 

28행: 이름이 너무 길다. name="pw_confirm" 정도로 할 걸 그랬다.

 

 

 

2. 회원가입: signUp.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
<?php
    include "./connectDB.php";
 
    $conn = connectDB();
 
    /* 입력받은 ID, 비밀번호, 성별, 이메일을 읽어옴 */
    $inputID = $_POST["id"];
    $inputPW = $_POST["password"];
    $confirmPW = $_POST["password_confirm"];
    $inputName = $_POST["name"];
    $pattern = "/[^a-z0-9_]+$/i";
    $namePattern = "/[^가-힣a-z]+$/";
 
    if($inputID === "" || $inputPW === "" || $confirmPW === "" || $inputName === "") {
?>
        <script>
            alert("입력란을 모두 채워주세요.");
            history.back();
        </script>
<?php
    } else if(preg_match($pattern$inputID|| preg_match($pattern$inputPW|| preg_match($pattern$confirmPW)) ) { 
?>
        <script>
            alert("ID와 비밀번호에는 알파벳과 숫자, 언더바만 쓸 수 있습니다.");
            history.back();
        </script>
<?php     
    } else if(preg_match($namePattern$inputName)) {
?>    
        <script>
            alert("이름에는 한글 또는 알파벳만 쓸 수 있읍니다.");
            history.back();
        </script>
<?php    
    } else {
        if($inputPW != $confirmPW) {
?>
            <script>
                alert("비밀번호가 일치하지 않습니다.");
                history.back();    
            </script>
<?php
        } else {
            /* ID가 일치하는 회원정보 선택 */
            $query = "SELECT * FROM user WHERE id=\"$inputID\"";
            $result = mysqli_query($conn$query);
            $rowsNum = mysqli_num_rows($result);    
        
            if($rowsNum > 0) { //ID 중복
?>                <script>
                    alert("이미 존재하는 ID입니다.");
                    history.back();
                </script>
<?php 
            } else {
                /* 새로운 회원 정보 삽입 */
                $pwHash = sha1($inputPW);
                $query = "INSERT INTO user (name, id, password) VALUES (\"$inputName\", \"$inputID\", \"$pwHash\")";
                $result = mysqli_query($conn$query);    
 
                if($result) { 
?>
                    <script>
                        alert("회원가입 완료");
                        document.location.href="./login_form.php";
                    </script>
<?php
                } else {
?>
                    <script>
                        alert("회원가입 실패");
                        document.location.href="./signUp_form.php";
                    </script>    
<?php
                }
            }
        }
    }
?>
 
 
cs

 

 

5행: $conn의 값을 검사해서 0이면 초기 페이지로 돌아가게 하는 게 나을 것 같다.

 

11행: 알파벳, 숫자, 언더바가 아닌 글자로 한 글자 이상

12행: 한글이나 알파벳이 아닌 문자로 한 글자 이상

 

14행: PHP의 == 연산자는 형을 일치시켜 비교한다. 따라서 정확한 비교를 위해

  === 연산자를 사용했다. 사실 문자열이라 strcmp 함수를 쓰는 게 더 나았을 텐데, 

  왜 이렇게 했는 지 모르겠다.

 

21행: preg_match 함수는 첫 번째 인자로 받은 정규표현식과 

  두 번째 인자로 받은 문자열이 일치하는 지 검사한다.

 

36행: 마찬가지로 strcmp 함수를 쓰는 게 더 좋을 것 같다.

 

57행: 입력받은 패스워드를 DB에 저장할 때는 sha1 해시 값으로 저장한다. 

  이는 DB가 해킹당해도 해커가 패스워드는 알 수 없게 하기 위함이다.

 

65행: 회원가입 성공 시 로그인 페이지로 이동하고

72행: 회원가입 실패 시 회원가입 폼 페이지로 이동한다.