Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在何处存储具有cookie且无会话的用户的用户ID(记住我)_Php_Session - Fatal编程技术网

Php 在何处存储具有cookie且无会话的用户的用户ID(记住我)

Php 在何处存储具有cookie且无会话的用户的用户ID(记住我),php,session,Php,Session,我读了很多关于这件事的问题,讨论和回答都不一样 我需要有用户ID,以便从DB检索他的数据,并使用此数据创建会话,以便创建连续登录 散列会话: function createNewUserSession($uid, $email, $salt){ $session_key = $email.$salt; $options = [ 'cost' => 11 ]; $session_key = password_hash($session_key,

我读了很多关于这件事的问题,讨论和回答都不一样

我需要有用户ID,以便从DB检索他的数据,并使用此数据创建会话,以便创建连续登录

散列会话:

function createNewUserSession($uid, $email, $salt){
    $session_key = $email.$salt;
    $options = [
        'cost' => 11
    ];
    $session_key = password_hash($session_key, PASSWORD_BCRYPT, $options);
    $connect = mysqliConnect();

    $query = "UPDATE `users` SET";
    $query .= " session_key = '$session_key'";
    $query .= " WHERE id = '$uid'";
    mysqli_query($connect, $query);

    return $session_key;
}

function generateRandomString($length) {
        return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+|"}?><~', ceil($length/strlen($x)) )),1,$length);
}

    $user_session_salt = generateRandomString(32);

    if (isset($_COOKIE['sk'])) {
        if (password_verify($email.$_COOKIE['sk'], $session_key)) {
        // Creating Sessions
        $_SESSION['uid'] = $uid;
        $_SESSION['fName'] = $fName;
        $_SESSION['lName'] = $lName;
        } else {
            // Creating New Sessions
            createNewUserSession($uid, $email, $user_session_salt);
            $_SESSION['uid'] = $uid;
            $_SESSION['fName'] = $fName;
            $_SESSION['lName'] = $lName;

            // Creating Cookies
            setcookie("sk", $user_session_salt, time() + (90 * 24 * 60 * 60), '/', '.mywebsite.io');
        }
    }

我知道这并不完美,但我仍在学习,需要在这方面提供足够的信息。

警告:使用
mysqli
时,您应该使用and将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。切勿将
$\u POST
$\u GET
或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。注意:
mysqli
的面向对象界面明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的
mysql\u查询
接口混淆。在你对程序性风格投入太多之前,值得换一种。示例:
$db=new mysqli(…)
$db->prepare(“…”)
过程接口是PHP 4时代的产物,当时引入了
mysqli
API,不应在新代码中使用。警告:编写自己的访问控制层并不容易,而且有很多机会使它严重出错。请不要写你自己的认证系统,当任何一个现代的都有一个坚固的内置。完美,我将要克服程序风格反正你刚才推我重新考虑它。不过,我在这个小项目上的时间有点短,我相信重构代码需要相当长的时间。感谢您的建议。已接受,再次感谢:)
function restoreSession($uid) {
    $connect = mysqliConnect();

    $query = "SELECT * FROM `users` WHERE id = '$uid'";
    $result = mysqli_query($connect, $query);

    if (mysqli_num_rows($result) == 1) {
        $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
        $uid = $row['id'];
        $email = $row['email'];
        $fName = $row['first_name'];
        $lName = $row['last_name'];
        $session_key = $row['session_key'];

        if (isset($_COOKIE['sk']) && !isset($_SESSION['uid'])) {

            $user_salt = $_COOKIE['sk'];

            if (password_verify($email.$user_salt, $session_key)) {
                // Creating Sessions
                $_SESSION['uid'] = $uid;
                $_SESSION['fName'] = $fName;
                $_SESSION['lName'] = $lName;
            }
        }
    }
}