我正在学习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>
答案 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代表“输出缓冲”。