php - 无法在 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_where
和update
:
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);
}
代码通常运行良好(如果我将这些函数用于其他目的,它会起作用)
解决方案
推荐阅读
- c++ - 如何从类似 SQL 的行中提取所有参数?
- kotlin - 如何在 Kotlin 的 WeakHashMap 上调用“放置”?
- html - 使用 ASP.NET CORE 从选项菜单在数据库中插入数据时出现问题
- node.js - 在 Node.js 应用程序中等待,直到 neo4j 准备就绪:无法执行发现。没有可用的路由服务器
- knockout.js - 如何将项目从淘汰赛 foreach 传递到部分视图作为数据绑定?
- oracle-sqldeveloper - sqldeveloper 将整数插入导出为字符串
- autohotkey - (Autohotkey Excel) 想检查当前单元格值是否为“牛肉干”,然后转到标签A,如果为空(“”)转到标签B
- java - 由于 java 中出现奇怪的较弱访问修饰符错误,我无法覆盖 Externalizable 中的方法
- javascript - 如何动态使两列高度相同
- azure - 更改 AuthenticationScheme 以强制触发另一个 AuthenticationHandler