R's Hacking Daily Log

php - Mini Project 1 - (3) 본문

PHP

php - Mini Project 1 - (3)

hanhxx 2023. 7. 31. 15:53

[ Mini Project - last ]

지금까지 진행한 내용을 보면 메인 페이지인 index.php와 데이터베이스 연결을 위한 dbconn.php를 만들어보았다. 

index.php에서는 크게 LOGIN & REGISTER 기능을 제공하는 데

그중에서도 LOGIN 과정에 필요한 코드를 먼저 살펴볼 예정이다!

 

index.php에서 LOGIN 버튼을 누르면 login_check.php가 실행된다는 걸 확인한 바 있다.

따라서 이번에 작성해야 하는 코드가 바로 login_check.php라는 것!! 그럼 바로 코드를 살펴보자

 


[ login_check.php ]

<?php
include('./dbconn.php');


$mb_id = trim($_POST['mb_id']);
$mb_password = trim($_POST['mb_password']);

if(!$mb_id || !$mb_password) {
    echo "<script>alert('you have to enter id & password');</script>";
    echo "<script>location.replace('./index.php');</script>"; 
    exit();
}

$sql = "SELECT * FROM member WHERE mb_id = '$mb_id'";
$result = mysqli_query($conn, $sql);
$mb = mysqli_fetch_assoc($result);


$sql = "SELECT PASSWORD('$mb_password') AS pass";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
$password = $row['pass'];

if(!$mb['mb_id'] || !($password == $mb['mb_password'])) {
    echo "<script>alert('incorrect Credential');</script>";
    echo "<script>location.replace('./index.php');</script>";
    exit();
}

$_SESSION['ss_mb_id'] = $mb_id;

mysqli_close($conn);

if(isset($_SESSION['ss_mb_id'])) {
    echo "<script>alert('login successful');</script>";
    echo "<script>location.replace('./member_list.php');</script>";
}
?>

login_check.php 코드는 위와 같다.

 

이 코드는 메인 페이지에서 ID & PASSWORD을 입력하고 LOGIN 버튼을 누르면 실행됨으로써

(1) 입력된 ID가 데이터베이스에 존재하는지

(2) ID & PASSWORD가 일치하는 지의 여부를 확인하는 과정이 수행되어야 한다.

 


 

[ 코드 설명 ]

<?php
include('./dbconn.php');

 

index.php에서와 동일하게 dbconn.php code를 include 한다.

 

 

$mb_id = trim($_POST['mb_id']);
$mb_password = trim($_POST['mb_password']);

index.php 코드를 분석해 보면 알겠지만 

mb_id & mb_password는 ID & PASSWORD input tag의 name 값이다. 

 

mb_id & mb_password를 key 값으로 삼아 글로벌 변수 $_POST에서 id & password 값을 가져온다. 

* trim() : 인수로 전달된 값의 앞, 뒤 공백을 제거하는 함수이다.

 

 

if(!$mb_id || !$mb_password) {
    echo "<script>alert('you have to enter id & password');</script>";
    echo "<script>location.replace('./index.php');</script>"; 
    exit();
}

현재까지는 index.php에서 입력한 값을 $_POST에서 가져온 것뿐이라 

계정 정보에 대한 검사를 진행해야 한다. 

 

첫 번째 if문에서는 mb_id & mb_password 둘 중 하나라도 공백이라면

ID & Password를 입력해야 한다는 문구를 출력하고 index.php로 이동한다.

 

mb_id & mb_password가 공백이 아니라고 할 때, 이후의 코드가 실행된다.

 

 

첫 번째 sql )

$sql = "SELECT * FROM member WHERE mb_id = '$mb_id'";
$result = mysqli_query($conn, $sql);
$mb = mysqli_fetch_assoc($result);

 

사용자가 로그인할 때 입력한 id가 존재하는지 조회하는 sql문을 작성한다. 
mysqli_query() 함수로 DB에 연결한 뒤 query를 실행하고 query 결과를 $result에 할당하고 있다.

 

result에 해당하는 row를 연관 배열 형태로 데이터베이스에서 가져온다. 

결과적으로 $mb는 member 정보를 연관 배열 형태로 가지게 된다. 

 

* mysqli_fetch_assoc() : 전달된 인수에 해당하는 row를 연관 배열 형태로 반환한다. 

 

# $mb 값 예시
$mb = [
    "mb_id" => "상어밥", 
    "mb_password" => "sharkBOB", 
    "mb_email" => "sharck@email.com", 
    "mb_gender" => "fish^_^"
];

 

 

두 번째 sql ) 

$sql = "SELECT PASSWORD('$mb_password') AS pass";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
$password = $row['pass'];

사용자가 로그인할 때 입력한 password 값으로 password()를 수행한다. 

* password() : 전달한 인수로 hash 값을 생성하는 함수 

데이터베이스 연결 후 해당 sql을 실행한 결과를 $result에 할당하고 이번에도 result 값을 연관 배열 형태로 가져온다.

연관 배열에서 key가 pass인 값을 password에 할당한다.

 

결국 두 번째 sql문의 목적은 사용자가 입력한 비밀번호를 데이터베이스에서 확인하는 것이다.

 

 

 

if(!$mb['mb_id'] || !($password == $mb['mb_password'])) {
    echo "<script>alert('incorrect Credential');</script>";
    echo "<script>location.replace('./index.php');</script>";
    exit();
}

(1) 사용자가 입력한 비밀번호와 데이터 베이스에서 찾은 비밀번호가 일치하지 않거나

(2) 사용자가 입력한 아이디가 데이터베이스에 존재하지 않는다면 

 

아이디는 존재하지만 비밀번호가 틀렸거나 아이디를 잘못 입력한 경우이기 때문에

로그인에 실패하고 index.php로 이동하게 되는 흐름이다.

 

 

$_SESSION['ss_mb_id'] = $mb_id;

mysqli_close($conn);

if(isset($_SESSION['ss_mb_id'])) {
    echo "<script>alert('login successful');</script>";
    echo "<script>location.replace('./member_list.php');</script>";
}
?>

두 번째 if문을 문제없이 통과했다면 로그인에 성공한 것이기 때문에

mb_id로 session을 만들고 더 이상 필요 없는 DB connection을 끊어준다.

 

마지막으로 session이 제대로 생성되었는지 확인 후, member_list.php로 이동하게 된다. 

 

* mysqli_close() : dbconn.php에서 데이터 베이스에 연결한 걸 종료하기 위해 사용하는 함수 

* isset() : 인수로 전달된 변수에 값이 할당되어 있는지 확인하는 함수 

* alert() : js에서 팝업 창을 띄우기 위해 사용하는 함수

* location.replace() : 인수로 전달한 경로로 페이지를 이동시켜 주는 함수

 


[ 결과 화면 ]

index.php에서 ID & PASSWORD를 공백인 상태로 Login 버튼을 누르는 경우

 

 

첫 번째 if문에서 <script> 내용을 실행시키게 된다.

 

 

ID & PASSWORD를 아무거나 입력하고 Login 버튼을 누르는 경우에는 (현재 그 어떤 계정도 등록되어있지 않음)

 

 

ID & PASSWORD는 입력했지만 잘못된 값이기 때문에

두 번째 if문에서 <script>를 실행시키게 된다!

 


 

지금까지 login_check.php 코드에 대해 살펴보았다!

 

앞에서도 얘기했지만 index.php에서 로그인을 시도할 때 실행되는 코드로 입력한 계정 정보가

유효하다면 성공적으로 로그인할 수 있을 것이다.

 

로그인에 성공한 후에는 코드에서 볼 수 있듯이 "member_list.php"로 이동할 것!

이로써 next step이 한 가지 추가되었다!!

 


[ Next ]

(1) dbconn.php -  완료! 

(2) login_check.php -  완료! 

(3) register.php

(4) member_list.php

'PHP' 카테고리의 다른 글

php - Mini Project 1 - (5)  (0) 2023.08.02
php - Mini Project 1 - (4)  (0) 2023.08.01
php - Mini Project 1 - (2)  (1) 2023.07.31
php - Mini Project 1 - (1)  (0) 2023.07.30
php - File Upload (3)  (0) 2023.07.26
Comments