※ 보안적 요소는 거의 고려하지 않고 php명령어 숙달용으로 혼자서 만드는 로그인 페이지 입니다.
▶로그인 페이지를 위해 만들어야 할 파일 (※이번 시간에 만들파일은 굵은 글씨로 표기)
dbconn.php : 데이터베이스 연결파일
index.php : 로그인 메인화면
login_check.php : 로그인 처리 페이지
logout.php : 로그아웃 처리 페이지
register.php : 회원가입 페이지
register-update.php : 회원가입 처리 페이지
style.css : 스타일 시트 파일
▶회원가입 페이지 (회원수정 페이지도 통합)
회원가입 페이지는 INSERT INTO 문을 이용해서 처리하면 되기 때문에 처리는 간단하다. 그러나 조금만 생각해보면, 회원가입 기능과 더불어 회원정보를 수정할 페이지 역시 필요할 수도 있음을 생각할 수가 있다. 이렇게 페이지가 많아지는건 비경제적이므로, 한 페이지에서 회원가입과 회원정보수정을 동시에 처리하게끔 만들 생각을 할 수도 있다. 그럼 이런 기능을 어떻게 처리할 것인지 생각을 해보자.
우리가 일전에 만들었던 페이지에는 세션정보가 있다. 이를 적극적으로 활용할 생각을 해보자. 회원가입 창에서 세션정보가 있다면, 세션정보로 저장해놓은 ID를 ID칸에 출력하게끔 만들어서 회원정보를 수정하게끔 만들어준다면 쉽게 해결된다. 일단 기본적인 회원가입란의 양식을 떠올려보자.
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
|
<!--회원가입 처리페이지(register_update.php)로 데이터전송-->
<form action="./register_update.php" method="post">
<!--아이디 입력란-->
<h1>아이디</h1>
<input type = "text"
id="jj_id"
name="jj_id">
<!--비밀번호 입력란-->
<h1>비밀번호</h1>
<input type = "password"
id="jj_password"
name="jj_password">
<!--비밀번호 확인-->
<h1>비밀번호 확인</h1>
<input type = "password"
id="jj_password_re"
name="jj_password_re">
<!--이름 입력란-->
<h1>이름</h1>
<input type = "text"
id="jj_name"
name="jj_name">
<!--주소 입력란-->
<h1>주소</h1>
<input type = "text"
id="jj_address"
name="jj_address">
<!-- 제출버튼 -->
<button type="submit" ></button>
|
cs |
CSS나 다른 요소들을 제쳐두고 우선 이런 형식으로 구성할 수 있다. 이렇게 구성한 파일은 다음과 같이 구성된다.
기본 틀을 이렇게 구성해두고 뭘 추가할지 생각한다. CSS는 마지막에 추가할 예정이므로 우선은 패스한다.
회원수정은 로그인이 되었을 때, 회원가입은 로그인이 되지않았을 때 처리하는 페이지로 생각한다면, 세션유무에 따라(우리가 로그인 시에 아이디로 세션값을 부여하기로 설정했기 때문에) 회원가입과 회원정보수정으로 나뉘어져서 처리하게 만들면 된다. 즉, 앞부분에는 php로 세션정보에 따라 다른기능을 부여하면된다.
또한, 회원가입이 완료되었을 때는 로그인화면으로 리다이렉션, 회원정보수정이 완료됐을 때는 로그인 후 화면으로 리다이렉션 되게끔 해준다.
우리가 만들 회원가입란과 회원정보수정란을 정리하자면 다음과 같다.
기능 | 회원가입 | 회원정보수정 |
세션유무 | 세션이 없을 때 | 세션이 있을 때 |
완료 후 리다이렉션 페이지 | 메인 페이지 | 로그인 후 페이지 |
id칸 입력내용 | X | 로그인한 아이디(세션으로 불러오기) |
세션유무에 따라 서로 다른 처리를 하게끔 변수를 다음과 같이 부여해준다.
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
|
<?php
//db연결
include("./dbconn.php");
//SESSION값이 있을 때,
if(isset($_SESSION['ss_jj_id'])) {
//아이디값 불러오기
$jj_id = $_SESSION['ss_jj_id'];
$sql = " SELECT * FROM member WHERE jj_id = '$jj_id'";
$jj = mysqli_fetch_array($result);
mysqli_close($conn);
//SESSION값 있을 때 변수 부여
$mode = "modify";
$title = "회원수정";
$href = "./address_list.php";
//SESSION값이 없을 때 변수 부여
} else {
$mode = "insert";
$title = "회원가입";
$href = "./index1.php";
}
?>
|
cs |
그리고 세션이 있으면 id란에 로그인 중인 아이디를 출력하게끔 한다. (회원정보수정 상태이므로)
즉, 아이디의 input란 안에 value="<?php echo $jj['jj_id'] ?? $jj_id ?>"> (??기호는 isset 기호와 거의 같다. 앞의 값이 있으면 뒤의 값을 출력한다.) 를 입력해서 로그인 중인 아이디를 출력하게끔 한다. 그리고 나서 로그인하고 ID에 값을 출력하는지 확인해본다면,
로그인했었던 값이 출력되는 것을 확인할 수 있다. 그런데, 아이디 값을 수정할 수도 있다고 오해를 유발할 수 있으므로, 아디값은 readonly로 수정못하게 설정해준다. 따라서, 위에서 설정한 php값에서 SESSION값마다 변수를 설정하는 곳에서 하나를 추가한다.
...
$mode = "modify";
$title = "회원수정";
$modify_jj_info = "readonly";
$href = "./address_list.php";
...
$mode = "insert";
$title = "회원가입";
$modify_jj_info = '';
$href = "./index1.php";
...
그리고 아이디 값 옆에다가 변수를 추가하면, value="<?php echo $jj['jj_id'] ?? $jj_id ?>" <?php echo $modify_jj_info ?>> 로 아이디의 input값에 추가를 한다. 그럼 현재까지의 로그인 페이지 프로세스는 다음과 같다.
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
|
register.php
<?php
//db연결
include("./dbconn.php");
//SESSION값이 있을 때,
if(isset($_SESSION['ss_jj_id'])) {
//아이디값 불러오기
$jj_id = $_SESSION['ss_jj_id'];
$sql = " SELECT * FROM member WHERE jj_id = '$jj_id'";
$jj = mysqli_fetch_array($result);
mysqli_close($conn);
//SESSION값 있을 때 변수 부여
$mode = "modify";
$title = "회원수정";
$modify_jj_info = "readonly";
$href = "./address_list.php";
//SESSION값이 없을 때 변수 부여
} else {
$mode = "insert";
$title = "회원가입";
$modify_jj_info = '';
$href = "./index1.php";
}
?>
<html>
<head>
<meta charset="utf-8">
<title>login</title>
</head>
<body>
<!--회원가입 처리페이지(register_update.php)로 데이터전송-->
<form action="./register_update.php" method="post">
<input type="hidden" name="mode" value="<?php echo $mode ?>">
<!--아이디 입력란-->
<h1>아이디</h1>
<input type = "text"
id="jj_id"
name="jj_id"
value="<?php echo $jj['jj_id'] ?? $jj_id ?>" <?php echo $modify_jj_info ?>">
<!--비밀번호 입력란-->
<h1>비밀번호</h1>
<input type = "password"
id="jj_password"
name="jj_password">
<!--비밀번호 확인-->
<h1>비밀번호 확인</h1>
<input type = "password"
id="jj_password_re"
name="jj_password_re">
<!--이름 입력란-->
<h1>이름</h1>
<input type = "text"
id="jj_name"
name="jj_name">
<!--주소 입력란-->
<h1>주소</h1>
<input type = "text"
id="jj_address"
name="jj_address">
<br>
<p><input type = "submit"></p>
</body>
</html>
|
cs |
내가 로그인했던 'admin' 이라는 아이디가 뜨고 수정을 할 수 없게 락이 걸려버린 상태다. 만약 세션을 없애고 다시 들어가게 된다면?
처음 만들었었던 화면 그대로 출력이 된다. 물론 id도 입력이 된다. 이로써 로그인 페이지에 필요한 건 거의 갖춘것 같으니, 다음 단계로 넘어가자.
▶회원가입 처리 페이지 (회원정보수정 처리도 통합)
회원가입 처리 페이지도 역시 두가지 경우를 다 생각해야 한다. 회원가입 처리와 회원정보수정. 각각 어떤 정보를 어떻게 처리해야 하는지 정리하면 다음과 같다.
기능 | 회원가입 처리 | 회원정보수정 처리 |
받는 데이터 형식 | POST형식(회원가입 페이지에서 전송) | SESSION(로그인 페이지에서 부여), POST형식(회원정보수정 페이지에서 전송) |
쿼리문의 형식 | INSERT INTO ~ SET (혹은 INSERT INTO ~ VALUES ~) |
UPDATE ~ SET ~ WHERE |
if문을 써도 상관없지만, 내가 위에서 $mode라 설정한 변수는 switch 함수를 쓰기 위해서 설정했다. switch 함수는
1
2
3
4
5
6
7
8
9
|
switch ($mode) {
case '~' : ~
case '~' : ~
default : ~
}
|
cs |
이런 양식으로 설정할 수 있다. switch함수를 이용해서 각각의 변수를 받게 되면,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
include("./dbconn.php");
$mode = $_POST['mode'];
switch ($mode) {
case 'insert' :
$jj_id = trim($_POST['jj_id']);
break;
case 'modify' :
$jj_id = trim($_SESSION['ss_jj_id']);
break;
default :
echo "<script>alert('잘못된 접근입니다. 관리자에게 문의하세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
break;
}
|
cs |
이런 식으로 세션과 변수를 받을 수 있다. 다음은 아이디 입력하는 란부터 주소입력란까지 빈칸이 있거나, 비밀번호 확인을 했을 때, 다른 값이 입력됐다면 오류를 뜨게 만든다.
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
|
...
if (!$_POST['jj_id']) {
echo "<script>alert('아이디를 확인해주세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
if (!$_POST['jj_password']) {
echo "<script>alert('비밀번호를 확인해주세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
if ($_POST['jj_password'] != $_POST['jj_password_re']) {
echo "<script>alert('비밀번호가 일치하지 않습니다. 확인해주세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
if (!$_POST['jj_name']) {
echo "<script>alert('이름을 확인해주세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
if (!$_POST['jj_address']) {
echo "<script>alert('주소 확인해주세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
....
|
cs |
빈칸이 있을 수도 있으니, 로그인 할 때와 마찬가지로 trim함수를 이용해서 빈칸을 잘라준다.
1
2
3
4
5
6
7
8
9
|
....
$jj_password = trim($_POST['jj_password']);
$jj_password_re = trim($_POST['jj_password_re']);
$jj_name = trim($_POST['jj_name']);
$jj_address = trim($_POST['jj_address']);
$jj_datetime = date('Y-m-d H:i:s',time());
.....
|
cs |
이제 회원가입일 경우에 데이터를 데이터베이스에 입력하는 과정을 거치게 되는데, if문을 통해 설정할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
if($mode == "insert") {
//id값 조회
$sql = " SELECT * FROM member WHERE jj_id = '$jj_id' ";
$result = mysqli_query($conn, $sql);
//조회가 되면 'num_rows'는 1행 이상 출력하므로 0보다 클 때 중복확인
if (mysqli_num_rows($result) > 0) {
echo "<script>alert('사용중인 아이디입니다.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
// 중복확인을 거쳤다면 각 변수를 데이터베이스에 입력
$sql = " INSERT INTO member
SET jj_id = '$jj_id',
jj_password = '$jj_password',
jj_name = '$jj_name',
jj_address = '$jj_address',
jj_datetime = '$jj_datetime' ";
$result = mysqli_query($conn,$sql);
|
cs |
그 다음으로는 회원정보수정일 때, UPDATE 쿼리문으로 회원의 데이터를 수정하게끔 한다.
1
2
3
4
5
6
7
8
9
|
} else if ($mode == "modify") {
$sql = " UPDATE member
SET jj_password = '$jj_password',
jj_name = '$jj_name'
jj_address = '$jj_address'
WHERE jj_id = '$jj_id' ";
$result = mysqli_query($conn, $sql);
}
|
cs |
그리고 과정이 수행되었다면 완료되었다고 메시지를 출력하게끔 한다.
1
2
3
4
5
6
7
8
|
if ($result) {
echo "<script>alert(' 완료되었습니다.');</script>";
echo "<script>location.replace('./address_list.php');</script>";
exit;
} else {
echo "오류가 생겼습니다. 다시 시도해주세요." . mysqli_error($conn);
mysqli_close($conn);
}
|
cs |
회원가입, 회원정보수정 프로세스의 전체 코드는 다음과 같다.
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
|
register_update.php
<?php
include("./dbconn.php");
$mode = $_POST['mode'];
switch ($mode) {
case 'insert' :
$jj_id = trim($_POST['jj_id']);
break;
case 'modify' :
$jj_id = trim($_SESSION['ss_jj_id']);
break;
default :
echo "<script>alert('잘못된 접근입니다. 관리자에게 문의하세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
break;
}
if (!$_POST['jj_id']) {
echo "<script>alert('아이디를 확인해주세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
if (!$_POST['jj_password']) {
echo "<script>alert('비밀번호를 확인해주세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
if ($_POST['jj_password'] != $_POST['jj_password_re']) {
echo "<script>alert('비밀번호가 일치하지 않습니다. 확인해주세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
if (!$_POST['jj_name']) {
echo "<script>alert('이름을 확인해주세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
if (!$_POST['jj_address']) {
echo "<script>alert('주소 확인해주세요.');</script>";
echo "<script>location.replace('./register.php');</script>";
exit;
}
$jj_password = trim($_POST['jj_password']);
$jj_password_re = trim($_POST['jj_password_re']);
$jj_name = trim($_POST['jj_name']);
$jj_address = trim($_POST['jj_address']);
$jj_datetime = date('Y-m-d H:i:s',time());
if($mode == "insert") {
$sql = " SELECT * FROM member WHERE jj_id = '$jj_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 jj_id = '$jj_id',
jj_password = '$jj_password',
jj_name = '$jj_name',
jj_address = '$jj_address',
jj_datetime = '$jj_datetime' ";
$result = mysqli_query($conn,$sql);
} else if ($mode == "modify") {
$sql = " UPDATE member
SET jj_password = '$jj_password',
jj_name = '$jj_name'
jj_address = '$jj_address'
WHERE jj_id = '$jj_id' ";
$result = mysqli_query($conn, $sql);
}
if ($result) {
echo "<script>alert('완료되었습니다.');</script>";
echo "<script>location.replace('./address_list.php');</script>";
exit;
} else {
echo "오류가 생겼습니다. 다시 시도해주세요." . mysqli_error($conn);
mysqli_close($conn);
}
|
cs |
이제 CSS적용만 하면 로그인 페이지 만드는 단계는 끝이다.
'Project > project 1 - JH community' 카테고리의 다른 글
[php] 로그인 페이지 만들기 - 4 (完) (0) | 2022.11.02 |
---|---|
[MySQL] 우체국 주소db 저장하기 (0) | 2022.11.02 |
[php] 로그인 페이지 만들기 - 2 (0) | 2022.10.28 |
[php] 로그인 페이지 케이스별 생성 (0) | 2022.10.24 |
[php]로그인 페이지 만들기 - 1.5(피드백) (0) | 2022.10.19 |
댓글