使用PEAR时出错

时间:2009-09-06 12:58:33

标签: php pear

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

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

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

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

警告:无法修改标头信息 - 已在C:\ xampp \ php \ PEAR \ Auth.php中发送的标头(在C:\ xampp \ htdocs \ php5adv \ Ch04 \ login.php:50处开始输出) 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 "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 个答案:

答案 0 :(得分:2)

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

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

所以:你必须删除在调用session_regenerate_id

之前发送的任何输出

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


在这里,考虑到“输出从C:\ xampp \ htdocs \ php5adv \ Ch04 \ login.php:50 ”消息开始,我会检查你login.php,arround 50行;-)

您正在发送一些HTML输出(html,head,...标签),并且只在之后才会发送

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

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

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

答案 1 :(得分:0)

您的脚本应以

开头
<?php

你在评论栏和一些新行之后就有了这个。

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

<?php ob_start(); ?>

这个代码在底部:

<?php ob_end_flush(); ?>

ob代表“输出缓冲”。