如何阻止uniqid()在PHP表单中重新生成
如何阻止uniqid()在PHP表单中重新生成
我想为用户生成一个随机密钥,在注册过程中使用。代码将生成的密钥与用户输入进行比较,但当用户提交表单时,密钥会被重新生成,所以它们永远不会相同。我尝试通过检查生成器函数是否已经生成来保护它,但没有成功。然后,我还尝试使用会话,但也没有成功。以下代码总是生成“失败”而不是“成功”:
编辑:根据您的评论进行了一些更正。
session_start();
$_SESSION['key'] = randomKey();
$key1 = $_SESSION['key'];
error_reporting(E_ALL);
ini_set('display_errors', 1);
function randomKey() {
if (empty($_SESSION['key'])) {
$key = uniqid();
$_SESSION['key'] = $key;
return $key;
} else {
return $_SESSION['key'];
}
}
if(isset($_POST['submit']))
{
$input = $_POST['inputKey'];
if (strcmp($input,$_SESSION['key']) == 0) {
echo '成功';
} else {
echo '失败';
}
}
?>
这个问题的原因是uniqid()函数在每次调用时都会生成一个新的随机码,导致在同一个表单中重复使用uniqid()函数时会生成不同的随机码。为了解决这个问题,可以将表单提交到另一个页面,通过隐藏字段将随机码传递给第二个页面,从而避免重复生成随机码。
test1.php页面中的代码如下所示:
0); } ?>
test2.php页面中的代码如下所示:
通过将表单提交至randomkey2.php页面,可以在该页面中获取用户输入的key并与隐藏字段中的随机码进行比较。如果两者相匹配,则输出'success',否则输出'fail'。
这种方式不仅避免了使用会话全局变量,还解决了uniqid()函数重复生成随机码的问题。尽管这种方法看起来有点奇怪,但对我来说,将过程细分并不是一个问题,并且它能正常工作。非常抱歉如果我浪费了你的时间,我刚刚开始使用PHP。感谢您的纠正和建议。
问题原因: 代码中存在一个轻微的错误,即在成功后,重新加载页面时,代码仍会生成相同的密钥,这会导致随机性被丢弃,而随机性在使用唯一函数时是非常重要的。因此,在成功后需要销毁会话。
解决方法: 修改代码如下,并使用 session_destroy()
函数来销毁会话。
if(isset($_POST['submit'])) { $input = $_POST['inputKey']; if (strcmp($input,$_SESSION['key']) == 0) { echo 'success'; session_destroy(); } else { echo 'fail'; } }
参考资料:
解决完headers被发送的问题后,考虑在成功后重定向到其他页面或同一页。可以使用header函数实现重定向,但不能同时使用echo和header函数,因此需要注意这一点。
参考资料:
请务必在header函数后添加exit;
(如手册中所述),否则代码可能会继续执行,如果在其下方还有其他代码的话。