Animated Turtle

Query

PHP, 회원가입과 로그인

훙구 2023. 4. 19. 23:50

...

728x90
반응형

PHP를 사용하여 회원가입과 로그인 기능 만들기

html로 먼저 구성한 회원가입과 로그인 화면을 php로 기능을 추가하여 만들어보도록 하겠습니다.

목록

접속

$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";
};

connect.php의 내용입니다.

메인

<?php
    include "../connect/connect.php";
    include "../connect/session.php";

    echo "<pre>";
    var_dump($_SESSION);
    echo "</pre>";
?>

<!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>PHP 블로그 만들기</title>

    <?php include "../include/head.php" ?>
</head>
<body class="gray">
    <?php include "../include/skip.php" ?>
    <!-- skip -->

    <?php include "../include/header.php" ?>
    <!-- include -->

    <main id="main" class="container">
        <div class="intro__inner bmStyle">
            <picture class="intro__images">
                <source srcset="../assets/img/intro01.png, ../assets/img/intro01@2x.png 2x, assets/img/intro01@3x.png 3x" />
                <img src="../assets/img/intro01.png" alt="소개이미지">
            </picture> 
            <p class="intro__text">
                어떤 일이라도 노력하고 즐기면 그 결과는 빛을 바란다고 생각합니다.
                신입의 열정과 도전정신을 깊숙히 새기며 배움에 있어 겸손함을 
                유지하며 세부적인 곳까지 파고드는 개발자가 되겠습니다.
            </p>
        </div>
    </main>
    <!-- main -->
</body>
</html>

include 된 내용 살펴보기

  • head.php 에는 css와 script를 가져오는 링크의 내용이 있습니다.
  • header.php 에는 본문 상단 header영역의 html 구조가 들어있습니다.
  • skip.php 에는 skip 메뉴가 들어있습니다.
  • header.php 에 있는 php를 살펴보면
<?php
    if(isset($_SESSION['memberID'])){   ?>
        <ul>
            <li><a href="../mypage/mypage.php"><?=$_SESSION['youName']?>님👍</a></li>
            <li><a href="../login/logout.php">로그아웃</a></li>
        </ul>
    <?php } else { ?>
        <ul>
            <li><a href="../join/join.php">회원가입</a></li>
        </ul>
    <?php } ?>
  • 위의 내용이 들어있는데 이는 SESSION에 memberID가 있다면 youName과 로그아웃이 들어있는 list를 출력하고, memberID가 없다면 회원가입이 있는 list를 출력합니다.
  • 로그인을 했을 때와 하지 않았을 때의 차이를 두었습니다.

Join.php

<form action="joinSave.php" name="join" method="post">
    <fieldset>
        <legend class="blind">회원가입 영역</legend>
        <div>
            <label for="youEmail" class="required">이메일</label>
            <input type="email" id="youEmail" name="youEmail" placeholder="이메일을 입력해주세요." class="inputStyle" required>
        </div>
        <div>
            <label for="youName" class="required">이름</label>
            <input type="text" id="youName" name="youName" placeholder="이름을 입력해주세요." class="inputStyle" required>
        </div>
        <div>
            <label for="youPass" class="required">비밀번호</label>
            <input type="password" id="youPass" name="youPass" placeholder="비밀번호를 입력해주세요." class="inputStyle" required>
        </div>
        <div>
            <label for="youPassC" class="required">비밀번호 확인</label>
            <input type="password" id="youPassC" name="youPassC" placeholder="비밀번호를 다시한번 입력해주세요." class="inputStyle" required>
        </div>
        <div>
            <label for="youPhone" class="required">연락처</label>
            <input type="text" id="youPhone" name="youPhone" placeholder="연락받으실 번호를 입력해주세요." class="inputStyle" required>
        </div>
        <button type="submit" class="btnStyle">회원가입 완료</button>
    </fieldset>
</form>

join.php에 들어있는 내용 중 사용자가 정보를 입력하는 input 박스의 부분입니다.

JoinSave.php

<?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);

    // 사용자가 데이터 입력 -> 유효성 검사 -> 통과 -> 회원가입(쿼리문전송)
    // 사용자가 데이터 입력 -> 유효성 검사 -> 통과(이메일주소/핸드폰)(O) -> 회원가입(쿼리문전송)
    // 사용자가 데이터 입력 -> 유효성 검사 -> 통과(X) -> 회원가입(쿼리문전송)

    // 메세지 출력
    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("/^[가-힣]{6,15}$/", $youName);

    if($check_name == false){
        msg("이름은 한글로 2자에서 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 = '$youPhone'";
    $result = $connect -> query($sql);

    if($result){
        $count = $result -> num_rows;

        if($count == 0){
            $isPhoneCheck = true;
        } else {
            msg("이미 가입된 번호 입니다. 로그인 해주세요!");
            exit;
        }
    } else {
        msg("에러발생1! 관리자에게 문의하세요.");
        exit;
    }

    // 회원가입
    if($isEmailCheck == true && $isPhoneCheck == true){
        // 데이터 입력하기
        $sql = "INSERT INTO members(youEmail, youName, youPass, youPhone, regTime) VALUES('$youEmail', '$youName', '$youPass', '$youPhone', '$regTime')";
        $connect -> query($sql);

        if($result){
            msg("회원가입을 축하합니다! 로그인해주세요! <br><div class='intro__btn'><a href='#'>로그인</a></div>");
            exit;
        } else {
            msg("에러발생3: 관리자에게 문의하세요.");
            exit;
        }
    } else {
        msg("이미 회원가입이 되어있습니다. 로그인해주세요.");
        exit;
    }
?>
  • $를 사용하여 각각의 youEmail, youName, youPass, youPassC, youPhone, regTime을 만들고
  • 사용자가 input박스에 입력한 정보를 받아와 저장합니다.
  • html에 문자로 출력할 수 있는 msg함수를 만들어 놓습니다.

 

  • 유효성 검사
  • preg_match() 함수를 사용하여 각각의 $youEmail, $youName, $youPass, $youPassC, $youPhone의 유효성을 검사합니다. (정규식 표현 사용)
  • 각각의 검사 결과를 $check_XXXX 형식으로 변수에 저장하여 false인 경우에 msg 함수로 오류 내용을 알려줍니다.

 

  • 중복검사
  • $isEmailCheck에 false 값을 저장해놓습니다.
  • $sql에는 SELECT 쿼리문을 사용하여 youEmail = $youEmail 의 조건을 가진 youEmail을 찾는 명령문을 저장합니다.
  • $result에는 $sql에 저장된 쿼리문을 실행한 값을 저장합니다.
  • $result를 실행 했을 때, 결과의 열 값(num_rows)을 $count에 저장합니다.
  • $count가 0이라면 (쿼리문이 실행된 값이 0줄이라는 의미로 같은 Email 주소가 없음을 의미합니다.) isEmailCheck에 true를 저장합니다.
  • 같은 방법으로 youPhone에도 중복검사를 실행합니다.
  • $isEmailCheck 값과 $isPhoneCheck 의 값이 모두(&&) true라면 $sql에 데이터를 넣어주는 INSERT 쿼리문을 저장 후 실행합니다. (회원가입 데이터를 삽입)

Login.php

<form action="loginSave.php" name="loginSave" method="post">
    <fieldset>
        <legend class="blind">로그인 영역</legend>
        <div>
            <label for="youEmail" class="blind required">이메일</label>
            <input type="email" id="youEmail" name="youEmail" placeholder="이메일" class="inputStyle" required>
        </div>
        <div>
            <label for="youPass" class="blind required">비밀번호</label>
            <input type="password" id="youPass" name="youPass" placeholder="비밀번호" class="inputStyle" required>
        </div>
        <button type="submit" class="btnStyle2 mt20">로그인</button>
    </fieldset>
</form>

로그인 화면에서 사용자가 정보를 입력하는 input 부분입니다.

LoginSave.php

<?php
    include "../connect/connect.php";
    include "../connect/session.php";

    $youEmail = $_POST['youEmail'];
    $youPass = $_POST['youPass'];

    // echo $youEmail, $youPass;

    // 데이터 출력
    function msg($alert){
        echo "<p class='intro__text'>$alert</p>";
    }

    // 데이터 조회
    $sql = "SELECT memberID, youEmail, youName, youPass 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");
        }
    }
?>
  • joinSave.php 와 마찬가지로 사용자가 입력한 값을 $youEmail, $youPass에 저장합니다.
  • youEmail과 youPass가 모두 일치하는 조건(WHERE)을 만족하는 값을  SELECT 하는 쿼리문을 $sql에 저장하여 실행합니다.
  • 중복검사와 반대로 num_rows가 0이면 로그인 실패를 안내합니다.
  • 로그인에 성공했다면 $memberInfo 에 $result의 값을 배열형식으로 저장합니다.
  • $_SESSION['정보'] 에 memberInfo['정보'] 를 저장합니다. (로그인 상태 유지)
  • Header를 사용하여 메인페이지로 돌아갑니다.
728x90
반응형