我正在使用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错误..
奇怪的是,我确实做到了这一点,但仍然会在“已发送的标题”中获得错误。
我想知道设计网站的最佳方式是什么,我必须在大多数网页上使用Session变量,并将这些常见检查保存在一个公共位置..
我有以下代码:
<?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");
}
?>
我知道在“?&gt;”之后有额外空格的常见错误,但我仍然得到它。
谢谢大家,我错过了,“connection.php”文件实际上在“?&gt;”后面有额外的空格我以前删除了它,但有些文件是如何重写的。谢谢了。
答案 0 :(得分:2)
•我可以使用include()功能吗?
是。你可以在session_start()调用之前做任何你想做的事情,但是你不能输出任何东西,甚至不能输出任何空格或字符。可能你已经输出了一些东西,可能是自动包含或apache prepend。
•会话只能通过php页面传递数据。 •什么是更好的方法?
其他方式是cookies,post和get参数。但会话是在页面之间安全传递数据而不将数据发送到客户端并返回的唯一方法(这可能会带来安全风险)
答案 1 :(得分:2)
是的,你可以使用include。将所有常用功能放在一个单独的php文件中,并将其“包含”在每个文件的顶部。
您可以使用cookie来存储信息(通常只是用于在PHP页面中查找其他信息的ID)。通常,PHP会话使用cookie处理。请参阅文档中的setcookie
。
由于<?php ?>
块之外的杂散字符,您可能收到错误消息。常见错误是在?>
之后的包含文件末尾有一个额外的空行。将输出该空白行,并且您的标题将被发送。如果这不是问题,您只需要确保将会话相关代码移动到可能生成某些输出的任何代码之上(例如,通过使用print或echo)。
答案 2 :(得分:1)
将ob_start();
写在代码顶部,然后您就不会收到“已发送标题”的错误