0

我正在尝试创建一个带有会话的管理页面。我从 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");
    }

谁能帮我解决这个问题?

4

6 回答 6

0

首先你有一个错字:

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>

因为 PHP 文件末尾的静态 HTML 发送 text/html 标头。

您应该将所有 HTML 代码放在一个 .php/.html 文件中,然后将其包含在脚本的末尾。

第三你应该使用:

isset($_SESSION['admin'])

代替:

session_is_registered('admin')
于 2013-02-04T12:31:34.110 回答
0

这是由于您遇到的错误而引起的问题。当您收到错误输出时发送。所以修复错误因为它只是一个通知,如果你将你的 error_reporting 设置为 0 这将起作用。

参考:如何修复 PHP 中的“标头已发送”错误

if (!session_is_registered("admin"))改成if (!isset($_SESSION["admin"]))

于 2013-02-04T12:32:16.963 回答
0

因此,关于session_is_registered("admin")被弃用的警告是因为,不出所料,该函数已被弃用(实际上,已从 PHP 5.4+ 中删除)。您应该使用 . 检查变量是否存在isset($_SESSION["admin"])

第二个是因为,不知何故,在您发送标头之前,输出会滑出。您的代码在给定的调用之前似乎没有发送任何内容header,但这可能只是您的<?php领导者之前的一个空白字符。仔细检查您的代码,以确保您的文件以 PHP 领导者开头,而不是其他任何内容。

于 2013-02-04T12:32:50.050 回答
0

虽然两位发帖人所说的都是真的,但生成的输出实际上是使用 session_is_registered 的 E_DEPRECATED 错误。

一旦您将其更改为其他建议之一,您就不应该有问题。

此外,您绝对应该在标头重定向后立即放置“退出”。就目前而言,PHP 将执行整个页面,即使您尝试重定向非授权用户

于 2013-02-04T12:34:26.050 回答
0

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

于 2013-02-04T12:37:19.090 回答
-1

在您最近的编辑之后,您不应使用已弃用的功能,而应使用isset();

session_start当调用之前遇到一些输出时,就会出现这种情况。

一种解决方案是ob_start();session_start();

于 2013-02-04T12:28:27.063 回答