2012-02-16 3 views
1

간단한 로그인 페이지를 작성하십시오. 사용자가 일치하지 않는 암호와 암호 확인을 입력하면 등록 양식을 재설정하고 메시지를 인쇄하려고합니다. 현재 메시지는 인쇄되지 않지만 스크립트를 통해 전달됩니다.PHP에서 업데이트 메시지를 표시하는 방법은 무엇입니까?

registration.php :

<?php 
    session_start(); 
    if (isset($_SESSION['errmsg'])) { 
     print($_SESSION['errmsg']); 
     unset($_SESSION['errmsg']); 
    } 
?> 

<form name="register" action="register.php" method="post"> 
    <label>Username</label><input type="text" name="username" maxlength="20" /> 
    <label>Password</label><input type="password" name="pass" /> 
    <label>Password Again</label><input type="password" name="pass_confirm" /> 
    <input type="submit" value="Register" /> 
</form> 

register.php :

<?php 
function create_salt() { 
    $string = md5(uniqid(rand(), true)); 
    return substr($string, 0, 3); 
} 

session_start(); 
$username = $_POST['username']; 
$pass = $_POST['pass']; 
$pass_confirm = $_POST['pass_confirm']; 

if ($pass != $pass_confirm) { 
    $_SESSION['errmsg'] = "Passwords do not match."; 
    header('Location: registration.php'); 
} 

if (strlen($username) > 20) { 
    header('Location: registration.php'); 
} 

$hash = hash('sha256', $pass); 
$salt = create_salt(); 
$hash = hash('sha256', $salt . $hash); 

$conn = mysql_connect('localhost', 'test4', 'test4'); 
mysql_select_db('test4', $conn); 

$username = mysql_real_escape_string($username); 

$query = "INSERT INTO users (username, password, salt) VALUES ('$username', '$hash', '$salt');"; 

mysql_query($query); 
mysql_close(); 
header('Location: index.php'); 
?> 
이것은 내가 다시로드 할 때이 변수를 오류가 발생하면 세션 변수를 설정하고 보여주는 방식으로, 시도했습니다 것입니다

중요한 부분은 if ($pass != $pass_confirm) { ...입니다. 현재 암호가 일치하지 않으면이 조건이 충족되지만 header(Location: registration.php)을 통해 다시로드하는 대신 스크립트를 통해 수행됩니다. 데이터가 전송 된 후에 header()을 호출 할 수 없다는 것을 알고 있습니다. 문제가 원인 일 수 있습니다.

그렇다면 PHP에서 이것을 수행하는 더 좋은 방법이 있습니까? 아니면 대안을 찾아야합니까?

+0

'register.php'에 ''태그가 있고 해당 태그 외부에 다른 데이터가없는 경우 코드가 작동해야합니다. PHP에서 오류 출력을 사용할 수 있습니까? 이 스크립트가 오류를 생성합니까? – talereader

+0

죄송합니다. 나는 위의 것을 무시했습니다. 지금 편집되었습니다. 'register.php'에 PHP 태그가 있습니다. – persepolis

답변

2

die(); 또는 exit;이 문제를 해결합니다.

header('Location: registration.php'); 
die(); 
+0

왜 이것이 '건강한'해결책인지 알지 못합니다. 감사! – persepolis

+1

예, 건강한 해결책입니다. 그리고 헤더 (위치) 동작은 스크립트를 끝내지 않을 것으로 예상됩니다. 단지 헤더에 기록합니다. 스크립트는 당신이 멈추라 고 말할 때까지 계속됩니다. 스크립트가 끝나면 헤더가 브라우저로 보내지고 리디렉션하도록 지시됩니다. – talereader

2

일부 데이터를 출력 한 다음 리디렉션을 선택할 수있는 경우 출력 버퍼링을 사용할 수 있습니다. 이로 인해 생성 된 결과가 사용자에게 전송되는 대신 버퍼에 저장됩니다. 리디렉션해야하는 경우 아직 전송 된 데이터가 없기 때문에 작동합니다. 리디렉션하지 않으면 버퍼에있는 것을 사용하고 스크립트가 완료되면 출력합니다. 오류가있는 경우 두 번 header()를 호출하고 있습니다, 또한 http://www.php.net/manual/en/intro.outcontrol.php

- 두 번째 헤더 호출을 '위치 :

이 PHP 매뉴얼 페이지는 PHP 출력 버퍼링에 대해 많은 더 숙이고보기 '형식은 첫 번째 파일을 덮어 쓰고 index.php로 보냅니다.

위의 @ talereader의 대답을 참조하십시오. - 열쇠는 사용자가 오류 상태에 있음을 확인하고 헤더를 호출 한 다음 스크립트를 즉시 종료하는 것입니다.

+0

더 설명해 주시겠습니까? 세션 변수 코드를 꺼내더라도 두 개의 패스워드가 일치하지 않으면'header ('Location : registration.php');가 호출되지 않고 스크립트가 계속 실행되기 때문에 혼란 스럽습니다. 왜'registration.php'로 돌아가고 싶지 않은가? – persepolis

+1

@talereader가 있습니다 - 귀하의 스크립트가 registration.php로 리디렉션하도록 헤더를 설정하고 있었지만 스크립트는 또한 첫 번째 리디렉션을 덮어 쓰는 index.php로 리디렉션하고있었습니다. 두 번째 매개 변수를 false로 지정하지 않으면'header()'호출은 기본적으로 비슷한'header()'호출을 대체합니다. 더 큰 아이디어는 스크립트를 끝내고 다른 주소에서'header()'를 사용하여 다른 스크립트를 시작하려면'die()'와 같은 스크립트로 끝내야합니다. 그렇지 않으면 첫 번째 스크립트는 실행 중지를 알 수 없습니다. –

1

무엇인가가 실패 할 경우 모든 점검과 플래그 설정을 수행하십시오. 예 : $failed = true; 실제 처리를 수행하기 전에 if (!$failed) { //process }을 수행하십시오.

+0

그래서 header()는 스크립트의 끝에서만 호출 될 수 있습니까? – persepolis

+0

아니요, 어디에서나 헤더를 호출 할 수 있지만 한 헤더를 다른 헤더로 덮어 쓸 수 있습니다. 또한 페이지 출력이 이미 시작된 경우 헤더 출력과 관련하여 문제가 발생할 수 있습니다. –

관련 문제