0

我正在使用 PHP 制作一个简单的动态网站,我允许用户登录然后访问特定页面。所以这就是我到目前为止所做的。

登录值是通过 php 脚本中的 $_POST 变量获取的,它从数据库中为注册用户获取值。如果找到用户,我将执行以下操作:

session_register('userid');
$_SESSION['userid'] = $username;//this is taken from $_POST
$_SESSION['accesslevel'] = $access;

在我放的 php 脚本的开头session_start();

现在我的问题来了。

现在在每个页面上,我必须检查用户是否被允许查看该页面,如果他不是,那么他必须被重定向到 login.php,如果他是,那么页面加载必须继续。

现在到目前为止,我所学到的是,在 php 页面中维护值的唯一方法是使用$_SESSION变量,并且我使用会话变量的任何页面我都必须session_start()在每个页面上写为第一行,否则我将得到 Headers Already Sent错误..

奇怪的是,我确实做到了,但仍然会出现“已发送标题”的错误。

所以我想设计一个网站的最佳方式是什么,我必须在大多数页面上使用会话变量,并将这些常见的检查放在一个共同的地方..

  • 我可以如何使用 include() 功能吗?
  • 会话是跨 php 页面传递数据的唯一方式。
  • 有什么更好的方法?

我有以下代码:

<?php
session_start();
if(!isset($_SESSION['user']))
{
    $_SESSION['loc'] = "adminhome.php";
    header("location:ettschoollogin.php");
    exit();
}
    ?>

它位于要检查用户是否已登录的每个页面的顶部。

这是检查登录的脚本

<?php
session_start();
include("connection.php");
$userid =$_POST['userid'];
$userpwd =$_POST['userpwd'];

$query="Select UNAME,UPASSWORD,SCHOOL,uaccess from schooluser where uname = '$userid'";

$result=mysql_query($query) or die("couldn't execute the query");
$row=mysql_fetch_array($result);
$useraccess = $row["uaccess"];


$school =$row[2];

if(($row[0]==$userid)&&($row[1]==$userpwd))
{
        session_register('userid');
        $_SESSION['userid']=$userid;
        $_SESSION['school']=$school;

    if($useraccess =="admin")   
    {       
        header("Location:adminhome.php");
    }

    if($useraccess !="admin")
    {
        header("Location:school_main.php");

    }
}
else
{
    header("Location:ettschoollogin.php?err=1"); 
}
?>

我知道在“?>”之后有多余空格的常见错误,但我仍然明白。

谢谢大家,我错过了,“connection.php”文件实际上在“?>”之后有多余的空格,我之前已经删除了它,但是文件又是如何被重写的。非常感谢。

4

3 回答 3

2

•我可以如何使用include() 功能吗?

是的。你可以在 session_start() 调用之前做任何你想做的事情,只是,你不能输出任何东西,甚至不能输出一个空格或字符。可能您已经输出了一些东西,可能是自动包含或 apache 前置。

• 会话是跨php 页面传递数据的唯一方式。• 有什么更好的方法?

其他方式是 cookie、post 和 get 参数。但是会话是在页面之间安全地传递数据而不将它们发送到客户端并返回的唯一方法(这可能会带来安全风险)

于 2009-08-24T12:15:26.563 回答
2

是的,您可以使用包含。将所有常用函数放在一个单独的 php 文件中,并将其“包含”在每个文件的顶部。

您可以使用 cookie 来存储信息(通常只是一个用于在 PHP 页面中查找其他信息的 ID)。通常,PHP 会话是使用 cookie 处理的。请参阅setcookie文档。

由于<?php ?>块外的杂散字符,您可能会收到错误消息。一个常见的错误是在包含文件的末尾有一个额外的空行,在?>. 该空白行将被输出,并且您的标题将已发送。如果这不是问题,您只需要确保将与会话相关的代码移到任何可能生成一些输出的代码之上(例如,通过使用打印或回显)。

于 2009-08-24T12:19:42.307 回答
1

ob_start();在代码的顶部,然后您不会收到“标头已发送”的错误

于 2012-08-22T05:35:14.217 回答