“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”
- Frederick Philips Brooks
Mythical Man-Month 저자
PHP 회원가입, 로그인 페이지 만들기
PHP
-
서버 측에서 동작하는 스크립트 언어로, 웹 개발에 널리 사용되는 프로그래밍 언어입니다.
PHP는 PHP:HyperText Preprocessor의 약자로 초기에는 Personal Home Page의 약자였습니다.
PHP 는 HTML 과 같이 웹 페이지를 동적으로 생성하는데 사용되며, 웹 서버에서 PHP 스크립트를 실행해 동적인 웹 콘텐츠를 생성하고 처리할 수 있습니다.
PHP를 사용해 회원가입 페이지와
로그인 페이지를 만들어봤는데요
정리를 해보겠습니다.
PHP에서 MySQL 데이터베이스에 접속
<?php
// phpinfo()
$host = "localhost";
$user = "root";
$pw = "root";
$db = "phpClass";
$connect = new mysqli($host, $user, $pw, $db);
$connect -> set_charset("utf-8");
if(mysqli_connect_errno()){
echo "Database Connect false";
} else {
// echo "Database Connect True";
}
?>
PHP에서 MySQL 데이터베이스에 접속
우선 PHP에서 MySQL 데이터베이스에 접속하는 코드로 연결해줍니다.
$를 사용해 데이터베이스 접속에 필요한 변두르을 선언하고 초기값을 설정합니다.
$host는 데이터베이스 서버의 호스트 주소
$user는 데이터베이스 사용자 이름
$pw는 데이터베이스 사용자 비밀번호
$db는 접속할 데이터베이스 이름
$connect mysqli클래스의 인스턴스를 생성해 데이터베이스에 접속
각 변수들을 사용해 데이터베이스에 접속 정보를 전달합니다.
회원가입 페이지
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원가입 페이지</title>
<?php include "../include/head.php" ?>
</head>
<body class="gray">
<?php include "../include/skip.php" ?>
<!-- //skip -->
<?php include "../include/header.php" ?>
<!-- //header -->
<main id="main" class="container">
<div class="intro__inner center bmStyle">
<picture class="intro__images">
<source srcset="../assets/img/join01.png, ../assets/img/join01@2x.png 2x, ../assets/img/join01@3x.png 3x"/>
<img src="../assets/img/join01.png" alt="소개이미지">
</picture>
<p class="intro__text">
회원가입을 해주세요!
</p>
</div>
<!-- //intro__inner -->
<div calss="join__inner container">
<h2>회원가입</h2>
<div class="join__form">
<form action="joinSave.php" name="join" method="post">
<fieldset>
<legend class="blind">회원가입 영역</legend>
<div>
<label for="youEmail" class="required ">이메일</label>
<input type="emlil" id="youEmail" name="youEmail" class="inputStyle" placeholder="이메일을 적어주세요!" required>
</div>
<div>
<label for="youName" class="required">이름</label>
<input type="text" id="youName" name="youName" class="inputStyle" placeholder="이름을 적어주세요!" required>
</div>
<div>
<label for="youPass" class="required">비밀번호</label>
<input type="password" id="youPass" name="youPass" class="inputStyle" placeholder="비밀번호를 적어주세요!" required>
</div>
<div>
<label for="youPassC" class="required">비밀번호 확인</label>
<input type="password" id="youPassC" name="youPassC" class="inputStyle" placeholder="비밀번호를 다시한번 적어주세요!" required>
</div>
<div>
<label for="youPhone" class="required">연락처</label>
<input type="text" id="youPhone" name="youPhone" class="inputStyle" placeholder="연락처를 적어주세요!" required>
</div>
<button type="submit" class="btnStyle">회원가입 완료</button>
</fieldset>
</form>
</div>
</div>
</main>
<!-- //main -->
</body>
</html>
<?php include "../include/head.php"?> 이 코드는 PHP의 include문을 사용해 "../include/head.php" 파일을 현재 위치에 포함시키는 부분으로, 공통적인 헤더 부분을 재사용할 수 있도록 도와줍니다.
skip과 header부분도 같습니다.
회원가입 완료 페이지
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원가입 완료 페이지</title>
</head>
<?php include "../include/head.php" ?>
</head>
<body class="gray">
<?php include "../include/skip.php" ?>
<!-- //skip -->
<?php include "../include/header.php" ?>
<!-- //header -->
<main id="main" class="container">
<div class="intro__inner center bmStyle">
<picture class="intro__images">
<source srcset="../assets/img/joinEnd01.png, ../assets/img/joinEnd01@2x.png 2x, ../assets/img/joinEnd01@3x.png 3x"/>
<img src="../assets/img/joinEnd01.png" alt="소개이미지">
</picture>
<p class="intro__text">
<!-- 회원가입을 축하드립니다. <br> 로그인을 해주세요! -->
<?php
include "../connect/connect.php";
$youEmail = $_POST["youEmail"];
$youName = $_POST["youName"];
$youPass = $_POST["youPass"];
$youPassC = $_POST["youPassC"];
$youPhone = $_POST["youPhone"];
$regTime = time();
// echo $youEmail, $youName, $youPass, $youPhone;
// $sql = "INSERT INTO members(youEmail, youName, youPass, youPhone, regTime) VALUES('$youEmail', '$youName', '$youPass', '$youPhone', '$regTime')";
// $connect -> query($sql);
//메세지 출력
function msg($alert){
echo "<p class='intro__text'>$alert</p>";
}
// 이메일 유효성 검사
$check_mail = preg_match("/^[a-z0-9_+.-]+@([a-z0-9-]+\.)+[a-z0-9]{2,4}$/", $youEmail);
if($check_mail == false){
msg ("이메일이 잘못되었습니다. 다시 한번 확인해주세요!");
exit;
}
//이름 유효성 검사
$check_name = preg_match("/^[가-힣]{9,15}$/",$youName);
if($check_name == false){
msg ("이름은 한글만 가능합니다. 또는 3~5글자만 가능합니다.");
exit;
}
// 비밀번호 유효성 검사
if($youPass !== $youPassC){
msg ("비밀번호가 일치하지 않습니다. 다시 한번 확인해주세요!");
exit;
}
// $youPass = sha1($youPass);
// 휴대폰번호 유효성 검사
$check_number = preg_match("/^(010|011|016|017|018|019)-[0-9]{3,4}-[0-9]{4}$/", $youPhone);
if($check_number == false){
msg ("번호가 정확하지 않습니다. 올바른 번호(000-0000-0000)을 작성해주세요.");
exit;
}
// 이메일 중복 검사
$isEmailCheck = false;
$sql = "SELECT youEmail FROM members WHERE youEmail = '$youEmail'";
$result = $connect -> query($sql);
if($result){
$count = $result -> num_rows;
if($count == 0){
$isEmailCheck = true;
} else {
msg ("이미 회원가입이 되어 있습니다. 로그인 해주세요!");
exit;
}
} else {
msg ("에러발생 1: 관리자에게 문의하세요!");
exit;
}
// 핸드폰 중복 검사
$isPhoneCheck = false;
$sql = "SELECT youPhone FROM members WHERE youPhone = '$youEmail'";
$result = $connect -> query($sql);
if($result){
$count = $result -> num_rows;
if($count == 0){
$isEmailCheck = true;
} else {
msg ("이미 회원가입이 되어 있습니다. 로그인 해주세요!");
exit;
}
} else {
msg ("에러발생 2: 관리자에게 문의하세요!");
exit;
}
//회원가입
if($isEmailCheck = true && $isEmailCheck = true){
//데이터 입력하기
$sql = "INSERT INTO members(youEmail, youName, youPass, youPhone, regTime) VALUES('$youEmail', '$youName', '$youPass', '$youPhone', '$regTime')";
$result = $connect -> query($sql);
if($result){
msg("회원가입을 축하합니다. 로그인해주세요! <br><div class='intro__btn'><a href='../login/login.php'>로그인</a></div>");
exit;
} else {
msg("에러발생 3: 관리자에게 문의하세요!");
exit;
}
} else {
msg("이미 회원가입이 되어 있습니다. 로그인 해주세요.");
exit;
}
// 사용자가 데이터 입력 --> 유효성 검사(O) --> 통과 --> 회원가입(쿼리문 전송)
// 사용자가 데이터 입력 --> 유효성 검사(X) --> 통과(이메일주소/ 핸드폰번호) --> 통과 --> 회원가입(쿼리문 전송)
// 사용자가 데이터 입력 --> 유효성 검사(X) --> 통과 --> 회원가입(쿼리문 전송)
?>
</p>
</div>
<!-- //intro__inner -->
</main>
<!-- //main -->
</body>
</html>
회원가입을 처리하는 웹 페이지 입니다.
유효성 검사는 이메일, 이름, 비밀번호, 휴대폰 번호 등 입력된 데이터의 유효성을 검사합니다
preg_match 함수를 사용해 정규식을 이용한 유효성 검사를 수행합니다.
유효성 검사에 실패한 경우 msg 함수를 호출해 오류 메시지를 출력하고 exit 함수를 호출해 스크립트의 실행을 중지합니다.
데이터 중복 검사는 이메일과 휴대폰 번호가 이미 다른 회원에 의해 사용 중인지 확인하기 위해 데이터베이스를 조회해 중복을 검사합니다. 중복된 데이터가 있으면 msg 함수를 호출해 오류 메세지를 출력하고 exit 함수를 호출해 스크립트의 실행을 중지합니다.
회원가입 처리는 유효성 검사와 중복 검사를 모두 통과한 경우, 데이터베이스에 회원 정보를 저장하고 회원가입을 축하하는 메시지를 출력합니다.
HTML 출력은 msg 함수를 호출해 출력된 메세지를 HTML로 출력하고 회원가입 성공 시 로그인 페이지로 이동하는 링크를 제공합니다.
로그인 페이지
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로그인 페이지</title>
<?php include "../include/head.php" ?>
</head>
<body class="gray">
<?php include "../include/skip.php" ?>
<!-- //skip -->
<?php include "../include/header.php" ?>
<!-- //header -->
<main id="main" class="container">
<div class="login__inner">
<h2>로그인</h2>
<p>로그인을 하시면 게시글 및 댓글 작성이 가능합니다.<br>회원가입을 하면 로그인이 가능합니다.<br>admin@admin.com/1234</p>
<div class="login__form btStyle bmStyle">
<form action="loginSave.php" name="loginSave" method="post">
<fieldset>
<legend class="blind">로그인 영역</legend>
<div>
<label for="youEmail" class="required"></label>
<input type="emlil" id="youEmail" name="youEmail" class="inputStyle" placeholder="이메일" required>
</div>
<div>
<label for="youPass" class="required"></label>
<input type="password" id="youPass" name="youPass" class="inputStyle" placeholder="비밀번호" required>
</div>
<button type="submit" class="btnStyle2 mt20">로그인</button>
</fieldset>
</form>
</div>
<div class="login__footer">
<ul class="listStyle2">
<li>회원가입을 하지 않았다면 회원가입을 먼저 해주세요. <a href="join.html">회원가입</a></li>
<li>아이디가 기억나지 않는다면 <a href="#">아이디 찾기</a></li>
<li>비밀번호가 기억나지 않는다면 <a href="#">비밀번호 찾기</a></li>
</ul>
</div>
</div>
</main>
<!-- //main -->
</body>
</html>
이메일과 비밀번호를 입력받는 페이지를 만들었습니다.
로그인 버튼을 통해 로그인 할 수 있고, 페이지의 액션은 loginSave.php로 설정되어 있어 이 데이터가 loginSave.php라는 PHP스크립트로 제출되어 처리됩니다.
로그인 완료 페이지
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로그인 완료 페이지</title>
</head>
<?php include "../include/head.php" ?>
</head>
<body class="gray">
<?php include "../include/skip.php" ?>
<!-- //skip -->
<?php include "../include/header.php" ?>
<!-- //header -->
<main id="main" class="container">
<div class="intro__inner center bmStyle">
<picture class="intro__images">
<source srcset="../assets/img/joinEnd01.png, ../assets/img/joinEnd01@2x.png 2x, ../assets/img/joinEnd01@3x.png 3x"/>
<img src="../assets/img/joinEnd01.png" alt="소개이미지">
</picture>
<?php
include "../connect/connect.php";
include "../connect/session.php";
$youEmail = $_POST ['youEmail'];
$youPass = $_POST ['youPass'];
//echo $youEamil, $youPass;
// 데이터 출력
function msg($alert){
echo "<p class='intro__text'>$alert</p>";
}
// 유효성검사
$sql = "SELECT memberID, youEmail, youPass, youName FROM members WHERE youEmail = '$youEmail' AND youPass = '$youPass'";
$result = $connect -> query($sql);
if($result){
$count = $result -> num_rows;
if($count == 0){
msg("이메일 또는 비밀번호가 틀렸습니다. 다시 한번 확인해주세요!<br><div class='intro__btn'><a href='../login/login.php'>로그인</a></div>");
}else{
//로그인 성공
$memberInfo = $result -> fetch_array(MYSQLI_ASSOC);
// echo "<pre>";
// var_dump($memberInfo);
// echo "</pre>";
//세션 생성
$_SESSION['memberID'] = $memberInfo['memberID'];
$_SESSION['youEmail'] = $memberInfo['youEmail'];
$_SESSION['youName'] = $memberInfo['youName'];
Header("Location: ../main/main.php");
}
}
?>
</div>
<!-- //intro__inner -->
</main>
<!-- //main -->
</body>
</html>
로그인 처리 페이지입니다.
로그인 데이터를 처리하여 사용자의 이메일과 비밀번호를 검증하고, 로그인이 성공한 경우 세션을 생성하고 메인 페이지로 이동하는 기능을 가지고 있습니다.
데이터를 처리하기 위해$_POST 배열을 사용해 이메일과 비밀번호를 받아옵니다.
function mas($aldert)은 msg 라는 이름의 PHP 함수를 정의하고 이 함수는 $alert라는 매개변수를 받아서 메시지를 출력합니다.
$result=$connect->qyery($sql)은 $sql에 저장된 SQL 쿼리를 실행하고, 그 결과를 변수 $result에 저장합니다.
이를 통해 데이터베이스로부터 조회된 결과를 가져올 수 있습니다.
if($resulrt){}는 $result 변수에 저장된 결과를 확인하여 조건문을 실행합니다.
이는 데이터베이스 조회가 성공한 경우를 검사하는 부분입니다.
$count = $result -> num_rows $result 에 저장된 조회 결과의 행 개수를 가져와 변수 $count에 저장합니다.
if($count == 0) {} $count 변수에 저장된 행 개수를 확인해 행 개수가 0인 경우를 검사합니다.
입력한 이메일과 비밀번호에 해당하는 사용자 정보가 없는 경우를 처리합니다.
else{} 행 개수가 0이 아닌 경우 입력한 이메일과 비밀번호에 해당하는 사용자 정보가 조회된 경우를 처리하는 부분입니다.
사용자 정보를 변수 $memberInfo에 저장하고 세션을 생성해 로그인 성공을 처리합니다.
로그인 완료 했을 경우
로그인 실패했을 경우