session_start()在每次重新加载时创建新会话

时间:2014-10-06 14:08:51

标签: php session

我之前读过这篇文章:

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上工作正常,当我想将它上传到服务器上时,会出现这种情况。

1 个答案:

答案 0 :(得分:2)

这段代码看起来设计得很差。除了通常的&#34; PHP4风格&#34;错误(稍后会详细介绍),对我来说并没有多大意义。

  1. 如果您正在使用PHP的会话,为什么还需要在数据库中复制会话表? Y使用session_start()你已经告诉PHP处理所有麻烦。
  2. 您为什么要访问用户&#39;饼干直接?
  3. 我建议您坚持使用设计并遵循它 您想自己管理会话,包括传递会话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;代码:

    1. 不要使用mysql_*个功能。他们已经弃用了。使用MySQLi或PDO,并尽可能使用预准备语句。例如,行mysql_query("select * from session_noti where sid='$user_cookie'");是SQL注入攻击的理想场所。
    2. 不要使用@运算符。太糟糕了!相反,只需检查变量是否与isset()empty()一起存在。