php中的Session问题

时间:2011-06-08 10:54:05

标签: php session

代码:

<?php
include ("conf/conf.php");
include ("classes/dbhelper.php");
$conf = new Dbconf();
$dbURL = $conf->get_databaseURL();
$dbUName = $conf->get_databaseUName();
$dbPword = $conf->get_databasePWord();
$dbName = $conf->get_databaseName();
$nameOfDbWithWorkers = $conf->get_nameOfDbWithWorkers();

if($_POST['auth']){
    $login = trim(($_POST['login']));
    $pass = trim($_POST['pass']);  

    $dbHelp = new DbHelper($dbURL, $dbUName, $dbPword, $dbName, $nameOfDbWithWorkers);
    $userType = $dbHelp->getUser($login, $pass);

    switch ($userType){
    case "admin":
        startSession($login, $pass);
        header("Location: adminpage.php");
        break;  
    case "user": 
        startSession($login, $pass);
        header("Location: operatorpage.php");
        break;
    case "nomatch": 
    echo 
    '<html> 
    <body> 
    <table width=100% height=100% border=0 cellpadding=0 cellspacing=0> 
        <tr valign="center" align="center">
            <td> 
                <form action="authorize.php" method="post">
                Логин:<input type="text" name="login"><br>
                Пароль:<input type="password" name="pass"><br>
                <input type="submit" name="auth">
                <font color = red> Неправильный пароль или логин</font>  
            </td>
        </tr>
    </table>

    </form>
    </body> 
    </html>';
        break;
    }       
}
else{
    header("Location: index.php");
}
    function startSession($login, $pass){
        session_start();
        $_SESSION['login'] = $login;
        $_SESSION['pass'] = $pass;
        $_SESSION['usr_id'] = md5(crypt($login,$pass));
    }

当我输入正确的登录信息并传递信息时,我有下一个错误。

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\ecl.ru\www\classes\dbhelper.php:24) in Z:\home\ecl.ru\www\authorize.php on line 20

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at Z:\home\ecl.ru\www\classes\dbhelper.php:24) in Z:\home\ecl.ru\www\authorize.php on line 53

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at Z:\home\ecl.ru\www\classes\dbhelper.php:24) in Z:\home\ecl.ru\www\authorize.php on line 53

如何解决这个问题?

6 个答案:

答案 0 :(得分:2)

您需要在执行任何操作之前启动会话。 Read the docs

答案 1 :(得分:1)

您可以通过启用output buffering来解决此问题,这样会始终在数据之前发送标题。

答案 2 :(得分:1)

在使用标题之前启动会话

答案 3 :(得分:1)

你的文件dphelper.php会输出一些内容,如通知所示:

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\ecl.ru\www\classes\dbhelper.php:24) in Z:\home\ecl.ru\www\authorize.php on line 20

由于标头是在任何类型的输出之前发送的,因此你的session_start()来得太晚了。正如人们已经说过的,一个建议是将session_start()放在文件的顶部,另一个(可以与第一个一起实现) - 查看dbhelper.php并确保它不输出任何内容(来自文件的名称 - 它不应该,无论如何)。并且,当我说“输出”时,它不一定是echo / print / etc,它也可能是在文件末尾关闭php标记后的空格。

答案 4 :(得分:0)

查看您的代码,在会话开始之前没有任何内容显然被发送,但是,您有各种函数调用。他们中的任何一个输出内容吗?

这是完整的文件吗?即使是<?php之前的行返回也会计入发送到浏览器的内容....

答案 5 :(得分:0)

只需将session_start();置于您的包含之前,因此当您在代码中的任何位置调用startSession函数时,它只会设置您分配给$ _SESSION的任何值。