【问题标题】:Php session global variablesphp会话全局变量
【发布时间】:2012-11-22 08:30:34
【问题描述】:

我在 php 中使用会话,我使用 session_start 并存储一些从登录表单传递的变量,变量是代码开头的“user_name”和“user_role”我检查是否设置了这些变量,如果没有,重定向到登录屏幕。现在的问题是我有一个包含菜单选项的包含文件,如果用户是特权用户,它会显示比不是特权用户更多的选项。我的问题是,当包含文件被处理时,我得到PHP Notice: Undefined index: user_name in C:\inetpub\wwwroot\2StarsGames.com\SomeGame v4.1\interface\HeaderMenu.php on line 20'user_name' 因为我在其余文件中没有收到错误,所以我只是在这篇文章中包含了菜单文件。如果在单独的文件中,有人可以告诉我会话是否有特殊处理?

<div id="page_header"> 
<img class="logoImage" src="./img/some1.png" align="left" />
SUPER B 
<img class="logoImage" src="./img/some2.png" align="right" />
</div>

<div id="page_menu">
<center>
    <a class="menu" href="./Contest.php">Contest</a>
    <a class="menu" href="./Cards.php">Cards</a>
    <a class="menu" href="./PlayersPoints.php">Players Points</a>   
    <a class="menu" href="./SBCardsCode.php">Card's Code</a> 
    <a class="menu" href="./Avatars.php">Avatars</a>   
    <a class="menu" href="./Sims.php">Sims</a>   
    <a class="menu" href="./Boards.php">Boards</a> <br/>   
    <a class="menu" href="./Charity.php">Charity</a>
    <?php 
        $username = strtolower($_SESSION['user_name']);
        if($username == 'some name1' ||
           $username == 'some name2' ||
           $username == 'some name3' ||
           $username == 'some name4')
        {
            echo "          
                <a class='menu' href='./PayoutsNoWin.php'>Payouts</a>  
                <a class='menu' href='./Payins.php'>Payins|</a>            
                <a class='menu' href='./Payments.php'>Payments</a>
                <a class='menu' href='./Tools.php'>Tools</a>  
                <a class='menu' href='./TransferData.php'>Transfer Data</a>
                <a class='menu' href='./Games.php'>Games</a>
                ";
        }
    ?>
</center>

编辑 session_start() 在包含这个的文件中。

【问题讨论】:

  • 你确定session_startinclude 之前被调用吗?
  • 或者你在 $_session 中设置了用户名?
  • session_start 在文件中包含此文件的任何内容之前被调用。我还会检查顶部的这些变量,如果没有设置,我会重定向到登录屏幕。
  • 你能在这里给我 print_r() 表格吗?
  • 只有在包含菜单文件后设置$_SESSION 变量时才会发生这种情况,因此菜单文件还不能获得$_SESSION 键。我建议您在包含文件之前切换 $_SESSION 设置

标签: php session include global-variables


【解决方案1】:

您需要抑制错误报告:

$username = strtolower(@$_SESSION['user_name']);

或者更好的是,在使用变量之前检查 isset($_SESSION['user_name'])。

【讨论】:

  • 为什么要压制它?如果它在那里,则意味着有问题。我不应该更好地解决它吗?
  • 我不敢相信我正在这样做......但我必须选择一个答案,而你的答案虽然很老套,但似乎是最好的。我压抑着。 :( 没有错误,一切正常。我相信我很快就会回到这个,但我对这个东西太累了,无法继续寻找。请大家帮忙。
  • 欢迎使用生产代码 :)... 你应该使用 if(!empty($_SESSION['user_name'])) 或 if(isset($_SESSION['user_name'])) .然而,在这种情况下 - 对于任何有经验的程序员来说,为什么会抑制错误应该是显而易见的......尽管它是 hacky ;)
【解决方案2】:

错误似乎发生在这里:

$username = strtolower($_SESSION['user_name']);

“未定义索引”基本上意味着在 $_SESSION 变量中找不到 'user_name' 索引。

你能把你的代码贴在你设置这个的地方吗?
并确保此代码在您检查 $_SESSION['user_name'];

之前运行

【讨论】:

  • 在所有脚本中的 session_start 之后,我包含另一个名为 Lock.php 的文件,其中包含以下几行。 if(!isset($_SESSION['logged_in'], $_SESSION['user_name'], $_SESSION['user_role'])) { header('Location: Login.php');因此,既然我到达了它使用会话变量的地步,这意味着它们就在那里。至少我写代码时是这么想的。
  • 奇怪的是代码运行良好......我只是得到那个错误。这很奇怪。
  • 如果支付,工具菜单项被回显,你能包括一个“回声$用户名”来看看这个变量包含什么?您可能需要降低错误报告级别才能执行此操作。
  • 我注意到一些事情,该错误仅在我第一次登录时发生,但不会造成任何损坏,并且 print_r 显示会话数据已设置。所以代码中确实有问题。我会做更多的搜索。
猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 2012-04-24
  • 2011-07-31
  • 2011-08-02
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多