代码:
<?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
如何解决这个问题?
答案 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的任何值。