Я хочу сгенерировать случайный ключ, который пользователь будет использовать при регистрации. Код сравнивает сгенерированный ключ с пользовательским вводом, но ключ восстанавливается, когда пользователь отправляет форму, поэтому они никогда не совпадают. Я попытался защитить функцию генератора, проверив, была ли она уже сгенерирована, но она не сработала. Затем я попытался использовать сеанс, который тоже не работал. Вот код, который всегда выдает «сбой», а не «успех»:
Изменить: я сделал некоторые исправления в соответствии с вашими комментариями.
<?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>
Вы заявили в комментариях, что теперь заголовки отправили предупреждение.
Следующая ссылка поможет вам понять, почему это так.
Тем не менее, я нашел небольшую ошибку в вашем коде.
Даже в случае успеха ваш код выдаст тот же ключ при перезагрузке страницы; где «случайность» буквально будет «выброшена из окна», поскольку именно в этом и заключается вся цель использования вами уникальной функции.
Вам нужно уничтожить сессию в случае успеха.
Вот как ваш код должен выглядеть и использовать session_destroy()
:
if(isset($_POST['submit']))
{
$input = $_POST['inputKey'];
if (strcmp($input,$_SESSION['key']) == 0) {
echo 'success';
session_destroy();
} else {
echo 'fail';
}
}
Ссылка:
После того, как вы исправили проблему с отправляемыми заголовками, рассмотрите возможность перенаправления куда-нибудь (или на ту же страницу), после последовательности.
Вы можете сделать это с заголовком, но вы не можете одновременно отображать и использовать заголовок, поэтому помните об этом.
Ссылка:
и не забудьте добавить exit;
после заголовка (как указано в руководстве), в противном случае ваш код может продолжить выполнение, и если у вас есть больше кода под ним.
Извините за задержку. Я думаю, что нашел обходной путь. Я просто разместил форму на другой странице, которая захватывает и контролирует информацию. Таким образом, случайный код не восстанавливается. Итак, у меня есть две страницы вместо одной.
test1.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>
test2.php:
<?php
$input = $_POST['inputKey'];
$key = $_POST['keyHidden'];
$control = strpos($key, $input);
if($control !== false)
{
echo 'success';
} else {
echo 'fail';
}
?>
Таким образом, мне также не нужно использовать сессионные глобалы. Ну, это может выглядеть немного странно, но процесс обычно немного сложнее, и для этого нужно дать некоторые инструкции. Таким образом, разделение процесса не проблема для меня, и это работает. Извините, если я потратил впустую ваше время, я только начал возиться с PHP. Спасибо за ваши исправления и предложения.