4. PHP 홈페이지 만들기 회원가입, 로그인 작성

2014.07.04 12:24
저자 : Kurien


사이드 바까지 만들었던 포스팅입니다.

주소는 http://kurien.speeds.kr 이구요.

이번에는 로그인, 로그아웃과 회원가입 폼입니다.

이번 과정부터 MySQL까지 연동하게 되는데, 살짝 복잡할 수도 있겠네요.


MySQL


create table member

(id char(16) not null primary key,

pass char(41) not null,

mail char(40) not null,

regdate date not null,

permit tinyint unsigned not null);


먼저 SQL에 위의 쿼리를 입력해야합니다.

다른 부분을 하기 전 이 부분부터 입력해주세요!


db.php


<?php

class DBC

{

public $db;

public $query;

public $result;


public function DBI()

{

$this->db = new mysqli('localhost', 'root', 'apmsetup', 'needprograms'); //host, id, pw, database 순서입니다.

$this->db->query('SET NAMES UTF8');

if(mysqli_connect_errno())

{

header("Content-Type: text/html; charset=UTF-8");

echo "데이터 베이스 연동에 실패했습니다.";

exit;

}

}


public function DBQ()

{

$this->result = $this->db->query($this->query);

}


public function DBO()

{

$this->result->free;

$this->db->close();

}

}

?>


먼저 db 연결을 위한 db.php 파일을 만들었습니다.

이 파일도 include를 해서 필요한 부분에만 사용합니다.


public을 사용해서 $db, $query, $result를 줬는데, 이 부분들은 클래스 내부에서만 사용하는 변수가 아니기 때문입니다.

사용하는 방식은 아래 있는 login.php에서 부터 알 수 있습니다.

중요한 점은 $this->db = new mysqli('localhost', 'root', 'apmsetup', 'needprograms');

이 부분은 자신의 아이디 비밀번호와 데이터베이스를 적어주셔야 합니다.


login.php



<?php

require_once './layout.inc';

require_once './db.php';


$base = new Layout;


$base->link = './style.css';


$db = new DBC;

$db->DBI();


$id = $_POST['logid'];

$pass = $_POST['logpass'];


$db->query = "select id, pass, permit from member where id='".$id."' and pass=password('".$pass."')";

$db->DBQ();


$num = $db->result->num_rows;

$data = $db->result->fetch_row();


$db->DBO();


if($num==1)

{

$_SESSION['id'] = $id;

$_SESSION['permit'] = $data[2];

echo "<script>location.replace('/');</script>";

} else if(($id!="" || $pass!="") && $data[0]!=1)

{

echo "<script>alert('아이디와 비밀번호가 맞지 않습니다.');</script>";

}


$base->content = "

<form action='".$_SERVER['PHP_SELF']."' method='post'>

<table style='margin:0 auto; margin-top:5%;'>

<tr>

<th colspan='2'>로그인</th>

</tr>

<tr>

<td><input type='text' name='logid'size='16' placeholder='아이디'/></td>

<td rowspan='2'><input type='submit' value='로그인' style='height:50px;'/></td>

</tr>

<tr>

<td><input type='password' name='logpass' size='16' placeholder='비밀번호'/></td>

</tr>

<tr>

<td><a href='./registi.php'>등록</a></td>

<td style='text-align:right;'><a href='./find.php'>찾기</a></td>

</tr>

</table>

</form>

";


$base->LayoutMain();


?>


login.php 에서는 layout.inc와 db.php를 include 했습니다.

$db->DBI()를 사용해서 DB에 접속하고, $db->query를 사용해서 member 테이블에서 로그인하는 id와 password를 찾습니다.

$db->DBQ()를 사용해서 쿼리를 전송한 후 $num = $db->result->num_rows를 사용해서 쿼리 결과 값의 개수를 확인하고,

$data = $db->result->fetch_row()를 사용해서 결과 값을 불러오게됩니다.


더 이상 DB를 사용할 필요가 없으므로 $db->DBO()를 사용해서 DB 접속을 끊어주고,

$num은 결과 값의 개수를 알려주고 id가 1개를 넘을 일이 없으므로 $num==1을 조건으로 줬습니다.


조건이 참이라면 $_SESSION['id']에 id의 값을, $_SESSION['permit'] 값에는 DB에서 받아온 permit의 값을 주는데,

permit은 등급처럼 사용하려고 만들어 놓은 부분입니다.

그리고 메인화면으로 이동되게 끔 했습니다.


만약 $num이 0이라면 오류가 나고 로그인 되지 않게 했습니다.

그 아랫 부분은 단순히 HTML이므로 설명은 생략하겠습니다.


logout.php


<?php

require_once './layout.inc';


$base = new Layout;

$base->link = './style.css';


$base->LayoutMain();


unset($_SESSION['id']);

unset($_SESSION['permit']);

session_destroy();


echo "<script>alert('로그아웃 되었습니다.');location.replace('/')</script>";

?>


로그아웃 부분은 복잡하지 않습니다.

레이아웃을 include 시킨 후 unset() 함수를 이용해서 세션을 해제 해줍니다.

그리고 session_destory()를 사용해서 세션을 완전히 없애주고, 로그아웃 되었습니다.라는 알림창과 함께 메인 화면으로 돌아갑니다.


registi.php



<?php


require_once './layout.inc';


$base = new Layout;


$base->link = './style.css';

$base->content = "

<form action='./registo.php' method='post'>

<table style='margin:0 auto; margin-top:5%;'>

<tr>

<th colspan='2'>회원가입</th>

</tr>

<tr>

<td>아이디</td>

<td><input type='text' size='16' name='id' placeholder='아이디'/></td>

</tr>

<tr>

<td>비밀번호</td>

<td><input type='password' size='16' name='pass1' placeholder='비밀번호'/></td>

</tr>

<tr>

<td>비밀번호 확인</td>

<td><input type='password' size='16' name='pass2' placeholder='비밀번호 확인'/></td>

</tr>

<tr>

<td>이메일</td>

<td><input type='text' size='16' name='mail' placeholder='이메일'/></td>

</tr>

<tr>

<td colspan='2' style='text-align:center;'><input type='submit' value='등록'/></td>

</tr>

</table>

</form>

";

$base->LayoutMain();

?>


로그인이 있다면 회원가입도 있어야겠죠?

저는 간단하게 아이디, 비밀번호, 비밀번호 확인과 이메일만 넣었습니다.

회원가입 폼은 어려운 부분 없이 단순히 registo.php로 정보를 전달하는 역할만 하게됩니다.


registo.php


<?php

require_once './layout.inc';

require_once './db.php';


$db = new DBC;

$db->DBI();


$base = new Layout;

$base->link = './style.css';


$id = $_POST['id'];

$pass1 = $_POST['pass1'];

$pass2 = $_POST['pass2'];

$mail = $_POST['mail'];

$date = date('Y-m-d');


if($pass1 == $pass2)

{

$pass = $pass1;

} else

{

header("Content-Type: text/html; charset=UTF-8");

echo "<script>alert('비밀번호가 맞지 않습니다.');history.back();</script>";

exit;

}


$db->query = "insert into member values ('".$id."', password('".$pass."'), '".$mail."', '".$date."', 1)";

$db->DBQ();


if(!$db->result)

{

header("Content-Type: text/html; charset=UTF-8");

echo "<script>alert('회원가입에 실패하였습니다.');history.back();</script>";

$db->DBO();

exit;

} else

{

echo "<script>alert('회원가입 되었습니다. 로그인 화면으로 이동합니다.');location.replace('./login.php');</script>";

$db->DBO();

exit;

}



$base->content = "";


$base->LayoutMain();


?>


회원가입 폼은 조금 복잡하네요.

registi.php에서 받아온 id, pass1, pass2, mail에 대한 정보와 가입 일자를 알려줄 $date 변수가 있고,

$pass1과 $pass2가 같은지 비교를 한 후 같다면 $pass에 $pass1을 저장합니다.

다르다면 비밀번호가 맞지 않다는 알림을 출력해주구요.


$db->query = "insert into member values ('".$id."', password('".$pass."'), '".$mail."', '".$date."', 1)";

그 다음 위의 쿼리를 보내주는데 마지막에 있는 1은 login.php에서 봤던 permit 부분입니다.

기본 가입시 1을 하고 나중에 등급을 변경할 수 있게 하려고 만들었습니다.


만약 정상적으로 쿼리에 입력이 되었다면 $db->result는 true ,

정상적으로 입력이 안되었다면 false를 출력합니다.


만약 if(!$db->result)가 1이라면 $db->result가 false인 것이기 때문에 회원가입에 실패했다는 메시지를 출력합니다.

else의 경우 다른 경우는 !$db->result = false 밖에 없으므로 회원가입 되었다는 메시지만 출력됩니다.


어우... 한번에 다 올리니 무지 길어졌네요.



우측 상단을 보시면 Logout이라는 메뉴가 있죠?

로그인이 되어있다는 의미입니다.


회원가입 양식이나 로그인 폼이나 아직 엄청 부족한 부분이 많지만,

일단 기능만 만들어 두고 차근차근 수정해나가겠습니다.


위에서 이해가 안되는 부분은 댓글에 남겨주세요^^

저작자 표시 비영리 변경 금지
신고
TAG , ,
  1. Dr.A 2014.08.07 16:25 신고  댓글주소  수정/삭제  댓글쓰기

    여기블로그 보고 제가 찾던php사이트만드는 공부하고 있습니다 너무 감사합니다 ㅠ 그런데 회원가입 부분에 좀 에러가있는거같은데
    아무내용 안넣고 그냥 회원가입누르면 회원가입되고 로그인부분이 먹통이됩니다 db에보면 아무내용없는 가입자가생기고 지우면 로그인부분이 정상적으로 돌아옵니다 이부분은 어떻게 수정해야할까요?

    • Kurien 2014.08.07 16:36 신고  댓글주소  수정/삭제

      원래 회원가입 부분에 빈칸을 검사하는 코드를 넣어야 하는데, 지금 대략전인 형태만 만들다보니 이런 현상이 발생한 것 같네요.

      if(isset($id) && isset($pass1) && isset($pass2) && isset($mail))
      {
      header("Content-Type: text/html; charset=UTF-8");
      echo "<script>alert('빈 칸이 존재합니다.');history.back();</script>";
      exit;
      }

      위의 코드를 $date = date('Y-m-d'); 아래 넣어주시면 정상 작동 될 것 같은데, 직접 실행해본게 아니라서 확실히 될런지는 모르겠네요.
      신경쓰이신다면 한번 해보세요.

  2. localhost 2014.12.03 17:18 신고  댓글주소  수정/삭제  댓글쓰기

    php공부에 많은 도움이 되고 있습니다. 질문이있는데요...
    div 로 프레임 창을 나눈 페이지의 aside에 로그인창을 만들어놨습니다.
    로그인을 누르면 aside창에서 환영합니다.ㅇㅇㅇ님 이라고 만들고싶은데
    로그인을 누르면 자꾸 새창에서 그 값이 출력이 됩니다.
    현재의 프레임창에서 출력할 수는 없을까요?

  3. i love you 2014.12.28 15:27 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요? Kurien님이 직접 써주신 강좌를 읽어보며 php공부를 하고 있는 학생인데요.. 혹시 사이드 부분과 본문부분이 따로 스크롤 되도록 만드는 방법에 대해서도 강좌를 써주실 수 있으신가요? 그부분에서 막혀서 잘 안되네요ㅠㅠ

  4. John 2015.03.18 22:36 신고  댓글주소  수정/삭제  댓글쓰기

    layout.inc 파일 소스 가르처주세요

  5. kim 2015.09.21 10:28 신고  댓글주소  수정/삭제  댓글쓰기

    <참고>

    혹시 login후 logout버튼 눌러도 logout 안되시는 분들 -> layout.inc 파일에
    에서 Logout.php 중 대문자 L을 소문자 l로 바꿔주세요 (제가 안됬어서 ㅎㅎ)

  6. kyr0222 2015.11.12 21:40 신고  댓글주소  수정/삭제  댓글쓰기

    sql 쿼리 연동을 어디서 해야하나요??

    • 신기루 2015.11.15 15:59 신고  댓글주소  수정/삭제

      소스 그대로 보고 따라하기 형태로 진행하여도 저 결과물을
      뽑아내지 못한다면 기본 PHP문법과 MYSQL을 기초라도
      공부를 하고 오시면 도움이 될 듯 싶네요.

      저 소스 전부 다 이해하기란 솔직히 쉽지가 않네요

  7. 사냥꾼 2016.03.23 16:40 신고  댓글주소  수정/삭제  댓글쓰기

    .$id. 으로 변수 앞뒤로 점을 찍는데 어떤 뜻인지 모르겠습니다.
    가르침주시면 감사하겠습니다.

    • Kurien 2016.03.23 16:42 신고  댓글주소  수정/삭제

      변수 앞 뒤의 .은 "연결자"라고
      말 그대로 앞의 값과 뒤의 값을 연결해주는 기능을 합니다.

      echo '안녕' . '하세요'; 라는 내용을 입력하면

      "안녕하세요"라는 출력 값이 출력될껍니다.

  8. 수정수정 2016.05.15 19:14 신고  댓글주소  수정/삭제  댓글쓰기

    한글이깨져서 나오는데어떻게해야되죠

    • Kurien 2016.05.15 23:03 신고  댓글주소  수정/삭제

      html, php, db, 파일 중 하나가 인코딩이 다를 수 있습니다.
      요즘은 대부분 UTF-8 인코딩을 사용하니 모두 하나의 인코딩으로 맞춰보세요.

  9. leejeongwon 2016.12.10 22:44 신고  댓글주소  수정/삭제  댓글쓰기

    login.php 파일보면 layout.inc 파일은 어디에있는부분인가요 include 해야하는파일이없어서 돌아가지가않아요

  10. 01046520733 2017.01.18 13:45 신고  댓글주소  수정/삭제  댓글쓰기

    데이터베이스가 윈도우에 있는건가요? 아님 리눅스에 있는건가요?
    그리고 혹시 DB는 리눅스에 있고 php는 윈도우에 있다면 둘이 연동이 가능한건가요?
    가능하면 둘이 맵핑은 어떻게 하나요? 제발..............

    • Kurien 2017.01.25 16:02 신고  댓글주소  수정/삭제

      제 경우 리눅스에 설치했으며, 어디에 있든 문제는 없습니다.

      서로 다른 서버에 존재하는 PHP와 DB 연동은 다른 글을 참고하시는 것을 추천드립니다.

  11. 01046520733 2017.01.19 13:27 신고  댓글주소  수정/삭제  댓글쓰기

    님 제가 이거 보고 어느정도 따라해서 회원가입을하면 db에도 정보가 등록되는데 까지는 만들었는데 로그인이 안돼요 ㅠㅠ
    메인 페이지에서 로그인을 누르면
    Fatal error: Call to a member function fetch_row() on a non-object in H:\APM_Setup\htdocs\login.php on line 39
    이렇게 떠서
    $data = $db->result->fetch_row(); 이 줄이 문제인거 같아서 이 줄을 날리고 다시 로그인을 누르면 로그인 창은 뜨게 되는데 정보입력하고 로그인 누르면 아이디 비밀번호가 맞지않다고 뜨는데 제 생각에는 날린 줄이 비밀번호 관련 변수여서 그런것 같은데 어떻게 수정해야 제대로 동작할까요 ㅜㅜ?? 답변좀 달아주세요

    • Kurien 2017.01.25 16:05 신고  댓글주소  수정/삭제

      말씀하신 부분은 mysqli 모듈이 존재하지 않아 발생한 문제로 보입니다.

      작성된 mysqli의 모듈을 mysql 모듈의 함수로 변경하시거나, mysqli 모듈을 설치하셔야 할 것 같습니다.

  12. kcg 2017.01.24 11:11 신고  댓글주소  수정/삭제  댓글쓰기

    <?php

    class DBC

    {
    public $db;
    public $query;
    public $result;

    public function DBI()
    {

    $this->db = new mysqli('192.168.0.108','userjarvis','1','ITJarvis');
    ㄴ//db ip주소 <--이부분주석

    $this->db->query('SET NAMES UTF8');

    if(mysqli_connect_errno())

    {

    header("Content-Type: text/html; charset=UTF-8");

    echo "데이터 베이스 연동에 실패했습니다.";

    exit;

    }

    }




    public function DBQ()

    {

    $this->result = $this->db->query($this->query);

    }
    public function DBO()

    {
    $this->result->free;
    $this->db->close();
    }
    }
    ?>
    -----------------------------------
    오류
    Warning: require_once(./db.php) [function.require-once]: failed to open stream: No such file or directory in C:\APM_Setup\htdocs\login.php on line 5

    Fatal error: require_once() [function.require]: Failed opening required './db.php' (include_path='.') in C:\APM_Setup\htdocs\login.php on line 5
    원인을 잘모르겠습니다.

    • Kurien 2017.01.25 16:09 신고  댓글주소  수정/삭제

      입력해주신 코드에는 require_once 함수가 없는데, 아래 적어주신 오류는 require_once 함수에서 나타나는 오류네요.

      오류가 발생한 위치에서 db.php를 찾지 못해서 발생하는 오류입니다.
      경로를 다시한번 확인해보세요!

  13. rana 2017.04.12 12:27 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 php 홈페이지및 게시판 만들기를 따라 공부하고 있는 학생입니다
    로그인을 하고 나서 헤더파일 Need programs를 누르면 로그인이 풀려서 다시 로그인을 해야해요
    로그인상태를 유지하고싶은데 어떻게 하는게 좋을까요?

  14. leedo 2017.05.04 14:18 신고  댓글주소  수정/삭제  댓글쓰기

    궁금한게있습니다!
    외부 데이터베이스 연결을 하려고하는데...
    $this->db = new mysqli('200.200.200.24', 'root', 'hello123', 'shopping');
    이렇게 아이피만 바까주면 안되는건가요? 접속 허용도 시켜줬습니다.
    쉘에서 외부로 접속하면 되는데 php에서는 연결이안되네요 ㅠㅠ

    • Kurien 2017.05.04 14:30 신고  댓글주소  수정/삭제

      안되는 이유는 여러가지라서 단정할수가 없습니다.

      연결이 안되면 오류가 나타날텐데 그 오류를 보고 해결하는게 가장 빠를거에요.

      오류가 나타나시면 오류내용이라도 올려주시기바랍니다

  15. developer 2017.05.07 10:04 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 게시판 만들기 글부터 시작해서 잘 배우고있습니다.
    2가지 여쭈어 볼게 있습니다.
    1. 로그인을 한 상태에서 주소에 domain.com/login.php 를 접근하면 로그인을 하는 창이 뜨는데 로그인한 사용자가 주소를 통해접근하면 메인페이지로 되돌려보내려면 어떻게 해야하나요?

    2. 로그인을 한 사용자의 mail주소를 db에서 가져와서 상단 로그아웃 옆에다가 표시해주고싶은데 어떻게 해야하나요?

    구글에서 검색도해보고 이것저것 시도해보다가 도저히 답이 안나와서 결국 도움을 요청합니다..시간 되신다면 답변 부탁드립니다: )

    • developer 2017.05.07 10:29 신고  댓글주소  수정/삭제

      1번 문제에 대해서는 자체적으로 이게 정상적인 방법인지는 모르겠지만 layout.inc의 로그인/로그아웃 문구를 출력하는 if문을 참고하여 해결했습니다.

      로그인영역을 보여주는 부분은
      if($_SESSION['id']==""){
      영역
      }
      으로 감싸주고
      else{
      영역
      }
      을 사용하여 로그인사용자일 경우에는 아무것도 안뜨게 했네요

  16. ski 2017.07.28 10:00 신고  댓글주소  수정/삭제  댓글쓰기

    ������ ���̽� ������ �����߽��ϴ�.
    login 을 누르면 위와 같은 에러가 뜨는데 어디가 문제인지를 못 찾겠습니다..
    혹시나 이 글을 보신다면 도움을 부탁드립니다.