안녕하세요. 테디입니다.
제가 문제를 해결한 과정 전체를 알려드리는 것이 좋을 것 같습니다.
여러분이 가지고 있는 문제는 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';
?>
** 추가적인 조언
** 회원가입시 패스워드를 암호화하여 저장하는 것은 필수입니다.
'Hokma Developer School :: Course 1' 카테고리의 다른 글
[Git 기초 사용법] 4. Git을 이용한 협업 / GitHub Pull Request (0) | 2024.09.27 |
---|---|
[Git 기초 사용법] 3. GitHub 이용하기 (0) | 2024.09.27 |
[Git 기초 사용법] 2. Branch (0) | 2024.09.27 |
[Git 기초 사용법] 1. Git 시작 (0) | 2024.09.27 |
Hokma Developer School :: Course 1 (2) | 2024.09.11 |