아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

오늘은 아이디/비밀번호 찾기를 만들어보겠습니다.

 

login.php 파일에서 아이디/ 비밀번호 찾기 부분 링크에 findId.php 넣어줍니다.

<!-- login.php -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="../css/default.css">
    <link rel="stylesheet" href="../css/style.css?ver=8">
    <title>Sung's 영화 리뷰</title>
</head>
<body>
    <header>
    <nav id="navBar">
            <div class="navBarCon">
                <div class="navBarleft">
                    Sung's 영화 리뷰
                </div>
                <div class="navBarItem">
                    <ul>
                        <a href="../main.php"><li>홈으로</li></a>
                        <a href="../border/review.php"><li>리뷰 보기</li></a>
                    </ul>
                </div>
                <div class="navBarRight">
                    <div class="navBarLogin">
                        <?php if(!isset($_SESSION['userid'])){
                            echo '<a href="login.php">로그인</a>';
                        } else {
                        echo '<div class="helloUser">'.$_SESSION['name'].'님 환영합니다.</div>';
                        echo '<div class="outAndUpdate"><a href="member_process.php?mode=logout">로그아웃</a> | 
                        <a href="update.php">정보수정</a>
                        </div>';
                        }
                        ?>   
                    </div>
                </div>
            </div>
        </nav>
    </header>
    <section>
        <div class="mainCon">
            <div class="loginTitle">로그인</div>
            <form action="member_process.php?mode=login" method="post" class="loginForm">
                <p class="loginId">아이디 : <input type="text" name="userid"></p>
                <p class="loginPw">비밀번호 : <input type="password" name="pw"></p>
                <div class="loginButton">
                <input type="submit" value="로그인">
                <input type="button" value="취소" onclick="location.href='../main.php'">
                </div>
            </form>
            <div class="registerAndFind">
            <a href="register.php">회원가입</a>&nbsp;|
            <a href="findId.php">아이디/비밀번호 찾기</a>
            </div>
        </div>
    </section>
    <footer></footer>
</body>
</html>

그리고 member 폴더 안에 findId.php, findPw.php 파일을 만들어줍니다.

 

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="../css/default.css">
    <link rel="stylesheet" href="../css/style.css?ver=15">
    <title>Sung's 영화 리뷰</title>
</head>
<body>
    <header>
        <nav id="navBar">
            <div class="navBarCon">
                <div class="navBarleft">
                    Sung's 영화 리뷰
                </div>
                <div class="navBarItem">
                    <ul>
                        <a href="../main.php"><li>홈으로</li></a>
                        <a href="../border/review.php"><li>리뷰 보기</li></a>
                    </ul>
                </div>
                <div class="navBarRight">
                    <div class="navBarLogin">
                        <?php if(!isset($_SESSION['userid'])){
                            echo '<a href="login.php">로그인</a>';
                        } else {
                        echo '<div class="helloUser">'.$_SESSION['name'].'님 환영합니다.</div>';
                        echo '<div class="outAndUpdate"><a href="member_process.php?mode=logout">로그아웃</a> | 
                        <a href="update.php">정보수정</a>
                        </div>';
                        }
                        ?>   
                    </div>
                </div>
        </nav>
    </header>
    <section>
        <div class="mainCon">
            <div class="registerTitle">아이디 찾기</div>
            <div class="findIdPw">
            <form action="member_process.php?mode=findId" method="post">
                <p>이름 : <input type="text"  name="name" placeholder="이름 입력" size="30" required></p>
                <p class="findEmail">이메일 : <input type="text"  name="email" placeholder="이메일 입력" size="30" required></p>
                <div class="findBtn">
                <input type="submit" value="찾기">&nbsp;&nbsp;&nbsp;
                <input type="button" value="취소" onclick="history.back(1)">
                </div>
            </form>
            </div>
            <div class="findMenu">
                <button onclick="location.href='findId.php'">아이디 찾기</button>&nbsp;&nbsp;&nbsp;
                <button onclick="location.href='findPw.php'">비밀번호 찾기</button>
            </div>
        </div>
    </section>
    <footer></footer>
    <script src="../script/script.js"></script>
</body>
</html>

아이디 찾기도 member_process.php에서 실행하기 때문에 mode=findId 값을 줍니다.

그리고 이름과 이메일을 입력 받아 아이디를 찾게하겠습니다.

 

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

위 이미지 처럼 만드시면 됩니다.

 

이제 member_process.php로 가서 case 'findId'를 만들어줍니다.

 

case 'findId':
            $name = $_POST['name'];
            $email = $_POST['email'];
            $userEmail = array();
            $sql = $db -> prepare("SELECT * FROM register WHERE name=:name");
            $sql -> bindParam("name",$name);
            $sql -> execute();
            while($row = $sql -> fetch()){
                if(!$row){
                    errMsg("가입 이력이 없습니다.");
                } else{
                    array_push($userEmail, $row['email']);
                } 
            }
            
                if(in_array($email,$userEmail) == false){
                    errMsg("이메일을 확인해주세요.");
                } elseif (in_array($email,$userEmail) == true) {
                    $stmt = $db -> prepare("SELECT * FROM register WHERE name=:name AND email=:email");
                    $stmt -> bindParam("name",$name);
                    $stmt -> bindParam("email",$email);
                    $stmt -> execute();
                    $user = $stmt -> fetch();
                    echo "
                        <script>
                        alert('고객님의 아이디는 ".$user['userid']."입니다.');
                        location.href='../main.php';
                        </script>
                    ";
                }  
        break;

이번에는 배열, if, while을 사용했는데요.

$name, $email에 POST 보내온 정보를 각각 넣어줍니다.

$userEmail은 가입 된 이름이 있을 때 이름이 같은 사람들이 있을 수 있기 때문에

동명이인들의 이메일을 저 배열안에 넣어줍니다.

다음으로 셀렉 문에서 이름을 값으로 주어 register 테이블에서 가지고 옵니다.

그 다음 while 문은 이름이 없어서 $row의 값이 없다면 가입한 이름이 없는 것이기 때문에 가입 이력이 없다는 메세지를 보여주고 뒤로가게 해줍니다. 

가입 이름이 있다면 그 이름을 가지고 있는 사람들의 이메일을 array_push를 사용해 $userEmail 안에 넣어줍니다.

while문은 $row에 들어갈 값이 없으면 종료 됩니다.

 

그리고 아래 if문은 배열 안에 있는 이메일인지 없는 이메일인지 비교해주는 곳입니다.

in_array는 앞에는 체크하고 싶은 값, 뒤에는 배열을 넣어 그 값이 있는지 없는지 체크하여 true 혹은  false를 반환합니다.

그래서 저는 그 값이 false면 이메일을 확인해달라는 메세지를 보여주고 뒤로가게 했습니다.

그리고 elseif에는 값이 true면 이름과 이메일을 확인해서

이름과 이메일 값이 같은 아이디를 사용자에게 경고 창으로 보여지게 했습니다.

 

제대로 작동하는지 확인해보겠습니다.

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

먼저 이름이 같은 아이디를 2개 준비했습니다.

 

 

그리고 DB에 없는 아이디를 입력해보겠습니다.

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu
아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

가입 이력이 없다고 떠야하는데 이메일을 확인해달라고 뜨네요.

 

어디가 잘못된걸까요?...

오류를 찾아봅시다.

 

일단 없는 이름을 사용했을 때를

print_r($row)를 사용해여 찍어봅시다.

 

case 'findId':
            $name = $_POST['name'];
            $email = $_POST['email'];
            $userEmail = array();
            $sql = $db -> prepare("SELECT * FROM register WHERE name=:name");
            $sql -> bindParam("name",$name);
            $sql -> execute();
            while($row = $sql -> fetch()){
                print_r($row);
                if(!$row){
                    errMsg("가입 이력이 없습니다.");
                } else{
                    array_push($userEmail, $row['email']);
                } 
            }
                /*
                if(in_array($email,$userEmail) == false){
                    errMsg("이메일을 확인해주세요.");
                } elseif (in_array($email,$userEmail) == true) {
                    $stmt = $db -> prepare("SELECT * FROM register WHERE name=:name AND email=:email");
                    $stmt -> bindParam("name",$name);
                    $stmt -> bindParam("email",$email);
                    $stmt -> execute();
                    $user = $stmt -> fetch();
                    echo "
                        <script>
                        alert('고객님의 아이디는 ".$user['userid']."입니다.');
                        location.href='../main.php';
                        </script>
                    ";
                }  
                */
        break;

저 아래를 다 주석 처리하고  if문 위에 넣어봅시다.

 

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

이렇게 입력하고 찾기를 눌러봅시다.

빈화면만 나옵니다.

이제 이름만 DB에 있는 홍길동으로 제대로 입력해봅시다.

 

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

다시 찾기를 눌러봅니다.

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

 

전 과는 다른게 값들을 출력하는 것을 알 수 있습니다.

 

없는 이름을 입력했을 때 $row에 값이 없는게 맞는거 같은데 왜 안될까요?..

 

while($row = $sql -> fetch()){
                if(empty($row) == false){
                    errMsg("가입 이력이 없습니다.");
                } else{
                    array_push($userEmail, $row['email']);
                } 
            }

empty 함수를 사용해 보겠습니다.

empty 함수는 변수 값이 0 또는 null 값이면 true를

값이 존재한다면 false를 반환합니다.

 

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

먼저 홍길동을 넣고 $row 값이 존재하는지 확인해봅시다.

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

값이 존재해 가입이력이 없다고 경고창이 보입니다.

 

이제 가입하지 않은 이름을 입력해보겠습니다.

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

확인을 눌러보면

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

값이 존재하지 않아 다음 경고창이 뜨는 것을 볼 수 있습니다.

이것을 보면 $row에는 값이 존재하지 않는게 맞습니다.

 

그럼 이번에는 조건을 바꿔보겠습니다.

empty($row) == false 이걸 false 대신 true를 넣어보겠습니다.

 

실험해본 결과 없는 이름을 입력해도 이메일을 확인해달라는 경고창이 나옵니다.

 

isset함수로 했을 때도 방법을 찾지 못해서 어쩔 수 없이

셀렉문을 하나더 추가 했습니다.

 case 'findId':
            $name = $_POST['name'];
            $email = $_POST['email'];
            $userEmail = array();
            $pdo = $db -> prepare("SELECT * FROM register WHERE name=:name");
            $pdo -> bindParam("name",$name);
            $pdo -> execute();
            $con = $pdo -> fetch();

            $sql = $db -> prepare("SELECT * FROM register WHERE name=:name");
            $sql -> bindParam("name",$name);
            $sql -> execute();
            if(!$con){
                errMsg("가입 이력이 없습니다.");
            } else{
                    while($row = $sql -> fetch()){
                            array_push($userEmail, $row['email']);
                    }
                }
                if(in_array($email,$userEmail) == false){
                    errMsg("이메일을 확인해주세요.");
                } elseif (in_array($email,$userEmail) == true) {
                    $stmt = $db -> prepare("SELECT * FROM register WHERE name=:name AND email=:email");
                    $stmt -> bindParam("name",$name);
                    $stmt -> bindParam("email",$email);
                    $stmt -> execute();
                    $user = $stmt -> fetch();
                    echo "
                        <script>
                        alert('고객님의 아이디는 ".$user['userid']."입니다.');
                        location.href='../main.php';
                        </script>
                    ";
                }  
        break;

 

셀렉문 하나를 더 추가해 $con에 값을 넣어주어 값이 없으면 경고 메세지를 띄우게 했습니다.

확인해본 결과 정상 작동합니다.

 

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

 

 

이름을 정상적으로 입력하고 없는 이메일을 입력했을 때는

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu
아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

정상적으로 이메일을 확인해달라는 경고창이 나옵니다.

 

 

이제 이름과 이메일을 정상으로 입력해보겠습니다.

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu
아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

 

 

 

 

 

 

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu
아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

 

둘 다 정상적으로 아이디를 출력해줍니다.

 

 

 

마지막으로 비밀번호 찾기입니다.

findPw.php에 아래와 같이 입력해줍니다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="../css/default.css">
    <link rel="stylesheet" href="../css/style.css?ver=15">
    <title>Sung's 영화 리뷰</title>
</head>
<body>
    <header>
        <nav id="navBar">
            <div class="navBarCon">
                <div class="navBarleft">
                    Sung's 영화 리뷰
                </div>
                <div class="navBarItem">
                    <ul>
                        <a href="../main.php"><li>홈으로</li></a>
                        <a href="../border/review.php"><li>리뷰 보기</li></a>
                    </ul>
                </div>
                <div class="navBarRight">
                    <div class="navBarLogin">
                        <?php if(!isset($_SESSION['userid'])){
                            echo '<a href="login.php">로그인</a>';
                        } else {
                        echo '<div class="helloUser">'.$_SESSION['name'].'님 환영합니다.</div>';
                        echo '<div class="outAndUpdate"><a href="member_process.php?mode=logout">로그아웃</a> | 
                        <a href="update.php">정보수정</a>
                        </div>';
                        }
                        ?>   
                    </div>
                </div>
        </nav>
    </header>
    <section>
        <div class="mainCon">
            <div class="registerTitle">비밀번호 찾기</div>
            <div class="findIdPw">
            <form action="member_process.php?mode=findPw" method="post">
                <p>아이디 : <input type="text"  name="userid" placeholder="아이디 입력" size="30"></p>
                <p class="findEmail">이메일 : <input type="text"  name="email" placeholder="이메일 입력" size="30"></p>
                <div class="findBtn">
                <input type="submit" value="찾기">&nbsp;&nbsp;&nbsp;
                <input type="button" value="취소" onclick="history.back(1)">
                </div>
            </form>
            </div>
            <div class="findMenu">
                <button onclick="location.href='findId.php'">아이디 찾기</button>&nbsp;&nbsp;&nbsp;
                <button onclick="location.herf='findPw.php'">비밀번호 찾기</button>
            </div>
        </div>
    </section>
    <footer></footer>
    <script src="../script/script.js"></script>
</body>
</html>

 

그리고 member_process.php에 findId와 비슷하게 입력해줍니다.

case 'findPw':
            $userid = $_POST['userid'];
            $email = $_POST['email'];

            $sql = $db -> prepare("SELECT * FROM register WHERE userid=:userid");
            $sql -> bindParam("userid",$userid);
            $sql -> execute();
            $row = $sql -> fetch();
            
            if(!$row){
                errMsg("없는 아이디입니다.");
            } elseif($email != $row['email']){
                errMsg("이메일을 확인해주세요");
            } else{
                echo 
                "<script>
                    location.href='changePw.php?userid=".$row['userid']."';
                </script>";
            }
            
        break;

userid를 받아 셀레 문을 실행하고 그 값을 $row에 넣어 줍니다.

만약 없는 아이디이면 없는 아이디라는 경고창을 보여주고,

있는 아이디이지만 이메일이 없으면 이메일 확인 창을 띄어줍니다.

 

그리고 문제가 없으면 비밀번호 변경 페이지로 보냅니다.

url에 userid를 넣어 userid 값도 함께 보내줍니다.

 

 

 

 

 

없는 아이디를 입력 했을 때

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu
없는 아이디
아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

이메일이 틀렸을 때

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu
아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

 

정상 입력했을 때

 

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu
아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu
changePw.php

 

마지막으로 changePw.php를 member폴더 안에 만들어줍시다.

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="../css/default.css">
    <link rel="stylesheet" href="../css/style.css?ver=17">
    </script>
    <title>Sung's 영화 리뷰</title>
</head>
<body>
    <header>
        <nav id="navBar">
            <div class="navBarCon">
                <div class="navBarleft">
                    Sung's 영화 리뷰
                </div>
                <div class="navBarItem">
                    <ul>
                        <a href="../main.php"><li>홈으로</li></a>
                        <a href="../border/review.php"><li>리뷰 보기</li></a>
                    </ul>
                </div>
                <div class="navBarRight">
                    <div class="navBarLogin">
                        <?php if(!isset($_SESSION['userid'])){
                            echo '<a href="login.php">로그인</a>';
                        } else {
                        echo '<div class="helloUser">'.$_SESSION['name'].'님 환영합니다.</div>';
                        echo '<div class="outAndUpdate"><a href="member_process.php?mode=logout">로그아웃</a> | 
                        <a href="update.php">정보수정</a>
                        </div>';
                        }
                        ?>   
                    </div>
                </div>
        </nav>
    </header>
    <section>
        <div class="mainCon">
            <div class="registerTitle">비밀번호 변경</div>
            <div class="changePw">
            <form action="member_process.php?mode=changePw" method="post">
                <input type="hidden" name="userid" value="<?= $_GET['userid']?>">
                <p>비밀번호 : <input type="password"  name="pw1" size="30"></p>
                <p class="findEmail">비밀번호 확인 : <input type="password"  name="pw2" size="30"></p>
                <div class="findBtn">
                <input type="submit" value="변경">&nbsp;&nbsp;&nbsp;
                <input type="button" value="취소" onclick="history.back(1)">
                </div>
            </form>
            </div>
        </div>
    </section>
    <footer></footer>
    <script src="../script/script.js"></script>
</body>
</html>

 

이렇게 작성해줍니다.

히든으로 userid 값을 넘겨줍니다.

 

비밀번호 변경도 member_process.php에서 진행합니다.

case 'changePw':
            $userid = $_POST['userid'];
            $pw1 = $_POST['pw1'];
            $pw2 = $_POST['pw2'];

            $stmt = $db -> prepare("SELECT * FROM register WHERE userid=:userid");
            $stmt -> bindParam("userid",$userid);
            $stmt -> execute();
            $user = $stmt -> fetch();

            $sql = $db -> prepare("UPDATE register set pw=:pw WHERE userid=:userid");
            $sql -> bindParam("pw",$pw1);
            $sql -> bindParam("userid",$userid);
            if(!$pw1 || !$pw2){
                errMsg("비밀번호를 입력해주세요.");
            } elseif($pw1 != $pw2){
                errMsg("비밀번호가 일치하지 않습니다.");
            } elseif($pw1 == $user['pw']){
                errMsg("사용 불가능한 비밀번호 입니다.");
            } 
            $sql -> execute();
            header('location:login.php');
        break;

이 부분은 저번에 회원정보 수정과 다를게 없어서 설명하지 않고 넘어가겠습니다.

 

기존 비밀번호가 1234인 sungs 아이디의  비밀번호를 1235로  바꾸었습니다.

아이디 비밀번호 찾기 소스 - aidi bimilbeonho chajgi soseu

 

오늘은 이것으로 마치겠습니다.

아이디 찾기 관련해서 더 좋은 코드를 발견하면 바로 게시글로 올리겠습니다.

 

 

 

 

 

 

# Visual Studio Code, Xampp, MySQL Workbench 환경에서 작성된 코드입니다.

공유하기

게시글 관리

구독하기비전공자의 웹 공부

'IT > PHP' 카테고리의 다른 글

PHP(9) 리뷰 보기  (0)2020.02.17PHP(8) 리뷰 작성하기  (0)2020.02.13PHP(6) 회원정보 수정  (0)2020.02.09PHP(5) 로그인, 로그아웃  (0)2020.02.08PHP(4) 회원가입 페이지 만들기  (0)2020.02.06