我想生成一个随机密钥供用户在注册时使用。代码将生成的密钥与用户输入进行比较,但是当用户提交表单时,密钥会重新生成,因此它们永远不会相同。我试图通过检查它是否已经生成但是它不起作用来保护生成器功能。然后,我也尝试使用会话,这也不起作用。这里的代码总是产生“失败”而不是“成功”:
编辑:我根据您的评论进行了一些更正。
<?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 'success';
} else {
echo 'fail';
}
}
?>
<html>
<head>
</head>
<body>
<form method="POST" action="">
<table border="0">
<tr>
<td>Your key:</td>
<td>
<b>
<?php echo $key1; ?></b>
</td>
</tr>
<tr>
<td>Enter your key:</td><td><input type="text" name="inputKey"></td>
</tr>
<tr>
<td><input id="button" type="submit" name="submit" value="Sign-Up"></td>
</tr>
</table>
</form>
</body>
</html>
答案 0 :(得分:2)
您在评论中表示现在有一个标题已发送警告。
以下链接将帮助您找出原因。
但是,我确实在您的代码中发现了一个小错误。
即使成功,您的代码也会在重新加载页面时生成相同的密钥; “随机性”实际上会被“抛到窗外”,因为这就是你使用独特功能的全部目的。
您需要在成功时销毁会话。
以下是您的代码应该是什么样子并使用session_destroy()
:
if(isset($_POST['submit']))
{
$input = $_POST['inputKey'];
if (strcmp($input,$_SESSION['key']) == 0) {
echo 'success';
session_destroy();
} else {
echo 'fail';
}
}
参考:
一旦您纠正了发送标头的问题,请考虑在继承之后重定向某处(或相同的页面)。
您可以使用标题执行此操作,但不能同时回显和使用标题,请记住。
参考:
并确保在标题后添加exit;
(如手册中所述),否则您的代码可能希望继续执行,如果您的代码下面有更多代码。
答案 1 :(得分:0)
抱歉,延误。我想我找到了一个解决方法。我刚刚将表单发布到另一个抓取和控制信息的页面。这样,随机代码不会被重新生成。所以,我有两页而不是一页。
test1.php:
time1, time2, time3,time4
test2.php:
<?php
$key = randomKey();
function randomKey() {
$i = 0;
do {
$key = uniqid();
return $key;
} while ($i > 0);
}
?>
<html>
<head>
</head>
<body>
<form method="POST" action="randomkey2.php">
<table border="0">
<tr>
<td>Your key:</td>
<td>
<b>
<?php echo $key?></b><input type="hidden" name="keyHidden" value="<?php echo $key;?>" />
</td>
</tr>
<tr>
<td>Enter your key:</td><td><input type="text" name="inputKey"></td>
</tr>
<tr>
<td><input id="button" type="submit" name="submit" value="Sign-Up"></td>
</tr>
</table>
</form>
</body>
</html>
这样,我也不必使用会话全局变量。嗯,这可能看起来有点奇怪但是这个过程通常有点复杂,需要给出一些指令。因此,细分过程对我来说不是问题,而且有效。如果我浪费你的时间,我很抱歉,我刚刚开始使用PHP。感谢您的更正和建议。