2주차 과제로 DB 연동을 진행하였다. 기존에 만들어 놓은 로그인 페이지와 회원가입 페이지를 약간 수정하였고, 아무런 값을 입력하지 않았을 때, 로그인이 되어 있으면 index 페이지로, 그렇지 않으면 로그인 페이지로 넘어가도록 기능을 구현하였다. 로그인 여부는 GET 방식으로 판별하도록 하였다.
1. 회원가입 페이지 DB 연동

register_page.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="login_css/login.css">
<title>Register</title>
</head>
<body>
<form method="post" action="register_proc.php">
<h2>회원가입</h2>
<?php if (isset($_GET['error'])) { ?>
<?php echo $_GET['error'] ?>
<?php } ?>
<label>아이디</label>
<input id="box" type="text" name="id" placeholder="ID" />
<label>닉네임</label>
<input id="box" type="text" name="nick" placeholder="Nickname">
<label>비밀번호</label>
<input id="box" type="password" name="pass" placeholder="Password" />
<label>비밀번호 확인</label>
<input id="box" type="password" name="password" placeholder="PasswordCheck" />
<label>이메일</label>
<input id="box" type="text" name="email" placeholder="Email">
<label class="login_button"><button type="submit">회원가입완료</button></label>
</form>
</body>
</html>
회원가입 페이지는 기존에 아이디와 비밀번호만 받았었는데, 이 후 과제에서 구현할 마이페이지에 기능을 조금이라도 추가하기 위해 닉네임과 이메일까지 받았다. 모든 정보를 입력하고 회원가입완료 button을 누르면 register_proc.php로 정보가 POST 방식으로 전송되도록 구현하였다.
그리고 중간에 php 코드를 하나 삽입하였는데, register_proc.php에서 오류가 발생하면 register_page.php 페이지로 넘어와 오류를 출력하도록 만들었다. 그리고 이 php 코드와 관련된 자세한 오류 출력 메세지는 register_proc.php 파일에서 다루려고 한다.
register_proc.php
<?php
$register_ID = $_POST['id'];
$register_Nickname = $_POST['nick'];
$register_Password = $_POST['pass'];
$register_PasswordCheck = $_POST['password'];
$register_Email = $_POST['email'];
// DB 연결
define('DB_HOST','localhost');
define('DB_USER','admin');
define('DB_PASS','student1234');
define('DB_NAME','login');
$db_conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
mysqli_set_charset($db_conn, 'utf8');
/*
if ($db_conn) {
echo 'connect';
} else {
echo 'false';
}
*/
// 오류 확인
if ($register_Password != $register_PasswordCheck) {
header("location:register_page.php?error=비밀번호를 확인하세요");
exit();
}
$check_id = "SELECT * FROM users WHERE id = '$register_ID'";
$result_id = mysqli_query($db_conn, $check_id);
if (mysqli_num_rows($result_id) > 0) {
header("location:register_page.php?error=중복된 아이디입니다");
exit();
}
$check_nick = "SELECT * FROM users WHERE nick = '$register_Nickname'";
$result_nick = mysqli_query($db_conn, $check_nick);
if (mysqli_num_rows($result_nick) > 0) {
header("location:register_page.php?error=중복된 닉네임입니다");
exit();
}
$check_email = "SELECT * FROM users WHERE email = '$register_Email'";
$result_email = mysqli_query($db_conn, $check_email);
if(mysqli_num_rows($result_email) > 0) {
header("location: register_page.php?error=중복된 이메일입니다");
exit();
}
//DB 입력
$query = "INSERT INTO users VALUES ('$register_ID', '$register_Password', '$register_Nickname','$register_Email')";
mysqli_query( $db_conn, $query);
header("location:login_page.php?success=회원가입이 완료되었습니다");
exit();
?>
register_page.php에서 POST 방식으로 입력받은 모든 input 값을 맨 위에서 변수지정 해주었다.
그리고 DB를 연결하는 과정을 거쳤고, php 파일에서 DB로 데이터를 전송할 때, 글자가 깨지지 않도록 utf-8 설정을 이어서 해주었다.
이후에 sql 구문으로 login DB의 users 테이블에서 각각 아이디, 닉네임, 이메일을 뽑아서 만약에 중복이 존재한다면 register_page.php 페이지로 돌아가서 에러메세지를 출력하도록 하였다.

만약에 3개의 input값 모두 중복이 발생하지 않았다면, 회원가입 성공 메세지와 함께 login_page.php 페이지로 넘어가도록 작성하였다.

2. 로그인 페이지
login_page.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="login_css/login.css">
<title>Login</title>
</head>
<body>
<form method="post" action="login_proc.php">
<h2>Login</h2>
<?php if (isset($_GET['error'])){ ?>
<p class="error"><?php echo $_GET['error'] ?></p>
<?php } ?>
<?php if (isset($_GET['success'])){ ?>
<p class="success"><?php echo $_GET['success'] ?></p>
<?php } ?>
<label>아이디</label>
<input id="box" type="text" name="id" placeholder="ID" />
<label>비밀번호</label>
<input id="box" type="password" name="pass" placeholder="Password" />
<label class="login_button"><button type="submit">로그인</button></label>
<a href="register_page.php" class="register">회원가입</a>
</form>
</body>
</html>
로그인 페이지는 이전 코드와 거의 유사하고 오류 메세지와 성공 메세지를 출력하는 php 코드만 따로 추가하였다.
login_proc.php
<?php
$userID = $_POST['id'];
$userPass = $_POST['pass'];
define('DB_HOST','localhost');
define('DB_USER','admin');
define('DB_PASS','student1234');
define('DB_NAME','login');
$db_conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if (empty($userID))
{
header("location:login_page.php?error=아이디를 입력하세요");
exit();
}
else if (empty($userPass))
{
header("location:login_page.php?error=비밀번호를 입력하세요");
exit();
}
$query = "SELECT * FROM users WHERE id = '$userID' and pass = '$userPass'";
$result = mysqli_query($db_conn, $query);
$row = mysqli_fetch_array($result);
if (mysqli_num_rows($result) == 0)
{
header("location:login_page.php?error=아이디와 비밀번호를 확인해주세요");
exit();
}
else
{
header("location:index.php?id=" . $userID);
exit();
}
?>
login_proc.php 페이지에서는 회원 여부를 판별한다. 먼저 login_page.php 페이지에서 POST 방식으로 입력받은 id와 비밀번호를 각각 userID와 userPass에 저장하고, 회원가입 페이지와 같이 DB 연결을 진행하였다.
그리고 users 테이블에서 각각 userID와 userPass 값이 모두 일치하는 데이터를 모두 뽑아서 실행시킨 데이터 집합을 $result 변수에 저장하고 $row로 데이터 row 한 줄을 담았다.
그 다음 mysqli_num_rows 함수를 사용하여, 만약에 데이터가 있으면 1을 출력하고 없으면 0을 출력하여 로그인 가능 여부를 판별하도록 하였다. (mysqli_fetch_array 함수로 row를 받았으므로 한 줄이 출력 되며, 이전 회원가입 페이지에서 중복된 아이디를 받지 않았기 때문에 결과적으로 한줄이 출력된다.)
최종적으로 index.php 페이지로 이동할 때, 파라미터 id에 해당하는 값으로 $userID를 전송하도록 하였다.
3. index 페이지
index.php
<?php
if ($_GET['id'] == '') {
header("location:login_page.php");
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Homepage</title>
</head>
<body>
<p>Welcome to Our Page</p>
</body>
</html>
먼저 index페이지 앞쪽에 php 코드를 작성하여 이전 페이지에서 GET 방식으로 받은 값이 존재하면 index 페이지를 바로 보여주고, 그렇지 않으면 로그인 페이지로 돌아가도록 작성했다.
마이페이지는 추후에 작성할 예정..
<코드 피드백>
1. 2주차 과제 요구 조건으로 GET 방식으로 파라미터를 들고가서 로그인을 하도록 구현하였는데, index페이지에서 파라미터에 어느 값을 넣어도 index 페이지로 들어가지는 오류가 있다. -> POST 방식으로 숨길 필요가 있음
2. login DB의 users에 담겨있는 데이터가 많아지게 되면 트래픽이 증가하게 되는데, 회원 가입 페이지에서 아이디, 닉네임, 이메일 중복 여부를 확인하기 위해 3번이나 열람하는 방식으로 코드를 작성하였다. -> view를 사용하여 데이터 일부분을 따로 보거나, 중복 확인을 일부 삭제해야함
3. 코드가 길어지는 문제 -> 함수를 사용하여 중복 코드를 최소화
'모의해킹 스터디 > Week2' 카테고리의 다른 글
| PHP로 DB에 데이터 저장 / 출력 (미니 과제) (0) | 2024.04.28 |
|---|---|
| PHP로 DB에서 데이터 불러오기 (1) | 2024.04.28 |
| DB 실습 (0) | 2024.04.26 |
| Docker를 이용하여 포트를 열고 phpMyAdmin 홈페이지 접속 (0) | 2024.04.26 |
| DB와 DBMS의 정의 (3) | 2024.04.26 |