我无法弄清楚为什么我会收到此会话错误...
警告:session_start() [function.session-start]:无法发送 会话缓存限制器 - 标头 已发送(输出开始于 C:\网络服务器\ htdocs中\项目2 \实验室\形状的提交\的index.php:2) 在 C:\网络服务器\ htdocs中\项目2 \实验室\表单的提交\的index.php 在第2行
据我所知,只有在调用session_start()函数之前有某种输出到浏览器时才会发生这种情况,在这种情况下,在调用之前没有任何内容打印到屏幕,甚至没有任何空格。任何想法为什么我仍然会得到错误?
我发布了此演示的完整源代码,因此您可以准确地看到我用于创建错误的内容。
<?php
session_start();
require('formkey.class.php');
$formKey = new formKey();
$error = 'No error';
//Is request?
if($_SERVER['REQUEST_METHOD'] == 'post')
{
//Validate the form key
if(!isset($_POST['form_key']) || !$formKey->validate())
{
//Form key is invalid, show an error
$error = 'Form key error!';
}
else
{
//Do the rest of your validation here
$error = 'No form key error!';
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>Securing forms with form keys</title>
</head>
<body>
<div><?php if($error) { echo($error); } ?>
<form action="" method="post">
<dl>
<?php $formKey->outputKey(); ?>
<dt><label for="username">Username:</label></dt>
<dd><input type="text" name="username" id="username" /></dd>
<dt><label for="username">Password:</label></dt>
<dd><input type="password" name="password" id="password" /></dd>
<dt></dt>
<dd><input type="submit" value="Submit" /></dd>
<dl>
</form>
</body>
</html>
班级档案
<?php
class formKey
{
//Here we store the generated form key
private $formKey;
//Here we store the old form key
private $old_formKey;
//The constructor stores the form key (if one excists) in our class variable
function __construct()
{
//We need the previous key so we store it
if(isset($_SESSION['form_key']))
{
$this->old_formKey = $_SESSION['form_key'];
}
}
//Function to generate the form key
private function generateKey()
{
$ip = $_SERVER['REMOTE_ADDR'];
$uniqid = uniqid(mt_rand(), true);
return md5($ip . $uniqid);
}
//Function to output the form key
public function outputKey()
{
//Generate the key and store it inside the class
$this->formKey = $this->generateKey();
//Store the form key in the session
$_SESSION['form_key'] = $this->formKey;
//Output the form key
echo "<input type='hidden' name='form_key' id='form_key' value='".$this->formKey."' />";
}
//Function that validated the form key POST data
public function validate()
{
//We use the old formKey and not the new generated version
if($_POST['form_key'] == $this->old_formKey)
{
//The key is valid, return true.
return true;
}
else
{
//The key is invalid, return false.
return false;
}
}
}
?>
答案 0 :(得分:1)
当文件在开头有一个BOM(字节顺序标记)时,我遇到了这个错误。显然,这也导致标题被发送。但是,这可能是一个已修复的php错误。值得一看但是..
编辑:此时,我认为session_start()在发送cookie之前会抛出错误。早期错误将被发送到浏览器并阻止cookie被发送。但是,在这种情况下,您应该在屏幕上看到之前的错误。我知道这可能不是问题,但我想不出还有什么可能导致这个问题。
答案 1 :(得分:0)
你可能在index.php的顶部有一些空格..就在&lt;?之前标签,可能是一个空间...这将导致它.. PHP是非常挑剔的...在发出任何输出之前必须调用session_start ...