未定义的索引:使用php会话时

时间:2013-08-22 13:46:59

标签: php

我正在关注本教程:http://www.youtube.com/watch?v=mn0ucCuNOTI

错误的部分是我创建了一个表单,您已使用以下代码登录并且该代码似乎有效:

<?php include_once("db.php"); 
session_start();
?>
<?php
    $user = $_POST['name'];
    $pass = $_POST['pwd'];

     $sql="SELECT count(*) from phplogin WHERE(username='$user' and password='$pass')";

    $query = mysql_query($sql);

    $result = mysql_fetch_array($query);

    if($result[0]>0){
    $_SESSION['username']=$user;
    echo "Successful login!";

    echo "<br /> Welcome " .$_SESSION['username']. "!";
    echo "<br /><a href='signupform.php' > SignUp </a>";
    echo "<br /><a href='signinform.php' > SignIn </a>";
    echo "<br /><a href='logout.php' > LogOut </a>";
    }
    else{
    echo "Login failed!";
    echo "<br /><a href='signupform.php' > SignUp </a>";
    echo "<br /><a href='signinform.php' > SignIn </a>";
    }
?>

在该页面上有一个链接,允许您注销(如果您已登录),点击该链接即可获得以下代码:

<?php
include_once("db.php");
?>
<?php
    session_start(); #starts the session        

    session_unset(); #removes all variables in the session

    session_destroy(); # destroys the session

    if(!$_SESSION['username'])
        echo "Succesfully logged out";  

    else
        echo "Error occurred";  

    ?>

然后当我在localhost上运行时,我得到以下输出:注意:未定义的索引:第12行的C:\ webserver \ apache \ htdocs \ sign_in_up \ logout.php中的用户名

成功退出

3 个答案:

答案 0 :(得分:0)

$ _ SESSION ['username']不存在。检查变量名称是否正确,即UserName userName等...

答案 1 :(得分:0)

这里的脚本存在一些问题。我将首先回答你的具体问题。在logout.php中,您有以下代码块:

session_start(); #starts the session        
session_unset(); #removes all variables in the session
session_destroy(); # destroys the session

if(!$_SESSION['username']) {

在这里开始会话,然后取消设置该会话中的所有变量,然后销毁会话。

  1. 在调用session_destroy()之前,您无需取消会话中的所有变量。它将自动为您取消设置所有变量。

  2. 取消设置或销毁会话后,超级全局数组$_SESSION中不会存在任何键。因此,'username'中的密钥$_SESSION不再存在于您使用它的位置。相反,您可以检查该密钥是否存在:

  3. PHP:

    if (!array_key_exists('username', $_SESSION)) {
        //Successfully logged out.
    } else {
        //Error occurred.
    }
    

    其他问题

    MySql Injection

    正如您的代码目前所代表的那样,它非常容易受到SQL注入攻击。这意味着有人可以传入一个值,这会给你的MySql查询注入恶意或意外后果。

    $user = $_POST['name'];
    $pass = $_POST['pwd'];
    
    $sql="SELECT count(*) from phplogin WHERE(username='$user' and password='$pass')";
    

    在这里,您可以获取服务器接收到的值,并将它们直接插入查询字符串中。但是,如果有人发送$_POST['name'] = "' OR 1=1 --"怎么办?这将使您的查询看起来像这样:

    SELECT count(*) FROM phplogin WHERE (username = '' OR 1=1) --' and password='$pass')
    

    如果你不知道,--是一个SQL注释,意味着忽略了之后的所有内容。实际上,上述查询是:

    SELECT count(*) FROM phplogin WHERE (username = '' OR 1=1)
    

    在这种情况下,他们会收回phplogin表中所有记录的计数,但在更敏感的操作上可能会更糟。例如,如果您的查询是为了登录管理员,该怎么办?未经授权的用户可以使用相同的方法访问管理面板。

    相反,您应该将预准备语句与PDOmysqli_库一起使用。

答案 2 :(得分:0)

而不是

如果(!$ _ SESSION [ '用户名'])

尝试

如果(空($ _ SESSION [ '用户名'))