2016-08-04 8 views
0

사용자가 등록하는 동안 사용할 임의의 키를 생성하고 싶습니다. 이 코드는 생성 된 키를 사용자 입력과 비교하지만 사용자가 양식을 제출할 때 키가 다시 생성되므로 절대 동일하지 않습니다. 생성기가 이미 생성되었는지 확인하여 생성기 기능을 보호하려고했지만 작동하지 않았습니다. 그런 다음 세션을 사용하려고했는데 작동하지도 않았습니다. 다음은 "성공"이 아닌 "실패"를 생성하는 코드입니다.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 '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를 함수에 전달하지 않으면 항상 null이되므로 새 값을 얻습니다. http://php.net/manual/en/language.variables.scope.php – rjdown

+1

$ _session -> $ _SESSSION –

+0

@rjdown을 읽으면서 그는 세계 세션을 사용 중입니다 –

답변

2

이제 경고를 보낸 헤더가 있다고 의견 진술했다.

다음 링크는 그 이유를 파악하는 데 도움이됩니다. Warning: Cannot modify header information - headers already sent by ERROR

  • 그러나, 나는 당신의 코드에 약간의 버그를 발견했다.

    성공해도 페이지가 다시로드 될 때 코드가 동일한 키를 생성합니다. 여기서 "임의성"은 글자 그대로 "창 밖으로 던져 질"것인데, 그 이유는 독창적 인 기능을 사용하여 전체 목적을 달성하기 때문입니다.

    성공하면 세션을 파괴해야합니다. 여기

    는 코드의 모양과 session_destroy()를 사용한다 무엇 :

    if(isset($_POST['submit'])) 
    { 
        $input = $_POST['inputKey']; 
        if (strcmp($input,$_SESSION['key']) == 0) { 
    
        echo 'success'; 
    
        session_destroy(); 
    
        } else { 
        echo 'fail'; 
        } 
    } 
    

    참조 : 당신은 헤더의 문제를 해결하면

    가 전송되는 , 어딘가에 (또는 그 문제에 대한 동일한 페이지), 계승 후, 리디렉션을 고려하십시오.

    헤더를 사용하여이를 수행 할 수 있지만 동시에 헤더를 에코하여 사용할 수 없으므로이를 기억하십시오.

    참조 :

    그렇지 않으면 코드가 계속 실행하려는 당신이있는 경우에 할 수있다, 헤더 (설명서에 명시된대로) 후 exit;을 추가해야합니다 그 아래에 더 많은 코드가 있습니다.

0

죄송합니다. 나는 workaround를 발견했다고 생각한다. 방금 정보를 수집하고 제어하는 ​​다른 페이지에 양식을 게시했습니다. 이렇게하면 임의의 코드가 다시 생성되지 않습니다. 그래서 저는 하나 대신 두 페이지를 가지고 있습니다.

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를 배우기 시작했습니다. 귀하의 시정 및 제안에 감사드립니다.