Php 函数会话_已注册(),无法修改头信息-头已由发送

Php 函数会话_已注册(),无法修改头信息-头已由发送,php,Php,我正在尝试创建一个包含会话的管理页面。我从admin.php中得到以下两个错误 Deprecated: Function session_is_registered() is deprecated in /home/content/95/10216895/html/test/admin.php on line 4 Warning: Cannot modify header information - headers already sent by (output started at /hom

我正在尝试创建一个包含会话的管理页面。我从admin.php中得到以下两个错误

Deprecated: Function session_is_registered() is deprecated in /home/content/95/10216895/html/test/admin.php on line 4

Warning: Cannot modify header information - headers already sent by (output started at /home/content/95/10216895/html/test/admin.php:4) in /home/content/95/10216895/html/test/admin.php on line 7
代码如下所示:

<?php
  //Start the session
  session_start();
  //Get the user name from the previously registered super global variable
  define(ADMIN, $_SESSION['name']);

  if (!session_is_registered("admin"))
  {
    //If session not registered, redirect to login.php page
    header("location:login.php");
  }
  else
  {
    header( 'Content-Type: text/html; charset=utf-8' );
  }
?>


<!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>

用于设置变量的另一个文件check_login.php中的登录检查代码如下:

    $sql="SELECT * FROM login_admin WHERE user_name='$myusername' and user_pass=SHA1('$mypassword')";
    //echo '<p>'.$sql.'</p>';

    $result=mysqli_query($dbC, $sql);
    //echo '<p>'.$result.'</p>';

    // Mysql_num_row is counting table row
    $count=mysqli_num_rows($result);
    // If result matched $myusername and $mypassword, table row must be 1 row
    if ($count==1)
    {
      // Register $myusername, $mypassword and redirect to file "admin.php"
      session_start();
      $_SESSION['name'] = 'admin';
      $_SESSION['password'] = 'password';
      // session_register("admin");
      // session_register("password");
      // $_myusername= $myusername;
      $_SESSION['name']= $myusername;
      header("location:admin.php");
    }
$sql=“从login\u admin中选择*,其中user\u name='$myusername'和user\u pass=SHA1('$mypassword')”;
//回显“”.$sql.

”; $result=mysqli_查询($dbC,$sql); //回显“”.$result.“

”; //Mysql\u num\u行是计数表行 $count=mysqli\u num\u行($result); //若结果匹配$myusername和$mypassword,则表行必须为1行 如果($count==1) { //注册$myusername、$mypassword并重定向到文件“admin.php” 会话_start(); $\会话['name']='admin'; $\会话['password']='password'; //会话注册(“管理”); //会话注册(“密码”); //$\u myusername=$myusername; $\会话['name']=$myusername; 标题(“位置:admin.php”); }

有人能帮我解决这个问题吗?

在最近的编辑之后,您不应该使用弃用的函数,而应该使用
isset()

当在
会话\u开始调用之前遇到一些输出时,就会出现这种情况


一种解决方案是将
ob_start()就在
会话_start()之前

首先,您有一个输入错误:

define(ADMIN,$_SESSION['name']);
应该是:

define('ADMIN',$_SESSION['name']);
第二:

问题的原因是,您实际上正在使用以下命令向浏览器输出某些内容:

<!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>
而不是:

session_is_registered('admin')

这是由于您收到的错误导致的问题。当您收到错误时,将发送输出。因此,请修复错误,因为它只是一个通知,如果您将错误报告给0,则此操作将有效

参考:


如果(!session\u已注册(“admin”))
更改为
如果(!isset($\u session[“admin”])
那么,关于
session\u已注册(“admin”)
被弃用的警告是因为,毫不奇怪,该函数已弃用(实际上,已从PHP5.4+中删除)。您应该使用isset($\u SESSION[“admin”])
检查变量是否存在


第二个原因是,不知何故,在发送头之前,输出会滑出。在给出
头调用之前,您的代码似乎没有发送任何内容,但在
之前可能只有一个空格字符。虽然两张海报上的内容都是正确的,但生成的输出实际上是使用会话时出现的E_不推荐的错误

一旦你把它改成其他的建议,你就不会有问题了


此外,您绝对应该在头重定向之后立即放置一个“退出”。现在,PHP将执行整个页面,即使在您尝试重定向未授权用户后

请使用isset函数验证是否设置了会话头已发送错误是因为警告被视为空白,因此未执行头函数

您是否在日志或页面上收到这些错误?如果是后者,则需要将
display\u errors
更改为off。error告诉答案
session\u已注册()。并将
exit()
放在标题重定向之后。请您解释一下-1Sure:“这是由于您收到的错误导致的问题。”就像说“您有一个错误”,这是显而易见的。“当你收到错误输出时,它就会被发送。”是的,错误就是这么说的,这有什么帮助呢?。“修正错误”,是的,冠军,我们该怎么做?“因为这只是一个通知,如果您将错误报告到0,这将起作用。”您是否认真地建议使用错误报告抑制每个错误是一个好主意?(即使只压制通知也是个坏主意)。我应该添加更多吗?我编辑了答案,然后添加了如何修复该问题的代码。(E_警告)错误是因为存在(E_已弃用)错误,因此如果您修复(E_已弃用),它将自动修复(E_警告),请阅读问题,并使用指定的行号检查错误消息。您是对的,但我对你的答案的第一个版本投了票,现在我的投票被锁定,直到你编辑它。所以,如果你编辑你的答案,我将撤消我的投票。你不觉得不提供理由就投票否决有点奇怪吗?这是给投票否决它的人的。谢谢你,它现在运行良好
session_is_registered('admin')