2009-09-06 12 views
-1

PHP PEAR을 배우고 다음 코드를 테스트하고 있습니다. 그러나 로그인 할 때 다음 오류가 발생합니다.PEAR를 사용하는 중 오류가 발생했습니다.

아무도 코드에 무엇이 잘못되었는지 말해 줄 수 있습니까?

++++++++++++++++

경고 :에도 session_regenerate_id() [function.session-중생-ID] : 세션 ID를 다시 생성 할 수 없습니다 - 이미 C에서 전송 헤더를 : \ xampp \ php \ PEAR \ Auth.php on line 830

경고 : 헤더 정보 - 이미 보낸 헤더 (C : \ xampp \ htdocs \ php5adv \ Ch04 \ login.php : 50에서 시작된 출력)를 수정할 수 없습니다. C : \ XAMPP의 \ PHP는 \ 배 \ Auth.php 라인에 858

++++++++++++++++

<?php # Script 4.3 - login.php 

/* This page uses PEAR Auth to control access. 
* This assumes a database called "auth", 
* accessible to a MySQL user of "[email protected]" 
* with a password of "password". 
* Table definition: 

    CREATE TABLE auth (
    username VARCHAR(50) default '' NOT NULL, 
    password VARCHAR(32) default '' NOT NULL, 
    PRIMARY KEY (username), 
    KEY (password) 
    ) 
* MD5() is used to encrypt the passwords. 
*/ 

// Need the PEAR class: 
require_once "Auth.php"; 

// Function for showing a login form: 
function show_login_form() { 

    echo '<form method="post" action="login.php"> 
<p>Username <input type="text" name="username" /></p> 
<p>Password <input type="password" name="password" /></p> 
<input type="submit" value="Login" /> 
</form><br /> 
'; 

} // End of show_login_form() function. 

// Connect to the database: 
$options = array('dsn' => 'mysql://username:[email protected]/auth'); 

// Create the Auth object: 
$auth = new Auth('DB', $options, 'show_login_form'); 

// Add a new user: 
$auth->addUser('me', 'mypass'); 

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> 
    <title>Restricted Page</title> 
</head> 
<body> 
<?php 

// Start the authorization: 
$auth->start(); 

// Confirm authorization: 
if ($auth->checkAuth()) { 

    echo '<p>You are logged in and can read this. How cool is that?</p>'; 

} else { // Unauthorized. 

    echo '<p>You must be logged in to access this page.</p>'; 

} 

?> 
<a href="logout.php>Logout</a> 
</body> 
</html> 
+0

@shin : 코드 형식을 지정하기 위해 질문을 편집했습니다. 이는 각 코드 줄 앞에 4 칸을 추가한다는 것을 의미합니다.

+0

감사합니다 PascalMARTIN, 방금 편집했습니다. shin

+0

@shin : 편집 해 주셔서 감사합니다. 공백 :-( –

답변

2

" 헤더가 이미 전송되었습니다."라는 오류 메시지가 표시되면 헤더를 보내려고합니다 (쿠키는 HTTP 헤더이며 PHP는 세션 식별자로 쿠키를 사용합니다) 이미 일부 출력이 전송 된 상태입니다.

일부 출력이있을 때 (심지어 공백 하나 여야합니다!)이 전송되면 PHP는 자동으로 헤더를 보냅니다. 이미 전송 된 경우 다른 헤더를 설정할 수 없습니다.

그래서 : - 이것은 종종 해결 당신이 모든 session_regenerate_id

첫 번째로 호출하기 전에 전송 출력을 제거 할 필요는 <?php 태그 앞에, ​​또는 ?> ofter에는 공백이 없다는 것을 확인 문제합니다 ... 고려

다음


"출력은 C에서 시작 : \ XAMPP \ htdocs를 \ php5adv \ CH04 \ login.php : 50"메시지, 내가 login.php 당신을 확인 것, arround 라인 50 ;-)

당신은 후에 만, 약간의 HTML 출력 (HTML, 머리, ... 태그)를 전송하고하는 것은 따라서 세션을 시작하는 일을 나는이 시작 방법을 추측하고있어

// Start the authorization: 
$auth->start(); 

입니다 일을하고있다 , tryies to cookies ... 이미 HTML 출력이 있었기 때문에 헤더가 이미 보내 졌으므로 새 메시지를 보낼 수 없습니다.

이것은 출력을하기 전에 $auth->start으로 전화를 파일 상단으로 옮겨야 할 필요가 있음을 의미합니다. 예를 들어 Auth의 인스턴스를 생성하는 PHP 코드 블록에서 - 헤더가 아직 보내지지 않았습니다.

+0

Thanks Pascal MARTIN. $ auth-> start();를 직전에 이동 했습니까?> 고정되어 있습니다. 맨 위로 이동하면 오류가 발생하지만 앞에는?>가 올바르게 작동합니다. 다시 한번 감사드립니다. – shin

+0

@shin : 좋아요, "맨 위"는 "Auth 클래스의 인스턴스를 만드는 PHP 코드 블록에서 출력하기 전에"의미합니다. 재미있게 놀아 라! –

0

스크립트는

<?php 

로 시작해야하고, 당신은 그 주석 블록과 새로운 라인 후.

그 전에 있던 내용이 모두 인쇄되고 PHP에서 아무것도 인쇄하지 않으면 세션 ID가 페이지 콘텐츠 전에 전송되어야하는 쿠키에 저장되므로 세션 ID를 다시 생성 할 수 없습니다.

스크립트에 항상 <?php이 없도록해야합니다. 흰색 문자는 아닙니다.

0

PHP를 시작하기 전에 텍스트를 출력하는 것처럼 보입니다.

공백 인 경우에도 문제가 발생합니다.

0

이 문제의 빠른 해결책은 페이지 출력을 버퍼링하는 것입니다. 이렇게하면 페이지 출력이 시작되기 전에 $auth->start에 의해 생성 된 모든 헤더 출력이 발생합니다.

은 (공백 전) 오른쪽 페이지 상단에 다음 코드를 배치하여이 작업을 수행 :

<?php ob_start(); ?> 

그리고 맨 아래에이 코드 :

<?php ob_end_flush(); ?> 

산부인과는 "출력을 의미를 버퍼링 ".

관련 문제