PHP会话问题,请帮助

PHP会话问题,请帮助,php,mysql,session,logging,Php,Mysql,Session,Logging,我正在为我朋友的游戏制作一个物品商店,当访问商店时,我让它检查会话,看看你是否登录,如果你是,它会带你去商店,如果你不是,它会给你一个登录页面,我这样做的方式是这样的 <?php if($_SESSION['LoggedIn'] == 1) { //Shop stuff here } else { //Login stuff here } ?> 但是,当他们没有登录时,它向我显示了一个错误 注意:第29行的C:\wamp\www\s

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

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

但是,当他们没有登录时,它向我显示了一个错误

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

使用:

使用:

改为这样做:

if (isset($_SESSION['LoggedIn']) && $_SESSION['LoggedIn'] == 1)
改为这样做:

if (isset($_SESSION['LoggedIn']) && $_SESSION['LoggedIn'] == 1)
你可以用

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

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

为了增加答案的多样性,我想给大家:


为了增加答案的多样性,我想给大家:


要使用$_SESSION,必须首先使用指令SESSION_start()启动会话


如果此语句不存在,会话将不会打开,这意味着您已经放置在那里的所有信息都将无法访问,因此在$\u session

中读取或写入时要小心。要使用$\u session,首先使用指令session _start()启动会话非常重要


如果此语句不存在,会话将不会打开,这意味着您已经放置在那里的所有信息都将无法访问,因此在$\u session

..或政治上不正确的答案
中阅读或写入时要小心(@$\u session['LoggedId']==1){…}
;)

…或政治上不正确的答案
如果(@$_SESSION['LoggedId']==1){…}
;)

@Jacco似乎在脚本中的某个地方做过,否则它永远不会成功work@Jacco在脚本中似乎是在以前的某个地方完成的,否则,解释为什么这是一种不好的做法永远不会管用?当人们看到“@”时,往往会大叫“坏习惯!”,甚至不停地思考。你能给我举个例子吗,上面的“@”会抑制一个重要错误,从而对你隐藏一些重要信息?对我来说,@是一种抑制通知的简便方法,我在上面使用它的方式与
isset()
示例完全相同。现在,如果我使用
@fopen('/some/file')
,情况就完全不同了。使用错误抑制几乎总是懒惰的表现。如果您选择抑制错误而不是进行适当的检查,这是一种不好的做法。程序员唯一应该使用错误抑制的时间是在触发错误的函数之后进行正确的错误检查时(例如通过返回类型检查)。实际上,
@fopen(…);
的示例就是这种情况之一。
if($fp=@fopen($filename,'r')==FALSE){handleError();
)。这不是一个答案。我不是想讨论错误抑制是否是懒惰的标志。我只是想问,在目前的案例中,isset()和@之间有什么区别。你能想到什么情况下isset()会产生与错误抑制不同的结果?在这种情况下有什么区别吗“坏习惯”只是因为它包含在“php中的坏习惯”的列表中?首先,我从不重复“因为它们在列表中”。我想我已经回答了你的问题。在这个特定的例子中,抑制错误是懒惰的表现。当你做显式isset测试时,下一个程序员(或者,大约一年后,您可以读取一些额外的信息(代码中可能没有在此时设置此变量,等等)。如果你抑制错误,下一个程序员必须猜测:这个错误是因为一个快速的错误修复而被抑制的吗?它是预期程序流的一部分吗?原始程序员知道为什么会出现抑制的错误吗?等等。然后,这显然是一个初学者的问题。你刚刚递给某人一个危险的工具,这个工具通常比ot在PHP中被误用。如果您添加了一个解释,说明为什么在这种特殊情况下可以使用它,但在一般情况下应该非常小心错误抑制,我不会对您投反对票。但是您只删除了一行,没有任何解释。现在,OP可能会想:嘿,这很方便,每当出现对我没有意义的错误时,我都可以把它关掉!想解释一下为什么这是一种不好的做法吗?人们经常喊“不好的做法!”当他们看到“@”时,甚至不停地思考。你能给我一个例子,上面的“@”会抑制一个重要错误,从而隐藏一些重要信息吗?对我来说,“@”是一种抑制通知的简便方法,我在上面使用它的方式与
isset()
示例完全相同。现在,如果我使用
@fopen(“/some/file”)
那将是一个完全不同的故事。使用错误抑制几乎总是懒惰的标志。如果你选择抑制错误而不是进行适当的检查,这是一种不好的做法。程序员应该使用错误抑制的唯一时间是在触发错误的函数之后进行适当的错误检查时(例如通过返回类型检查。实际上,
@fopen(…);
的示例就是这些情况之一。
如果($fp=@fopen($filename,'r')==FALSE){handleError();}
)。这不是一个答案。我不是想讨论错误抑制是否是懒惰的标志。我只是想问,在目前的案例中,isset()和@之间有什么区别。你能想到什么情况下isset()会产生与错误抑制不同的结果?在这种情况下有什么区别吗“坏习惯”只是因为它包含在“php中的坏习惯”的列表中?首先,我从不重复“因为它们在列表中”。我想我已经回答了你的问题。在这个特定的例子中,抑制错误是懒惰的表现。当你做显式isset测试时,下一个程序员(或者你,大约一年后
session_start();

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