为什么我得到这个PHP session_start()错误?

时间:2010-01-23 00:27:20

标签: php class session

我无法弄清楚为什么我会收到此会话错误...

  

警告: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;
        }
    }
}
?>

2 个答案:

答案 0 :(得分:1)

当文件在开头有一个BOM(字节顺序标记)时,我遇到了这个错误。显然,这也导致标题被发送。但是,这可能是一个已修复的php错误。值得一看但是..

编辑:此时,我认为session_start()在发送cookie之前会抛出错误。早期错误将被发送到浏览器并阻止cookie被发送。但是,在这种情况下,您应该在屏幕上看到之前的错误。我知道这可能不是问题,但我想不出还有什么可能导致这个问题。

答案 1 :(得分:0)

你可能在index.php的顶部有一些空格..就在&lt;?之前标签,可能是一个空间...这将导致它.. PHP是非常挑剔的...在发出任何输出之前必须调用session_start ...