【问题标题】:PHP Sessions problem, help pleasePHP会话问题,请帮助
【发布时间】:2010-09-15 10:24:25
【问题描述】:

我正在为朋友的游戏制作物品商店,当访问商店时,我让它检查会话以查看您是否登录,如果您登录,它将带您到商店,如果您登录'它不会给你一个登录页面,我这样做的方式是这样的。

<?php 
  if($_SESSION['LoggedIn'] == 1)
  {
      //Shop stuff here
  }
  else
  {
    //Login stuff here
  }
?>

但是,当他们没有登录时,它会显示一个错误。

注意:未定义的索引:第 29 行 C:\wamp\www\shop\shop.php 中的 LoggedIn,第 29 行是 if($_SESSION['LoggedIn'] == 1) 我想在不禁用 PHP 错误的情况下阻止这种情况发生,知道怎么做吗?

【问题讨论】:

  • @Jacco 似乎在脚本之前的某个地方完成了,否则它将永远无法工作

标签: php mysql session logging


【解决方案1】:

改为这样做:

if (isset($_SESSION['LoggedIn']) && $_SESSION['LoggedIn'] == 1)

【讨论】:

    【解决方案2】:

    使用isset():

    if(isset($_SESSION['LoggedIn']) && $_SESSION['LoggedIn'] == 1) {
      // ...
    }
    

    【讨论】:

      【解决方案3】:

      为了增加答案的多样性,我想给你empty

      if(!empty($_SESSION['LoggedIn'])){
          //Shop stuff here
      }
      else{
          //Login stuff here
      }
      

      【讨论】:

        【解决方案4】:

        你可以使用

        if(isset($_SESSION['LoggedIn']))
        {
            //Shop stuff here
        }
        else
        {
            //Login stuff here
        }
        

        【讨论】:

          【解决方案5】:

          要使用 $_SESSION,重要的是首先使用指令 session_start () 开始会话;

          session_start();
          
          if($_SESSION['LoggedIn'] == 1)
          {
            //Shop stuff here
          }
          else
          {
          //Login stuff here
          }
          

          如果不存在此语句,则会话将不会打开,这意味着您已经放在那里的所有信息都将无法访问,因此在 $_SESSION 中读取或写入时要小心

          【讨论】:

            【解决方案6】:

            ...或政治不正确答案if (@$_SESSION['LoggedId'] == 1) {...} ;)

            【讨论】:

            • 想解释一下为什么这是一种不好的做法?人们经常喊“糟糕的做法!”当他们看到'@'时,甚至没有停下来思考。当上面的“@”会抑制一个重要错误从而向你隐藏一些重要信息时,你能给我举个例子吗?对我来说,'@' 是一种抑制通知的便捷方式,我在上面使用它的方式与isset() 示例完全相同。现在,如果我使用@fopen('/some/file'),那将是一个完全不同的故事。
            • 使用错误抑制几乎总是懒惰的表现。如果您选择抑制错误而不是进行适当的检查,那是不好的做法。程序员应该使用错误抑制的唯一时间是在触发错误的函数之后进行适当的错误检查(例如通过返回类型检查。实际上,您的@fopen(...); 示例就是其中一种情况。(if (($fp = @fopen($filename, 'r') === FALSE) { handleError(); } )。
            • 这不是答案。一般来说,我不想讨论错误抑制是否是懒惰的标志。我在问 isset() 和 @ 在手头的情况下有什么区别。您是否可以提出任何情况,其中 isset() 会产生与错误抑制不同的结果? this 案例有什么不同还是只是因为它包含在“php 中的不良做法”的一些项目符号列表中而成为“不良做法”?
            • 首先,我从不重复“因为它们在列表中”。我想我已经回答了你的问题。在这个特定的例子中,抑制错误是懒惰的表现。当您进行显式 isset 测试时,下一个程序员(或者一年左右后的您)可以读取一些额外的信息(此变量可能不会在代码中此时设置,等等)。如果你抑制错误,下一个程序员必须猜测:这个错误是因为快速修复错误而被抑制的吗?它是预期程序流程的一部分吗?原来的程序员知道为什么会弹出被抑制的错误吗?等等
            • 那么,这显然是一个初学者的问题。您只是将一个危险的工具交给了某人,而该工具通常在 PHP 中被滥用。如果您添加了关于为什么在这种特殊情况下可以使用它的解释,但通常应该对错误抑制非常谨慎,我不会对您投反对票。但是您只是删除了一行,没有任何解释。现在,OP 可以想:“嘿,这很方便,每当出现对我没有意义的错误时,我都可以将其关闭!”。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多