首页 > 解决方案 > 无法在 cookie 中存储与变量相同的随机字符串

问题描述

我正在尝试将随机生成的字母数字字符串存储到 cookie 中,但 cookie 中设置的值与变量不同。我想知道如何在变量和cookie中存储相同的值。

生成随机字符串的函数

function str_random($len) {
   $result = "";
   $char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
   $array = str_split($char);
   for ($i=0; $i < $len; $i++) {
     $randchar = $array[array_rand($array)]; 
     $result .= $randchar;
   }
   return $result;
 }

在 cookie 中存储随机字符串

$remember_token = str_random(250);
$dbh->update("users", array(":remember_token" => $remember_token, ), array(":id" => $user[0]["id"]));
setcookie("remember", $remember_token, time() + 60*60*24*7);

现在,如果我尝试var_dump将 cookie 值和存储在数据库(或变量)中的值组合起来,它将返回两个不同的字符串:

$result = $dbh->find_where("users", array(":id" => $user[0]["id"]));
var_dump($_COOKIE['remember']);
var_dump($remember_token);
var_dump($result[0]['remember_token']);

"Z0PuJEfjZFy87SDJiw2g6Yj1YrRL1xHQ9MDjr53h6OojzauagoRZinuGocxIrtPwQaZkSqyVOtfxBi0WF9VgFvTZIARCSZLyLACvmzCioFnTUtqt0r4vm33XKxcBpqFaWT1HAsKiQiuYVyDXwP9S7Y2VVxMyDxtQ3420MFM9OGmwprtDmYTnEpZ5U9vXl0QpMuLFdPw994OZcOjeg85bj9JUaYyGsTAjQZiEBULay3nPmyssKGQWJlEEtO" string(250)//for the second line

"J2D1X5GnWgE2T9UX4KtoRque8cqdRaiFifvj5E2r9qNlQoZOLHacatLNKJtIAg1oE51d2Jg8qr14h1a0qK8CjMymk97o23qVVbCcgh3GOPAqJlfU8TXiSZi5cvXmyD2FhXPKZDo2VqwM07GZNaP1JnTnhIcMEEFlLY4XU2JGrGDU66rnv1DuOBWWkwdQlBdzgd4Sbi6laUbNDqIg49s3xRc30su1aS6riZFGPHAlOYWVaLpNnMHBs515o1"//for both the third line and the fourth line

如果我将变量设置$random_token为固定字符串 say foobar,cookie 将存储与数据库相同的值:

$remember_token = "foobar";
$$dbh->update("users", array(":remember_token" => $remember_token, ), array(":id" => $user[0]["id"]));
setcookie("remember", $remember_token, time() + 60*60*24*7);
var_dump($remember_token);
var_dump($_COOKIE["remember"]);

输出:

字符串(6)“foobar”

字符串(6)“foobar”

我怀疑问题出在str_random函数上,它为 cookie 生成的令牌与输入到数据库中的令牌不同。但是,我不知道如何解决它。

有关更多信息,以下是该方法的代码find_whereupdate

public function find_where($tablename, $array) {
    $req = "SELECT * FROM ". $tablename. " WHERE ". str_replace(":", "", key($array)). "=".key($array);
    $smt = $this->conn->prepare($req);
    $smt->execute($array);
    $result = $smt->fetchAll();
    return $result;
}

public function update($tablename, $update, $param) {
    $keys_and_values =$this->format_keys_and_values($update);
    $req = "UPDATE ". $tablename. " SET ". $keys_and_values. " WHERE ". str_replace(":", "", key($param)). "=". key($param);
    $smt = $this->conn->prepare($req);
    $execute = array_merge($update, $param);
    $smt->execute($execute);
}

代码通常运行良好(如果我将这些函数用于其他目的,它会起作用)

标签: phpvariablescookiesrandomsetcookie

解决方案


推荐阅读