기초부터 시작하는 코딩/PHP

PHP를 사용해서 회원가입페이지와 로그인페이지 만들기

kebab00 2023. 4. 19. 22:28

728x90

PHP란

-PHP는 서버 측에서 실행되는 프로그래밍 언어로 HTML을 프로그래밍적으로 생성해주고, 데이터베이스와 상호작용 하면서 데이터를 저장하고, 표현해 줍니다.

- PHP는 웹을 위해서 만들어졌고, 지금도 웹을 위해서 발전하고 있는 웹을 위한 언어이며 많은 장점이 있습니다.

PHP사용하기 

- PHP를 사용하기 위해서는 웹페이지와 연동할 수 있는 PHP 폴더를 만들어 주어야 합니다.

- 저는 MAMP를 사용해서 서버를 만들고 연동해 주었습니다.

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

- php는 <?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>

        <?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 class="join__inner">
                <h2>회원가입</h2>
                <div class="join__form">
                    <form action="joinSave.php" name="#" method="post">
                        <fieldset>
                            <legend class="blind">회원가입 영역</legend>
                            <div>
                                <label for="youEmail" class="required">이메일</label>
                                <input class="inputStyle" type="email" id="youEmail" name="youEmail" placeholder="이메일을 입력해주세요" required>
                            </div>
                            <div>
                                <label for="youName" class="required">이름</label>
                                <input class="inputStyle" type="text" id="youName" name="youName" placeholder="이름을 입력해주세요" required>
                            </div>
                            <div>
                                <label for="youPass" class="required">비밀번호</label>
                                <input class="inputStyle" type="password" id="youPass" name="youPass" placeholder="비밀번호를 입력해주세요" required>
                            </div>
                            <div>
                                <label for="youPassC" class="required">비밀번호 확인</label>
                                <input class="inputStyle" type="password" id="youPassC" name="youPassC" placeholder="비밀번호를 다시한번 입력해주세요" required>
                            </div>
                            <div>
                                <label for="youPhone" class="required">연락처</label>
                                <input  class="inputStyle" type="text" id="youPhone" name="youPhone" placeholder="연락처를 입력해주세요" required>
                            </div>
                            <button type="submit" class="btnStyle">회원가입 완료</button>
                        </fieldset>
                    </form>
                </div>
            </div>
        </main>
        <!-- //main -->
    </body>
</html>

- <?php include "../include/head.php" ?> 를 사용해서 html과 css를 가져올 수 있습니다.

- 그래서 다른 페이지와 공통으로 사용하는 부분은 include로 가져오고 내용이 다른 부분만 작성해 줍니다.

- form에 있는 내용을 form태그의 action속성을 통해서 POST형식으로 회원가입 완료 페이지인 joinSave.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>

    <?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">
                <img src="../assets/img/joinEnd01.png" alt="회원가입 이미지">
            </picture>
                <!-- 가입이 완료되었습니다. 환영합니다. <br> 로그인 해주세요. -->
                <?php
                    include "../connect/connect.php";
                    $youEmail = $_POST['youEmail'];
                    $youName = $_POST['youName'];
                    $youPass = $_POST['youPass'];
                    $youPassC = $_POST['youPassC'];
                    $youPhone = $_POST['youPhone'];
                    $regTime = time();

                    //메세지 출력
                    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 = '$youPhone'";
                    $result = $connect -> query($sql);

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

                        if($count == 0){
                            $isPhoneCheck = true;
                        } else {
                            msg("이미 회원가입 되어 있습니다. 로그인 해주세요");
                            exit;
                        };
                    } else {
                        msg("에러발생2: 관리자에게 문의하세요");
                        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('회원가입을 축하합니다. 로그인 해주세요<div class="intro__btn"><a href="../login/login.php">로그인하기</a></div>');
                            exit;
                    } else {
                            msg("에러발생3: 관리자에게 문의하세요");
                            exit;
                    }
                    } else {
                        msg("이미 회원가입 되어 있습니다. 로그인 해주세요");
                        exit;
                    }
                ?>
        </div>
        <!-- //intro__inner -->
    </main>
    <!-- //main -->
    <footer id="footer">
        <div class="footer__inner"></div>
    </footer>
    <!-- //footer -->
</body>
</html>

- POST형식으로 받아온 정보를 $youEmail 와 같은 변수에 저장을 해줍니다. 

- 그리고 받아온 정보들을 $check_mail = preg_match("/^[a-z0-9_+.-]+@([a-z0-9-]+\.)+[a-z0-9]{2,4}$/", $youEmail); 같은 방식으로 유효성 검사라는 것을 해주는데 사용자가 입력한 내용이 원하는 형식과 같은지 확인해 주는 것입니다.

- 보통 정규식 표현으로 유효성검사를 해줍니다.

다양한 정규식 표현들 

- 영어 : [a-z] a부터 z까지의 영어들이 있는지 확인합니다.

- 한글 : [가-힣] 가 부터 힣까지의 한글이 있는지 확인합니다.

- 숫자 : [0-9] 0부터 9 가지의 숫자가 있는지 확인합니다.

- 글자 수 : {9,15} 최소비트(?)부터 최대비트(?)까지를 가리킵니다.

등등 많은 정규식 표현들이 있습니다.

- 그렇게 정규식 표현을 사용해서 유효성 검사를 끝냈으면 그 데이터를 sql문에 집어넣어 실행시켜주면 됩니다.

$sql = "SELECT youEmail FROM members WHERE youEmail = '$youEmail'";
$result = $connect -> query($sql);

- 이런식으로 말이죠 

로그인 페이지

<!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 center">
            <h2>로그인</h2>
            <p class="">
                로그인을 하시면 게시글 및 댓글 작성이 가능합니다. <br> 회원가입을 하시면 로그인이 가능합니다.<br>admin@admin.com/1234
            </p>
            <div class="login__form bmStyle btStyle">
                <form action="loginSave.php" name="loginSave" method="post">
                    <fieldset>
                        <legend class="blind">로그인 영역</legend>
                        <div >
                            <label for="youEmail" class="required blind">이메일</label>
                            <input class="inputStyle" type="email" id="youEmail" name="youEmail" placeholder="이메일을 입력해주세요" required>
                        </div>
                        <div>
                            <label for="youPass" class="required blind">비밀번호</label>
                            <input class="inputStyle" type="password" id="youPass" name="youPass" placeholder="비밀번호를 입력해주세요" required>
                        </div>
                        <button type="submit" class="btnStyle2 mt20">로그인</button>
                    </fieldset>
                </form>
            </div>
            <div class="login__footer">
                <ul class="listStyle">
                    <li>회원가입을 하지 않았다면 회원가입을 먼저 해주세요 <a href="join.html"></a></li>
                    <li>아이디가 기억나지 않는다면 <a href="#">아이디 찾기</a> </li>
                    <li>비밀번호가 기억나지 않는다면 <a href="#">비밀번호 찾기</a> </li>
                </ul>
            </div>
        </div>
        </main>
        <!-- //main -->
    </body>
</html>

- 로그인 페이지도 페이지를 만드는 것 자체는 비슷합니다.

- input 태그에 입력한 내용을 loginSave.php로 post방식으로 보내주면 됩니다.

로그인 완료 페이지

<!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">
                <img src="../assets/img/joinEnd01.png" alt="회원가입 이미지">
            </picture>
            <?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('이메일 또는 비밀번호가 잘못되었습니다. 다시 한번 확인해주세요<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 -->

    <footer id="footer">
        <div class="footer__inner"></div>
    </footer>
    <!-- //footer -->
</body>
</html>

- 일단 connect.php 와 session.php에 연결을 해주어야합니다.

- 그리고 마찬가지로 받은 데이터를 $youEmail = $_POST['youEmail'];로 저장을 해줍니다.

- 그리고 사용자가 입력한 내용이 mamp서버에 있는 db에 있는 내용일 때 (즉 이미 회원가입이 된 사람이 정확한 정보를 입력했을 때) 

// 데이터 조회
$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){

- 이 부분 입니다

로그인이 됩니다.

- 정보가 db에 없다면 로그인 되지 않습니다.

- 그리고 로그인이 된다면 회원의 이름,이메일,멤버넘버등의 정보로 세션을 생성해 쿠키로 저장해 줍니다.

- 그렇게 된다면 로그인된게 유지가 됩니다.

로그아웃 페이지

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

    unset($_SESSION['memberID']);
    unset($_SESSION['youEmail']);
    unset($_SESSION['youName']);

    Header("Location: ../main/main.php");
?>

- 로그아웃은 더욱 간단합니다.

- 아까 로그인완료 페이지 마지막에서 만들어 주었던 세션을 삭제해 주면 끝입니다.

- 수고하셨습니다.