내 로그인 페이지로 전달되지 않는 PHP 세션 변수는 있지만 세션 ID는 다음과 같습니다.

StackOverflow https://stackoverflow.com/questions/415005

문제

사용 중입니다 PHP 4.3.9, Apache/2.0.52

로그인 된 로그인 시스템을 사용하려고합니다. 로그인 한 후에는 DB 값을 등록하는 세션에서 로그인 한 일단 로그인 시스템을 사용하려고합니다. 리디렉션되면 세션 변수를 잃고 있습니다.

다음 코드를 사용하여 로그인 양식 페이지와 리디렉션 된 페이지에서 세션 ID/값을 인쇄합니다.

echo '<font color="red">session id:</font> ' . session_id() . '<br>';
echo '<font color="red">session first name:</font> ' . $_SESSION['first_name'] . '<br>';
echo '<font color="red">session user id:</font> ' . $_SESSION['user_id'] . '<br>';
echo '<font color="red">session user level:</font> ' . $_SESSION['user_level'] . '<br><br>';

이것은 로그인 페이지에서 내 브라우저에 인쇄 된 내용입니다 (로그인 페이지에 헤더 리디렉션을 주석으로 댓글을 달았습니다). 이것은 내 DB에서 나오는 올바른 정보 이므로이 시점에서 모든 것이 괜찮습니다..

session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name: elvis
session user id: 2
session user level: 1

이것은 내 리디렉션/로그인 페이지에 인쇄 된 내용입니다 (헤더/리디렉션을 무책임 할 때). 세션 ID는 동일합니다, 그러나 개별 세션 변수에 대한 값은 얻지 못합니다.

session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name:
session user id:
session user level:

다음 오류가 발생합니다.

정의되지 않은 색인 : First_Name
정의되지 않은 색인 : user_id
정의되지 않은 색인 : user_level

나는 글로벌이 있습니다 header.php 로그인 한 채로 전화하지 않은 파일로 loggedout.php는 세션을 토스트하기 위해 :) :

header.php

<?php
ob_start();
session_start();

//if NOT on loggedout.php, check for cookie. if exists, they haven't explicity logged out so take user to loggedin.php
if (!strpos($_SERVER['PHP_SELF'], 'loggedout.php')) {
    /*if (isset($_COOKIE['access'])) {
        header('Location: www.mydomain.com/loggedin.php');
    }*/
} else {
    //if on loggedout.php delete cookie
    //setcookie('access', '', time()-3600);

    //destroy session
    $_SESSION = array();
    session_destroy();
    setcookie(session_name(), '', time()-3600);
}

//defines constants and sets up custom error handler
require_once('config.php');

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

some page layout stuff

Login portion is eventually called via include

footer stuff

나의 logged.php 세션을 시작하는 것 외에는 아무것도하지 않습니다

<?php
session_start();
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

그만큼 내 로그인 스크립트의 논리, 핵심 부분은 DB 결과를 $ _session으로 바로 가져 오는 것입니다 (약 절반이 아래로) :

if (isset($_POST['login'])) {
        //access db
        require_once(MYSQL);

        //initialize an errors array for non-filled out form fields
        $errors = array();

        //setup $_POST aliases, clean for db and trim any whitespace
        $email  = mysql_real_escape_string(trim($_POST['email']), $dbc);
        $pass   = mysql_real_escape_string(trim($_POST['pass']), $dbc);

        if (empty($email)) {
            $errors[] = 'Please enter your e-mail address.';
        }

        if (empty($pass)) {
            $errors[] = 'Please enter your password.';
        }

        //if all fields filled out and everything is OK
        if (empty($errors)) {
            //check db for a match
            $query = "SELECT user_id, first_name, user_level 
                    FROM the rest of my sql here, blah blah blah";

            $result = @mysql_query($query, $dbc) 
                OR trigger_error("Query: $query\n<br />MySQL Error: " . mysql_error($dbc));

            if (@mysql_num_rows($result) == 1) { //a match was made, OK to login

                //register the retrieved values into $_SESSION
                $_SESSION = mysql_fetch_array($result);
                mysql_free_result($result);
                mysql_close($dbc);
                /*              
                setcookie('access'); //if "remember me" not checked, session cookie, expires when browser closes
                                     //in FF you must close the tab before quitting/relaunching, otherwise cookie persists

                //"remember me" checked?
                if(isset($_POST['remember'])){ //expire in 1 hour (3600 = 60 seconds * 60 minutes)
                    setcookie('access', md5(uniqid(rand())), time()+60); //EXPIRES IN ONE MINUTE FOR TESTING
                }
                */

echo '<font color="red">cookie:</font> ' . print_r($_COOKIE) . '<br><br>';
echo '<font color="red">session id:</font> ' . session_id() . '<br>';
echo '<font color="red">session first name:</font> ' . $_SESSION['first_name'] . '<br>';
echo '<font color="red">session user id:</font> ' . $_SESSION['user_id'] . '<br>';
echo '<font color="red">session user level:</font> ' . $_SESSION['user_level'] . '<br><br>';

                ob_end_clean();
                session_write_close();

                $url = BASE_URL . 'loggedin_test2.php';
                header("Location: $url");
                exit();
            } else {
            //wrong username/password combo
            echo '<div id="errors"><span>Either the e-mail address or password entered is incorrect or you have not activated your account. Please try again.</span></div>';
            }

            //clear $_POST so the form isn't sticky
            $_POST = array();
        } else { 
        //report the errors
        echo '<div id="errors"><span>The following error(s) occurred:</span>';

            echo '<ul>';
            foreach($errors as $error) {
                echo "<li>$error</li>";
            }
            echo '</ul></div>';
        }

    } // end isset($_POST['login'])

로그인 페이지에서 헤더 리디렉션을 주석에 댓글을 달면 DB의 올바른 정보로 $ _session 변수를 반영 할 수 있습니다. 그러나 로그인 페이지로 리디렉션되면 사라지거나 설정하지 않습니다.

누구든지 아이디어가 있습니까? 나는 거의 하루 종일 이것에 대해 보냈고 내가 그것을 알아내는 데 더 가까이 다가 갈 수는 없다.

BTW, 나는 최근에 2 개의 간단한 테스트 페이지를 만들었고, 하나는 세션을 시작했고, 일부 변수를 설정하고, 세션 vars를 읽거나 출력하는 것 외에는 아무것도하지 않는 두 번째 페이지로 리디렉션 된 양식 제출을 받았습니다. 그것은 모두 잘 작동하는 것 같습니다. 나는 기본 앱에서 내가하고있는 일에 문제가 있습니다.

도움이 되었습니까?

해결책

나는 보이지 않는다 session_start() 로그인 스크립트에서. 세션을 시작하지 않으면 PHP가 귀하가 배치 한 데이터를 절약 할 것이라고 생각하지 않습니다. $_SESSION 정렬. 또한 안전하기 위해 나는 명시 적으로 변수를 $_SESSION 모든 것을 덮어 쓰는 대신 배열 $_SESSION = mysql_fetch_array($result);.

다른 팁

시도해보십시오

session_regenerate_id(true); 

전에

session_write_close();

또한. 로그인 스크립트를 수행하는 가장 좋은 방법은 다음과 같습니다.

사용자가 액세스하려는 메인 페이지 내에서 로그인 로직을 처리하도록하십시오.

  1. 사용자가 인증되지 않으면 로그인 페이지로 다시 던져집니다.
  2. 사용자가 인증을 받으면 $ _session [ "Auth"] 또는 무언가를받습니다.
  3. 그런 다음 사용자가 메인 페이지 또는 인증이 필요한 기타 페이지를 탐색 할 때 $ _session [ "Auth"]가 설정되어 있는지 확인하십시오.

그러면 리디렉션 직전에 세션이 저장되지 않는 문제가 없습니다.

... 다른 답변에 추가 할 수 있습니다. Session_start ()는 스크립트의 첫 번째 시작 부분에 배치되지 않으면 때때로 실패하거나 이상한 것들이 발생합니다. 헤더 스크립트에서 시도해보십시오.

대신에

<?php
ob_start();
session_start();

놓다

<?php
session_start();
ob_start();

나는 이것을 발견했을 때 비슷한 문제가있었습니다.

http://www.w3schools.com/php/php_sessions.asp

session_start ()를 넣어야합니다. HTML 태그 전에

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top