-1

PHP PEAR を学習し、次のコードをテストしています。ただし、ログインすると、次のエラーが表示されます。

コードの何が問題なのか誰か教えてもらえますか?

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

警告: session_regenerate_id() [function.session-regenerate-id]: セッション ID を再生成できません - ヘッダーは C:\xampp\php\PEAR\Auth.php 行 830 で既に送信されています

警告: ヘッダー情報を変更できません - C:\xampp\php\PEAR\Auth.php 行 858 で既に送信されたヘッダー (C:\xampp\htdocs\php5adv\Ch04\login.php:50 で開始された出力)

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

<?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 "username@localhost" 
 *  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:password@localhost/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>
4

4 に答える 4

2

headers already sent」エラーは、すでにいくつかの出力が送信されているにもかかわらず、ヘッダーを送信しようとしていることを意味します(Cookie は HTTP ヘッダーであり、PHP のセッションはセッション ID に Cookie を使用します) 。

何らかの出力(1 つの空白でも十分です!)が送信されると、PHP は自動的にヘッダーを送信します。それらがすでに送信されている場合、別のヘッダーを設定することはできません。

だから:への呼び出しの前に送信された出力を削除する必要がありますsession_regenerate_id

まず、<?phpタグの前に空白がないことを確認し?>ます。これにより、多くの場合、問題が解決します...


ここで、「output started at C:\xampp\htdocs\php5adv\Ch04\login.php:50」メッセージを考慮して、50行目あたりのlogin.phpをチェックインします;-)

いくつかの HTML 出力 (html、head、... タグ) を送信しており、その後にのみ実行しています。

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

私は、この開始メソッドがセッションを開始するメソッドであると推測しているため、Cookie を送信しようとしています... HTML 出力が既にいくつかあるため、ヘッダーは既に送信されており、新しいヘッダーを送信することはできません。

これは$auth->start、出力を実行する前に、呼び出しをファイルの先頭に移動する必要があることを意味します。たとえば、Auth のインスタンスを作成する PHP コードブロック内で、ヘッダーがまだ送信されていません。

于 2009-09-06T13:03:37.537 に答える
0

スクリプトはで始まる必要があります

<?php

コメントブロックといくつかの改行の後にそれがあります。

セッション ID はページ コンテンツの前に送信する必要がある Cookie に保存されているため、PHP が何かを出力した場合、セッション ID を再生成することはできません。

スクリプトの前に何もないことを常に確認する必要があり<?phpます。白い文字であってもです。

于 2009-09-06T13:03:46.330 に答える
0

PHP の開始前にテキストを出力しているようです。

単なる空白であっても、これは物事を壊します。

于 2009-09-06T13:05:26.727 に答える