我之前读过这篇文章:
How to fix “Headers already sent” error in PHP
我有一个会话页面,当我刷新/重新加载它时,它会创建一个新的会话ID!
<?php
$islogin=0;
$idadmin=0;
session_start();
$sid=session_id();
include("connect.php");
$result=mysql_query("select * from session_noti where sid='$sid'",$cn);
if(mysql_num_rows($result) > 0){
$row=mysql_fetch_object($result);
$islogin=$row->islogin;
$idadmin=$row->idadmin;
}else{
if(mysql_query("insert into session_noti (sid,islogin) values ('$sid',0);")){
}else{
}
}
$user_cookie=@$_COOKIE["*****"];
if($user_cookie != ''){
$user_cookie_res=mysql_query("select * from session_noti where sid='$user_cookie'");
$user_cookie_row=mysql_fetch_object($user_cookie_res);
$islogin=$user_cookie_row->islogin;
$idadmin=$user_cookie_row->idadmin;
}
?>
连接页面:
<?php
$cn = mysql_connect("localhost","root","");
mysql_select_db("***");
?>
为什么呢?它在localhost上工作正常,当我想将它上传到服务器上时,会出现这种情况。
答案 0 :(得分:2)
这段代码看起来设计得很差。除了通常的&#34; PHP4风格&#34;错误(稍后会详细介绍),对我来说并没有多大意义。
我建议您坚持使用设计并遵循它
您想自己管理会话,包括传递会话ID,处理cookie等吗?然后不要使用PHP的内置会话(但要小心:在这里编写有缺陷的代码的可能性非常高)。
你想使用PHP的内置会话吗?然后坚持下去。
如果您想附加每个用户的详细信息,例如&#34; isAdmin&#34;,您可以使用会话变量:这是他们为以下所做的事情:)
<?php
session_start();
if(empty($_SESSION)) {
// Redirect to login
}
else {
if(empty($_SESSION['logged_in'])) {
// Redirect to login
}
else {
// User is logged in
// Is admin?
if(!empty($_SESSION['is_admin'])) {
// YES
}
else {
// NO
}
}
}
?>
有很多关于使用PHP会话的指南和教程。例如:http://www.phpro.org/tutorials/Introduction-To-PHP-Sessions.html
此外,请确保在php.ini会话中启用。我强烈建议使用&#34; cookie_only&#34;会话:也就是说,永远不要让PHP将会话ID作为GET或POST参数传递。那会禁用那些禁用cookie的用户(还有一些吗?),但是会使所有其他用户免于成为会话劫持的简单目标。
如此说...关于你的&#34; PHP4风格&#34;代码:
mysql_*
个功能。他们已经弃用了。使用MySQLi或PDO,并尽可能使用预准备语句。例如,行mysql_query("select * from session_noti where sid='$user_cookie'");
是SQL注入攻击的理想场所。@
运算符。太糟糕了!相反,只需检查变量是否与isset()
或empty()
一起存在。