에코

2011-01-03 9 views
1


나는 아래의 코드가 있습니다에코

inputAction.php started 
Warning: Cannot modify header information - headers already sent by (output started at /Library/WebServer/Documents/01032011/inputAction.php:4) in /Library/WebServer/Documents/01032011/inputAction.php on line 16 
:

<?php 
session_start(); 
echo "\n\n"; 
echo "inputAction.php started"; 

//echo "<br/><br/>"; 

$name = $_POST["theUser"]; 
$passw = $_POST["thePassword"]; 

if (!strcmp($name, "myPassw") && !(strcmp($passw, "1234"))) 
{ 
    //echo "correct"; 
    $_SESSION['sessionUser']=$name; 
    $_SESSION['sessionPassword']=$passw; 
    header("location:a.php"); 

} 
else 
{ 
    //echo "wrong"; 
    header("Location: index.php"); 
} 

?> 

여기 내 첫 번째 시도는 echo "inputAction.php started";

그러나, 나는 오류를 가지고 있음을 발견 session_start(); 후를

하지만 에코를 주석 처리하면 괜찮을 것입니다. session_start();

<?php 
session_start(); 
//echo "\n\n"; 
//echo "inputAction.php started"; 

//echo "<br/><br/>"; 

$name = $_POST["theUser"]; 
$passw = $_POST["thePassword"]; 

if (!strcmp($name, "myPassw") && !(strcmp($passw, "1234"))) 
{ 
    //echo "correct"; 
    $_SESSION['sessionUser']=$name; 
    $_SESSION['sessionPassword']=$passw; 
    header("location:a.php"); 

} 
else 
{ 
    //echo "wrong"; 
    header("Location: index.php"); 
} 

?> 

무슨 일이 일어 났습니까? 누군가 echo이 오류를 만드는 이유를 설명 할 수 있습니까?
session_start 이후에 echo을 사용하지 않는 규칙이 있습니까?
session_start 이후에 사용할 수있는 로그를 인쇄하는 다른 방법 (echo 대체)은 무엇입니까?

답변

3

아니요, 규칙은 header보다 먼저 출력하지 않을 것입니다. 오류 메시지를 면밀히 살펴보면 다음과 같이 나타납니다. "16 [16]에서 헤더 정보 [...]를 수정할 수 없습니다."[...] : 4 "에서 출력이 시작 되었기 때문입니다.

출력 PHP 또한 모든 호 echo 플러싱되지 않고 내부 버퍼를 가질 않는 echo와 처음 것일 필요는 없다 시작 라인.

header 전에 출력하려면 output control을 사용하여 버퍼링해야합니다. 그러니 그냥 아무것도하기 전에 ob_start를 호출하고 HTTP 헤더 일부 출력이 이미 일어난 경우에도 수정 될 수 있도록 모든 출력은 버퍼링 :

<?php 
ob_start(); 
session_start(); 
// … 
+0

그래서 header()를 사용하지 않고 페이지를 리디렉션 할 수 있습니까? (그래서 나는 반향 일을 할 수 있습니까?) –

+0

해결책으로 +1 좋은 설명 –

+2

리디렉션하는 페이지 (301 페이지)에 내용이 있으면 안되기 때문에 리디렉션 할 필요가 없습니다. 결국 텍스트를 참조하십시오. –

1

당신은 이미 \n\n와 브라우저에 정보를 전송, 그래서 브라우저가 기본 헤더가 포함 된 페이지를 만들었습니다. 텍스트를 보내면 (심지어 단일 문자까지) 텍스트가 전송됩니다.

브라우저가 생각한대로, "알았어, 이건 평범한 텍스트 야. 그래서 내가 어떻게 알아서 출력 할 수 있을지 가장 좋은 HTML로 만들거야." 이렇게하면 헤더가 만들어지고 문서 본문이 만들어 지므로이 프로세스를 다시 시작할 때까지 새로 고칠 때까지 보낼 헤더가 더 이상 무시됩니다.

이런 일이 발생하지 않도록하려면 페이지 구성을 시작할 준비가 될 때까지 브라우저에 정보를 보내지 마십시오.

객체 버퍼링은 이전에 해보지 않은 경우에 시간이 걸리는 중급 난이도 주제입니다.

+0

그래서 어떻게 기록합니까? 내가 사용할 수있는 에코의 대안은 무엇입니까? –

+0

코드가 도달 할 때마다 업데이트되는 세션 변수를 추가 한 다음 준비가되면 나중에 다시 에코 할 수 있습니다. 5 단계가 있다고 가정하면, "3"이라는 값을 반향합니다. – Ben

1

이 경고는 header() 함수 호출시 발생합니다. header() 함수는 보내려는 응답에 대해 HTTP 헤더를 설정합니다. HTTP 헤더는 응답의 첫 번째 항목이어야합니다. 다른 출력은 표시 될 수 없습니다.

이 문제에 대한 해결책은 여러 가지가 있습니다. 하나는 output buffering을 켜고, 마술처럼 처리합니다. 더 나은 솔루션은 코드를 구조화하여 header() (또는 session_start() 함수) 호출 전에 아무 것도 출력하지 않도록하는 것입니다. MVC 프레임 워크 (cakephp, symphony, zend, ...)를 사용한다면) 당신은 그것에 대해 걱정할 필요조차 없을 것입니다.

이 정확한 문제는 여기에서 여러 번 다루어졌습니다 (PHP에 관한 가장 대중적인 질문 중 하나입니다). 이 search results을보세요.

또한 PHP의 오류 메시지를 읽는 데 시간을 투자하십시오. 입력 한 오류 메시지를 명확하게 오류가 "throw 된"header() 줄 및 출력을 시작한 상태입니다.

+0

그래서 header()를 사용하지 않고 페이지를 리디렉션 할 수 있습니까? (그래서 나는 반향을 할 수 있습니까?) –

+0

예, 출력 버퍼링을 켜십시오. 스크립트의 맨 처음에'Ob_Start();'를 넣으면됩니다. –

0

else 문에서 header() 함수를 사용하기 때문에 코드가 들어갈 때마다 페이지가 리디렉션됩니다. 그러나 Gumbo와 마찬가지로 header()가 호출되기 전에 브라우저에 출력이 있으면 오류가 발생합니다.

0

사용자가이를 볼 수 있도록 리디렉션하고 리디렉션하고 싶다면 기존의 좋은 HTML을 사용하여이를 수행 할 수 있습니다. 다음 페이지.

session_start(); 
echo '<head><meta http-equiv="refresh" content="5;url=http://www.whatever.com/a.php"></head>'; 
echo "\n\n"; 
echo 'inputAction.php started'; 
etc.etc.etc. 

그러나 물론

, 당신은 아직도 당신이 중 하나를 시험 두 번하거나 어쨌든 IFS에 에코를 넣어 것입니다 무엇을 의미하는지 URL =을 결정하기 위해 입력을 테스트해야합니다. 물론, 스크립트가 끝날 때만 출력되기 때문에 ob_start()를 사용하면 초기 에코가 어디 있는지는 중요하지 않습니다.

또한 세션에 암호를 저장하면 안됩니다.