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

2014. 7. 4. 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이라는 메뉴가 있죠?

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


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

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


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