2014-03-03 4 views
0

안녕하세요, 일부 코드 문제가 있습니다. 선생님조차도 나를 도울 수 없으며, 나는 어디로 가야할지 모른다. foreach 루프가 활성화되고 비밀번호와 사용자 이름이 하드 코딩 된 문자열과 동일 할 경우 loginerror.php로 리디렉션됩니다. 헤더 ("Location : loginerror.php")를 제거하면 정상적으로 작동합니다. 새 페이지를로드해야하는 경우에도 내 코드의 마지막 줄이 여전히 활성화되는 이유는 무엇입니까?php가 헤더와 함께 전송되지 않음

<?php session_start(); ?> 
<html> 
<header></header> 
<body> 
<form action="login.php" Method="post"> 
Username: <input type="text" name="Username"> </br></br> 
Password: <input type="password" name="Password"> </br></br> 
<input type="submit" value="Login"></br></br> 
</form> 
<?php 


$username=$_POST["Username"]; 
$password=$_POST["Password"]; 
if($username == NULL){print("Enter a Username please");} 
else { 


    $users= array 
    (
"Bourne"=>"postcode", 
    "Unidan"=>"pincode", 
    "yoda"=>"sith" 
    ); 

    foreach($users as $user=>$password_value) 
    { 
    if(($user==$username)&&($password_value==$password)) 
    { 
    $_SESSION['login?']=1; 
    header("Location: calculation.php"); 
    }} 
    $_SESSION['login?']=0; 
    header("Location: loginerror.php"); 
    } 

    ?> 
    </body> 
    </html> 
+4

"선생님조차도 도움이 안됩니다."- 더 나은 선생을 찾는 것이 좋습니다. – David

+1

선생님은 단서가 없습니다 ... header() 코드에 도달하기 전에 전체 HTML 문서를 출력했기 때문에 header() 호출이 작동하지 않습니다. –

+0

가르 칠 수없는 사람들. –

답변

0

:

헤더()는 실제 출력하기 전에 호출해야 기억 일반 HTML 태그, 파일의 빈 줄 또는 PHP로 보내집니다. include 또는 require, 함수 또는 다른 파일 액세스 함수를 사용하여 코드를 읽고, header()이 호출되기 전에 공백 또는 빈 줄이 출력되는 것은 매우 일반적인 오류입니다.

참조 : Header Documentation

파일의 상단에 PHP 코드를 이동

하고 문제 해결해야

<?php 
    session_start(); 

    $username=$_POST["Username"]; 
    $password=$_POST["Password"]; 
    if ($username == NULL) { 
     print("Enter a Username please"); 
    } else { 
     $users= array("Bourne"=>"postcode", "Unidan"=>"pincode", "yoda"=>"sith"); 

     foreach($users as $user=>$password_value) { 
      if(($user==$username)&&($password_value==$password)) { 
       $_SESSION['login?']=1; 
       header("Location: calculation.php"); 
       // Add this to terminate the script immediately and redirect. 
       exit(); 
      } 
     } 
     $_SESSION['login?']=0; 
     header("Location: loginerror.php"); 
     // Add this to terminate the script immediately and redirect. 
     exit(); 
    } 
?> 
<html> 
<header></header> 
<body> 
    <form action="login.php" Method="post"> 
     Username: <input type="text" name="Username"> </br></br> 
     Password: <input type="password" name="Password"> </br></br> 
     <input type="submit" value="Login"></br></br> 
    </form> 
</body> 
</html> 
헤더의 모든 출력 전에 전송해야합니다

, 등을 HTML 출력.

+0

덕분에 모든 것이 작동합니다 :) – user3376192

0

exit는 너무 다른 코드는 리디렉션 후 실행되지 않습니다 다음 PHP 문서 당

header("Location: calculation.php"); 
exit; 
+0

이미 추가 출력을 보내기 시작한 후에는 헤더를 보낼 수 없습니다 ... – War10ck

+0

정말요? 그래서'loginerror.php'로 리디렉션되는 이유는 무엇입니까? 이것이 훌륭한 코드라고 말하지 않았고, 왜 계속해서'loginerror.php'로 리다이렉트하고 있는지에 대답하고있었습니다. 대부분의 출력 버퍼링은'php.ini'에 있습니다. – AbraCadaver

+0

'exit;를 추가하면 문제가 해결됩니다. 'headers()'는 먼저 출력되어야합니다 ... – War10ck

0

코드 구조를 이와 같이 변경하면 도움이 될 수 있습니다.

참고 :이 코드는 수정되지 않습니다.

<?php 
session_start(); 

$username=$_POST["Username"]; 
$password=$_POST["Password"]; 
if($username == NULL){ 
    print("Enter a Username please"); 
} 
else { 
     $users= array 
     (
     "Bourne"=>"postcode", 
     "Unidan"=>"pincode", 
     "yoda"=>"sith" 
     ); 

     foreach($users as $user=>$password_value) 
     { 
      if(($user==$username)&&($password_value==$password)) 
      { 
       $_SESSION['login?']=1; 
       header("Location: calculation.php"); 
       exit; 
      } 
     } 
     $_SESSION['login?']=0; 
     header("Location: loginerror.php"); 
     exit; 
} 
?> 
<html> 
<header></header> 
<body> 
<form action="login.php" Method="post"> 
Username: <input type="text" name="Username"> </br></br> 
Password: <input type="password" name="Password"> </br></br> 
<input type="submit" value="Login"></br></br> 
</form> 
</body> 
</html> 
0

이전에 언급 한 것처럼. 헤더를 보내기 전에 이미 출력하고 있습니다. 조건부로 감싸거나 암호를 확인하는 두 번째 스크립트가 필요합니다.

if/else $ _POST에 코드를 래핑하고 조건이 충족 된 후에 foreach에서 작동을 중단 할 수 있습니다.

관련 문제