这段代码中的setcookie()函数有问题吗?

时间:2019-03-27 22:27:35

标签: php

DB.php函数起作用。唯一的问题是未设置cookie。将$ token输入到setcookie中有什么问题吗? (在'/'之后,我放了.mydomain.com而不是null。)

注意:(。mydomain.com只是填充符,我在那里有我的实​​际域。)

代码来自这里: https://github.com/howCodeORG/Social-Network/blob/Part5/login.php

我尝试过:

  • 删除echo语句(没有echo语句将不会加载)。
  • 更改$ token = bin2hex(openssl_random_pseudo_bytes(64,$ cstrong));至 $ token = bin2hex(random_bytes(64,$ cstrong));(cookie仍未设置)
  • 我用w3schools的示例进行了测试,然后设置了cookie(因此,它不是我的浏览器)。
<?php
include('classes/DB.php');
if (isset($_POST['login'])) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        if (DB::query('SELECT username FROM users WHERE username=:username', array(':username'=>$username))) {
                if (password_verify($password, DB::query('SELECT password FROM users WHERE username=:username', array(':username'=>$username))[0]['password'])) {
                        echo 'Logged in!';
                        $cstrong = True;
                        $token = bin2hex(openssl_random_pseudo_bytes(64, $cstrong));
                        $user_id = DB::query('SELECT id FROM users WHERE username=:username', array(':username'=>$username))[0]['id'];
                        DB::query('INSERT INTO login_tokens VALUES (\'\', :token, :user_id)', array(':token'=>sha1($token), ':user_id'=>$user_id));
                        setcookie("SNID", $token, time() + 60 * 60 * 24 * 7, '/', .mydomain.com, TRUE, TRUE);
                } else {
                        echo 'Incorrect Password!';
                }
        } else {
                echo 'User not registered!';
        }
}
?>
<h1>Login to your account</h1>
<form action="login.php" method="post">
<input type="text" name="username" value="" placeholder="Username ..."><p />
<input type="password" name="password" value="" placeholder="Password ..."><p />
<input type="submit" name="login" value="Login">
</form>

1 个答案:

答案 0 :(得分:2)

setcookie 必须在脚本的任何输出之前发生,因为它依赖于发送标头来设置cookie。来自manual

  

与其他标题一样,必须先发送Cookie,然后才能发送   脚本(这是协议限制)。这需要你放置   在任何输出(包括和   标签以及任何空白。

在您的代码中,调用echo 'Logged in!';之前有setcookie,这将阻止它工作。