-1

我正在学习 PHP PEAR 并测试以下代码。但是,当我登录时,出现以下错误。

谁能告诉我代码有什么问题?

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

警告:session_regenerate_id() [function.session-regenerate-id]:无法重新生成会话 ID - 标头已在第 830 行的 C:\xampp\php\PEAR\Auth.php 中发送

警告:无法修改标头信息 - 标头已由第 858 行 C:\xampp\php\PEAR\Auth.php 中的(输出开始于 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

标头已发送”错误意味着您正在尝试发送标头(cookie 是 HTTP 标头,PHP 中的会话使用 cookie 作为会话标识符)而已经发送了一些输出。

当有一些输出(甚至一个空格就足够了!)发送时,PHP 会自动发送标头;当那些已经发送时,你不能设置另一个标题。

所以:您必须删除在调用之前发送的任何输出session_regenerate_id

<?php首先,检查标签之前是否没有空格,或者?>经常 - 这通常可以解决问题......


在这里,考虑到“ output started at C:\xampp\htdocs\php5adv\Ch04\login.php:50 ”消息,我会检查你 login.php,arround line 50 ;-)

您正在发送一些 HTML 输出(html、head、... 标签),并且仅在之后,正在执行

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

我猜这个启动方法是启动会话的方法,因此,尝试发送 cookie ......因为已经有一些 HTML 输出,标题已经发送,你不能发送新的。

这意味着在执行任何输出之前,您可能必须将调用移至$auth->start文件顶部;例如,在创建 Auth 实例的 PHP 代码块中——因此标头尚未发送。

于 2009-09-06T13:03:37.537 回答
0

您的脚本应以

<?php

在注释块和一些新行之后你就有了。

打印之前的所有内容,如果 PHP 打印任何内容,则无法重新生成会话 ID,因为会话 ID 存储在 cookie 中,必须在页面内容之前发送。

您应该始终确保<?php脚本中没有任何内容,甚至是白色字符。

于 2009-09-06T13:03:46.330 回答
0

看起来您在 PHP 开始之前输出了一些文本。

即使它只是空白,这也会破坏事情。

于 2009-09-06T13:05:26.727 回答
0

这个问题的一个快速解决方案是缓冲页面的输出。这将确保生成的任何标题输出$auth->start将在页面输出开始之前发生。

通过将以下代码放在页面顶部(在任何空格之前)来执行此操作:

<?php ob_start(); ?>

底部的代码:

<?php ob_end_flush(); ?>

ob 代表“输出缓冲”。

于 2013-05-12T13:00:44.417 回答