PHP와 MySQL을 활용한 게시판 만들기[2] - 로그인

2017. 8. 23. 21:35WebHacking/Web



< 로그인 인증 페이지 만들기 >


# 로그인 인증에 앞서 session 테이블을 생성한다

- 로그인 한 사용자를 저장하는 테이블

- 해당 테이블 내의 데이터가 존재한다면 그 사용자는 이미 로그인 된 사용자이다

- 이전 게시글에서 생성한 bbs DB에 session 테이블을 생성한다

- mysql> CREATE TABLE session VALUE( no int, user_id varchar(15), session_id char(30) );

no : 사용자 식별번호

user_id : 유저 아이디 

session_id : 세션 아이디



[ http://192.168.6.123/index.php 소스코드 ] - 게시판 첫 페이지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php
// 세션사용을 하기위한 필수메서드, 세션사용선언
session_start();
// #1 MySQL 연결
$db = mysql_connect( localhost , 'root' , 'password1!' );
if!$db ){
    die('MySQL connect ERROR : ' . mysql_error());
}
// #2 DB접속
$ret = mysql_select_db'bbs'$db);
if!$ret ){
    die('MySQL select ERROR : '. mysql_error());
}
 
?>
<!-- 게시판 HTML소스코드 !-->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>index</title>
    <link href="bootstrap-3.3.2-dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="index.css" rel="stylesheet">
  </head>
  <body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">게시판</a>
<?php
 
if!isset($_SESSION[is_login]) ){ // 세션값이 없을 때 = "로그인 전 상태"
 
?>
 
        </div>
        <div id="navbar" class="navbar-collapse collapse">
<!--
method=POST , action=signin.php 
           POST방식으로 signin.php로 입력받은 데이터를 전송하는 form태그
!-->
          <form class="navbar-form navbar-right" method=POST action=signin.php>
 
            <div class="form-group">
              <input type="text" name="user_id" placeholder="USER ID" class="form-control">
            </div>
 
            <div class="form-group">
              <input type="password" name="user_pw" placeholder="Password" class="form-control">
            </div>
 
            <button type="submit" class="btn btn-success">Sign in</button>
 
          </form>
        </div><!--/.navbar-collapse -->
      </div>
 
    
<?php
 
}else{    // 세션값이 존재 = "로그인 된 상태" => 아이디 비밀번호 입력 폼 화면에 출력x
    echo " Welcome~ ";
}
?>  
  </nav>
 
    <!-- 게시글들을 모아놓는 테이블 -->
      <div class="jumbotron">
      <div class="container">
        <div class="table-responsive">
          <table class="table table-bordered table-striped">
            <thead>
              <tr>
                <th> 번호 </th>
                <th> 게시글 제목 </th>
                <th> 작성자 </th>
                <th> 작성시간</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <th>1</th>
                <td>제목</td>
                <td>작성자</td>
                <td>작성시간</td>
              </tr>
              <tr>
                <th>2</th>
                <td>제목</td>
                <td>작성자</td>
                <td>작성시간</td>
              </tr>
              <tr>
                <th>3</th>
                <td>제목</td>
                <td>작성자</td>
                <td>작성시간</td>
              </tr>
            </tbody>
          </table>
        </div>
 
      </div>
    </div>
      <hr>
      <footer>
        <p>&copy; Company 2014</p>
      </footer>
 
  </body>
</html>
cs

[ http://192.168.6.123/signin.php 소스코드 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
// #1 MySQL 접속
$db = mysql_connect( localhost , 'root' , 'password1!' );
if!$db ){
    die('MySQL connect ERROR : ' . mysql_error());
}
// #2 DB 접속
$ret = mysql_select_db'bbs'$db);
if (!$ret) {
    die('MySQL select ERROR : '. mysql_error());
    }
// 세션 사용 선언
session_start();
 
// index.php의 로그인폼에서 보내온 정보를 변수에 저장한다
// user_id 와 user_pw를 POST로 전달받는다
$id = $_POST[user_id];
$pw = $_POST[user_pw];
 
// user테이블에서 입력받은 아이디와 비밀번호가 일치하는 데이터 검색
$sql = "SELECT * FROM user WHERE user_id = '{$id}' and user_pw = md5('{$pw}')";
$resource = mysql_query$sql );
$num = mysql_num_rows$resource );
 
 
$asoc= mysql_fetch_asoc($resource); # 참고 내용 참조
// -> $asoc : Array=( [no]=>사용자 식별번호, [user_id]=>아이디, [user_pw]=>비밀번호, [email]=>이메일 )
 
if$num > 0 ){ // 아이디와 패스워드가 일치하는 데이터가 검색된 경우.
    // session 테이블에서 입력받은 아이디와 일치한 데이터가 있는지 검색한다
    // session 테이블 = 접속해있는 계정을 저장하는 테이블
    $sql = "SELECT * FROM session WHERE user_id = '{$id}'";
    $resource = mysql_query$sql );
    $num = mysql_num_rows$resource );
 
    if ( $num > 0 ){  // session 테이블에 데이터가 존재 = 이미 로그인된 사용자
        echo "<script> alert('이미 로그인 한 사용자입니다 ');</script>";
    }else{
        // 로그인을 아직 안한 사용자, 이제 로그인 됫다!
        // # session 테이블에 사용자 정보를 입력(INSERT)
 
        $sess_id = session_id();         
        // session_id() : 세션번호 반환
        $sql = "INSERT INTO session VALUE( $row[no], '$id','$sess_id')";
        // 사용자 식별번호, 아이디, 세션아이디 값을 세션테이블에 저장시킨다
// 다음 로그인 시 해당 테이블에 데이터 존재유무를 통해 로그인중인지 아닌지 판단한다
        $ret = mysql_query$sql );
 
        // # 세션변수에 데이터 추가
        $_SESSION[user_id] = $id;
        $_SESSION[is_login] = 1;
        // # 로그인 환영 메시지 출력
        echo "<script> alert('로그인 되었습니다');</script>";
    }
}else// user테이블에 입력받은 아이디와 패스워드가 일치하는 데이터가 없다. 
 
    echo "<script> alert('아이디 또는 패스워드가 올바르지 않습니다 ');</script>";
 
}
 
?>
 
 <meta http-equiv='refresh'content="0;url='http://192.168.6.123/index.php'">
 
cs

로그인할 아이디와 패스워드를 전송받는 페이지 ( 올바른 아이디와 비밀번호인지 확인한다 )

#참고 내용

* 테이블에서 가져온 행을 배열로 반환하기

data:     no:사용자번호, user_id:아이디, user_pw:비밀번호, email:이메일 각 열에 대한 데이터들이 저장되어있다


1> mysql_fetch_row(data);

인덱스는 0번부터 ~ n 까지 정수로 지정되며, 순서대로 데이터가 저장되어 배열로 반환된다

2> mysql_fetch_asoc(data);

기존의 key값이 인덱스가 되며 순서대로 데이터가 저장되어 배열로 반환된다


3> mysql_fetch_array

row와 asoc 의 결과를 모두 배열로 반환한다



[ 실행화면 ]

[ 게시판 첫 페이지 ]


[ 로그인 성공 화면 ]


[ 로그인 완료 후 ]


로그인 성공 => 세션값 생성 => 로그인 입력 폼 창 화면출력 x