2016-08-04 3 views
0

Я хочу создать случайный ключ для пользователя, который будет использоваться во время регистрации. Код сравнивает сгенерированный ключ с пользовательским вводом, но ключ восстанавливается, когда пользователь отправляет форму, поэтому они никогда не совпадают. Я попытался защитить функцию генератора, проверив, был ли он уже сгенерирован, но он не работает. Затем я тоже пытался использовать сеанс, который тоже не работал. Вот код, который всегда производит «сбой», а не «успех»:Как остановить 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> 
+0

Если вы не передадите $ key в свою функцию, он всегда будет нулевым, поэтому вы всегда получите новый. Прочитайте это http://php.net/manual/en/language.variables.scope.php – rjdown

+1

$ _session -> $ _SESSSION –

+0

@rjdown, но он использует сеанс глобальный –

ответ

2

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

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

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

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

Вам необходимо уничтожить сеанс с успехом.

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

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

    echo 'success'; 

    session_destroy(); 

    } else { 
    echo 'fail'; 
    } 
} 

Ссылка:

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

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

Ссылка:

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

0

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

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. Благодарим вас за исправления и предложения.

Смежные вопросы