0

我正在关注本教程: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";  

    ?>

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

成功登出

4

3 回答 3

0

代替

if(!$_SESSION['用户名'])

尝试

如果(空($_SESSION['用户名']))

于 2014-08-19T21:08:29.623 回答
0

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

于 2013-08-22T13:49:49.423 回答
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您使用它的地方。相反,您可以检查该密钥是否存在:

PHP:

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

其他问题

MySql 注入

就您的代码目前而言,它极易受到 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_库一起使用。

于 2013-08-22T13:58:13.303 回答