0

嗨,我正在尝试开发一个登录系统,但我似乎遇到了一个错误。这是我的代码:

//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';  
?>  
4

2 回答 2

3

在将某些内容存储到会话中之前,该变量$_SESSION['signed_in']将为空。出现警告是因为您要求此值,但里面什么都没有。

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

为避免警告,您应该首先检查变量是否存在,然后您可以从中读取。当然这有点麻烦,所以大多数开发人员创建一个函数只是为了安全地从数组中读取。

编辑:

实际上上面的问题会导致另一条消息......

Notice: Undefined index: ...

...正如 Mob 所说,变量 $_SESSION 根本不存在,因为没有启动会话。我会让这个答案留下来,因为这将是下一个陷阱。

于 2012-10-17T11:09:57.003 回答
2

没有session_start();这就是原因,您必须始终在 PHP 中使用会话之前声明这一点。

于 2012-10-17T09:49:47.607 回答