簡體   English   中英

登錄系統中的未定義變量會話

[英]Undefined variable session in a login system

嗨,我正在嘗試開發一個登錄系統,但是在某種情況下我似乎遇到了錯誤。這是我的代碼:

//header.php



                   if($_SESSION['signed_in']){  
                        echo 'Hello' . $_SESSION['user_name'] . '. Not you? <a href="signout.php">Sign out</a>';  
                    }  
                    else{  
                        echo '<a href="signin.php">Sign in</a> or <a href="sign up">create an account</a>.';  
                    }   

//Signin.php
                   if(mysql_num_rows($result) == 0) 
                    { 
                        echo 'You have supplied a wrong user/password combination. Please try again.'; 
                    } 
                    else 
                    { 
                        //set the $_SESSION['signed_in'] variable to TRUE 
                        $_SESSION['signed_in'] = true; 
                        //we also put the user_id and user_name values in the $_SESSION, so we can use it at various pages 
                        while($row = mysql_fetch_assoc($result)) 
                        { 
                            $_SESSION['user_id']    = $row['user_id']; 
                            $_SESSION['user_name']  = $row['user_name']; 
                            $_SESSION['user_level'] = $row['user_level']; 
                        } 
                        echo 'Welcome, ' . $_SESSION['user_name'] . '. <a href="index.php">Proceed to the forum overview</a>.'; 
                    } 

該錯誤指向第一個條件:if($ _ SESSION ['signed_in']),它表示:

注意:未定義的變量:第21行的C:\\ xampp \\ htdocs \\ Tutorials \\ Forum \\ header.php中的_SESSION

我如何才能做到這一點?

編輯 :session_start()包含在doctype的header.php文件的頂部,而header.php包含在Signin.php中

完整代碼:

header.php

    <?php
        session_start();
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">  
    <head>  
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
        <meta name="description" content="A short description." />  
        <meta name="keywords" content="put, keywords, here" />  
        <title>PHP-MySQL forum</title>  
        <link rel="stylesheet" href="css/style.css" type="text/css">  
    </head>  
    <body>  
    <h1>My forum</h1>  
        <div id="wrapper">  
        <div id="menu">  
            <a class="item" href="/forum/index.php">Home</a> -  
            <a class="item" href="/forum/create_topic.php">Create a topic</a> -  
            <a class="item" href="/forum/create_cat.php">Create a category</a>  
            <div id="userbar">  
            <div id="userbar">
                <?php 
                    if($_SESSION['signed_in']){  
                        echo 'Hello' . $_SESSION['user_name'] . '. Not you? <a href="signout.php">Sign out</a>';  
                    }  
                    else{  
                        echo '<a href="signin.php">Sign in</a> or <a href="sign up">create an account</a>.';  
                    }  
                ?>
            </div>  
        </div>  
            <div id="content">  

Signin.php

<?php  
//signin.php  
include 'conn.php';  
include 'header.php';  
echo '<h3>Sign in</h3>';  
//first, check if the user is already signed in. If that is the case, there is no need to display this page  
if(isset($_SESSION['signed_in']) && $_SESSION['signed_in'] == true)  
{  
    echo 'You are already signed in, you can <a href="signout.php">sign out</a> if you want.';  
}  
else  
{  
    if($_SERVER['REQUEST_METHOD'] != 'POST')  
    {  
        /*the form hasn't been posted yet, display it 
          note that the action="" will cause the form to post to the same page it is on */  
        echo '<form method="post" action="">  
            Username: <input type="text" name="user_name" />  
            Password: <input type="password" name="user_pass">  
            <input type="submit" value="Sign in" />  
         </form>'; 
    } 
    else 
    { 
        /* so, the form has been posted, we'll process the data in three steps:  
            1.  Check the data  
            2.  Let the user refill the wrong fields (if necessary)  
            3.  Varify if the data is correct and return the correct response  
        */  
        $errors = array(); /* declare the array for later use */  
        if(!isset($_POST['user_name']))  
        {  
            $errors[] = 'The username field must not be empty.';  
        }  
        if(!isset($_POST['user_pass']))  
        {  
            $errors[] = 'The password field must not be empty.';  
        }  
        if(!empty($errors)) /*check for an empty array, if there are errors, they're in this array (note the ! operator)*/  
        {  
            echo 'Uh-oh.. a couple of fields are not filled in correctly..'; 
            echo '<ul>'; 
            foreach($errors as $key => $value) /* walk through the array so all the errors get displayed */ 
            { 
                echo '<li>' . $value . '</li>'; /* this generates a nice error list */ 
            } 
            echo '</ul>'; 
        } 
        else 
        { 
            //the form has been posted without errors, so save it 
            //notice the use of mysql_real_escape_string, keep everything safe! 
            //also notice the sha1 function which hashes the password 
            $sql = "SELECT 
                        user_id, 
                        user_name, 
                        user_level 
                    FROM 
                        users 
                    WHERE 
                        user_name = '" . mysql_real_escape_string($_POST['user_name']) . "' 
                    AND 
                        user_pass = '" . sha1($_POST['user_pass']) . "'";  
            $result = mysql_query($sql);  
            if(!$result)  
            {  
                //something went wrong, display the error  
                echo 'Something went wrong while signing in. Please try again later.'; 
                //echo mysql_error(); //debugging purposes, uncomment when needed 
            } 
            else 
            { 
                //the query was successfully executed, there are 2 possibilities 
                //1. the query returned data, the user can be signed in 
                //2. the query returned an empty result set, the credentials were wrong 
                if(mysql_num_rows($result) == 0) 
                { 
                    echo 'You have supplied a wrong user/password combination. Please try again.'; 
                } 
                else 
                { 
                    //set the $_SESSION['signed_in'] variable to TRUE 
                    $_SESSION['signed_in'] = true; 
                    //we also put the user_id and user_name values in the $_SESSION, so we can use it at various pages 
                    while($row = mysql_fetch_assoc($result)) 
                    { 
                        $_SESSION['user_id']    = $row['user_id']; 
                        $_SESSION['user_name']  = $row['user_name']; 
                        $_SESSION['user_level'] = $row['user_level']; 
                    } 
                    echo 'Welcome, ' . $_SESSION['user_name'] . '. <a href="index.php">Proceed to the forum overview</a>.'; 
                } 
            } 
        } 
    } 
} 


include 'footer.php';  
?>  

沒有session_start(); 這就是原因,您必須始終使用PHP中的會話聲明該befoe。

在將內容存儲到會話中之前,變量$_SESSION['signed_in']將為空。 發生警告是因為您要求此值,但里面什么也沒有。

if (isset($_SESSION['signed_in']) && $_SESSION['signed_in'])
{
}

為了避免警告,您應該首先檢查變量是否存在,然后才能從中讀取。 當然,這有點麻煩,因此大多數開發人員都創建了一個僅用於從數組安全讀取的函數。

編輯:

實際上,上述問題會導致另一條消息...

Notice: Undefined index: ...

就像Mob所說的那樣,變量$ _SESSION根本不存在,因為沒有會話開始。 我將保留這個答案,因為這將是下一個陷阱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM