Как остановить uniqid () от регенерации в форме PHP

Я хочу сгенерировать случайный ключ, который пользователь будет использовать при регистрации. Код сравнивает сгенерированный ключ с пользовательским вводом, но ключ восстанавливается, когда пользователь отправляет форму, поэтому они никогда не совпадают. Я попытался защитить функцию генератора, проверив, была ли она уже сгенерирована, но она не сработала. Затем я попытался использовать сеанс, который тоже не работал. Вот код, который всегда выдает «сбой», а не «успех»:

Изменить: я сделал некоторые исправления в соответствии с вашими комментариями.

<?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>

1

Решение

Вы заявили в комментариях, что теперь заголовки отправили предупреждение.

Следующая ссылка поможет вам понять, почему это так.

Тем не менее, я нашел небольшую ошибку в вашем коде.

Даже в случае успеха ваш код выдаст тот же ключ при перезагрузке страницы; где «случайность» буквально будет «выброшена из окна», поскольку именно в этом и заключается вся цель использования вами уникальной функции.

Вам нужно уничтожить сессию в случае успеха.

Вот как ваш код должен выглядеть и использовать session_destroy():

if(isset($_POST['submit']))
{
$input = $_POST['inputKey'];
if (strcmp($input,$_SESSION['key']) == 0) {

echo 'success';

session_destroy();

} else {
echo 'fail';
}
}

Ссылка:

После того, как вы исправили проблему с отправляемыми заголовками, рассмотрите возможность перенаправления куда-нибудь (или на ту же страницу), после последовательности.

Вы можете сделать это с заголовком, но вы не можете одновременно отображать и использовать заголовок, поэтому помните об этом.

Ссылка:

и не забудьте добавить exit; после заголовка (как указано в руководстве), в противном случае ваш код может продолжить выполнение, и если у вас есть больше кода под ним.

2

Другие решения

Извините за задержку. Я думаю, что нашел обходной путь. Я просто разместил форму на другой странице, которая захватывает и контролирует информацию. Таким образом, случайный код не восстанавливается. Итак, у меня есть две страницы вместо одной.

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. Спасибо за ваши исправления и предложения.

0

По вопросам рекламы [email protected]