Hokma Developer School :: Course 1

PHP Session

테디아저씨 2024. 8. 11. 14:46

안녕하세요. 테디입니다.

제가 문제를 해결한 과정 전체를 알려드리는 것이 좋을 것 같습니다.

 

여러분이 가지고 있는 문제는 main.php 에서는 세션에 오류가 발생하고, 나머지는 이상이 없었다는 것입니다.

로그인을 해도 세션의 데이터가 확인되지 않는걸 보면 처음부터 세션이 저장되지 않았던 것 같습니다.

 

그래서 확인을 위해 오류가 출력되도록 수정해봤습니다.

 

<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
?>

 

 

1.  session 이 저장되는 디렉토리 권한 문제

 

저의 경우는

 

Warning: session_start(): open(/var/lib/php/session/sess_cqbcl24913ib0ibk9fcvkd8ol5, O_RDWR) failed: Permission denied (13) in /home/hss/www/login.php on line 4

 

이러한 에러가 발생했어요. 즉, 세션이 사용할 디렉토리에 권한이 없다는 의미입니다.

 

그래서 확인을 위해 

<?php
phpinfo();
?>

 

 

 

이 디렉토리에 권한이 없다는 의미입니다.

 

1. 해당 디렉토리가 있는지 확인을 합니다.

2. 해당 디렉토리에 쓰기 권한이 있는지 확인을 합니다.

 

저의 경우는 리눅스서버인데 해당 디렉토리에 

 

chmod 777 /var/lib/php/session

 

이렇게 권한을 주고 오류가 없어졌어요.

 

 

2. main.php 에서 세션을 출력해 봤지만 나타나지 않았습니다.

    <div class="box">
    Hello, <?php echo $_SESSION['username'];?>
    </div>

 

 

** 그래서 세션이 정상적으로 저장되지 않았다는 것을 알았습니다.

 

2.  session_start() 와  session 저장은 어떠한 출력도 하기 이전에 

 

main.php 를 보면 html 코드가 먼저나오고,  세션을 저장하려고 했어요.

 

<!DOCTYPE html>
<html lang="en">
<head>
....
</head>
<body>
<div class="box-form">
  ....
</div>

<?php 
include 'db_connection.php';
$_SESSION['username'] = $row['m_name']; 

?>

 

위 처럼 html 이든 <? echo "any..." ?> 든 어떤한 출력이 하나라도 있으면 세션은 생성되지 않습니다.

아래 처럼 세션을 처리하는 부분을 윗쪽에 두어야 합니다.

 

<?php 
session_start();
include 'db_connection.php';

//로그인을 처리하는  부분
if( ... ) {
	$_SESSION['username'] = $row['m_name']; 
}

// 아래에 html 부분을 두어야 합니다.
?>
<!DOCTYPE html>
<html lang="en">
<head>
....
</head>
<body>
<div class="box-form">
  ....
</div>

 

( 또는 login.php 는 html 과 form 부분만 두고 login_proc.php 와 같이 별도의 파일을 만들어 세션을 저장할 수도 있습니다. )

 

 

 

 

main.php 도 역시 맨위에 session_start(); 로 시작하게 해주세요.

 

<?php 
session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dashboard</title>
    <link rel="stylesheet" type="text/css" href="./css/main.css">
    <style>

 

 

3.  이렇게 하니까 정상적으로 로그인 되었고, 세션데이터도 보이네요.

 

 

 

 

이렇게 하는 경우 여러분처럼 에러 메세지를 보여줄수가 없는데요.

ajax 를 사용하여 결과를 받아와 스크립트로 처리하는 방법이 좋습니다.

 

 

    if ($result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $_SESSION['username'] = $row['m_name'];
        $_SESSION['role'] = $row['m_role'];
        
        // Check if the user login data already exists in the login table
        $checkLoginSQL = "SELECT * FROM login WHERE l_username='$username'";
        $checkLoginResult = $conn->query($checkLoginSQL);
        
        if ($checkLoginResult->num_rows == 0) {
            // Insert login data into the login table
            $insertLoginSQL = "INSERT INTO login (l_username, l_password) VALUES ('$username', '$password')";
            $conn->query($insertLoginSQL);
        }
        
        // Redirect based on user role
        if ($row['m_role'] == '0') {
            header("Location: main.php?page=dashboard");
        } elseif ($row['m_role'] == '1') {
            header("Location: main.php?page=dashboard");
        }
        exit(); // Always exit after a header redirection
    } else {
    	// not working
        // 이부분이 작동하지 않겠지요. html 부분이 없으니까요.
        echo "<script>showError('Invalid username or password');</script>";
    }

 

ajax 를 사용하여 페이지의 변화없이 세션을 저장하고

 

1) 오류 메세지가 있을때는 자바스크립트로 화면에 에러 메세지를 보여주세요

2) 정상처리 되었을경우에 페이지를 이동시키세요.

 

 

 

4.  여러분이 이렇게 하시면 좋을 것 같습니다.

 

모든 페이지 첫번째줄에 공통적으로 include  할 파일을 하나 만드세요.

보통 common.php 와 같은 이름을 많이 씁니다.

 

common.php

<?php
session_start();

// 중요한 상수나 변수 설정등을 여기서 하면 좋습니다.

include 'db_connection.php';
?>

 

 

그리고 모든 파일에서는 맨윗줄에 이 파일을 include 하세요.

main.php 나 login.php 에서 도 동일하게 맨위에서 include 하세요.

<?php
include 'common.php';
?>

OR 

<?php
include_once 'common.php';
?>

 

 

** 추가적인 조언

** 회원가입시 패스워드를 암호화하여 저장하는 것은 필수입니다.