PHP代码突然停止工作

PHP代码突然停止工作,php,arrays,session,Php,Arrays,Session,可能重复: 代码运行良好。必须重新启动服务器,但现在无法工作 我在“登录”页面的开头有这个页面(这是用户在验证密码后进入的页面) 在我以后的所有页面上,我都有 <?PHP session_start(); ?> <html> <head><title>Page Title</title> </head> <body> <?php /// Kick them out if they try to

可能重复:

代码运行良好。必须重新启动服务器,但现在无法工作

我在“登录”页面的开头有这个页面(这是用户在验证密码后进入的页面)

在我以后的所有页面上,我都有

<?PHP session_start(); ?> 
<html> 
<head><title>Page Title</title> 
</head> 
<body> 
<?php 
/// Kick them out if they try to open this page directly 
if ($_SESSION['valid']!='TRUE') { 
session_destroy(); 
die("<b>You must be logged into this application to use it</b>"); 
?> 

... code and html ... 

</body></html>

页面标题
... 代码和html。。。
这在以前工作得很好,但现在我得到:

注意:未定义的索引:在第9行的C:\inetpub\wwwroot\usermanager\selectuser.php中有效

您必须登录此应用程序才能使用它

当我将调试语句与print\r一起放入时,我只得到$\u SESSION值的“Array()”


为什么它不再工作了?!?为了弄明白这一点,我已经绞尽脑汁四个小时了。代码中没有任何更改,它正在工作。

没错
$\u SESSION
实际上是存储的会话变量数组。第二个代码不起作用,因为从技术上讲,
$\u会话
数组中没有有效的
变量。最好使用:
if(!isset($\u SESSION['valid'])

通知告诉您该索引没有设置任何内容,因此
未定义索引

解决此问题的一种方法是使用
isset()
检查变量是否已设置,然后再进行比较或从中获取值

if (!isset($_SESSION['valid'])) { 
    session_destroy(); 
    die("<b>You must be logged into this application to use it</b>"); 
?> 

您可以将
if
语句更改为:

<?php 
if isset($_SESSION['valid']) && $_SESSION['valid'] == 'TRUE' ; ?> 


但是,为什么要使用字符串“TRUE”来表示php在预定义的布尔值
TRUE
中包含的内容呢?

感谢所有响应者。结果是会话存储有问题

里面有一大堆垃圾文件。我们在几个虚拟机上安装了web服务器,同一台机器上的另外两个服务器出现了问题

我们把整个网站移到了一个新的虚拟机上,现在一切正常

不过,我确实了解了isset()的价值,所以这一天并不是完全浪费


谢谢大家的帮助!感恩节快乐

感谢所有回应的人。结果是会话存储有问题

我查看了路径,这是正确的,但当我在机器上实际访问时,它充满了垃圾文件和文件名,其中包含坏字符。我们在同一台服务器上的多个虚拟机上运行着各种web服务器,不同领域的其他几个服务器也有问题

我们把整个网站移到了一个新的虚拟机上,现在一切正常

不过,我确实了解了isset()的价值,因此我现在不仅可以向注销的用户显示错误,还可以向从未登录的用户显示错误,因此这一天并不是完全浪费


再次感谢您的帮助和感恩节快乐

那么它在什么之前就开始工作了?您是否升级了PHP、更改了服务器、修改了临时目录或类似的内容?他的代码不起作用,因为尚未设置有效变量,因此PHP无法引用它。将“TRUE”更改为TRUE并不能修复任何问题。作为测试,我输入了一个字符串变量:$\u SESSION['teststring']=“hello world”,当我转到后续页面并尝试“echo$\u SESSION['teststring'];我得到了未定义的索引:teststring errorMrXenotype,看起来它是在我的第一个文件中设置的?如果
error\u reporting
被设置为排除
E\u NOTICE
,那么代码可以在服务器上正常工作。我假设您切换了服务器或更改了一些配置内容。或者,
if(空($\u SESSION['valid']))
,如果会话['valid']
已设置但为false。那么,我是否完全错误地理解了会话变量的使用,即将值从应用程序中的一个页面传递到另一个页面的方式?我想我可以使用隐藏的表单字段来代替并发布它们。我试图做的是通过直接从PHP页面的URL访问该页面来防止用户绕过安全性,即使hem首先浏览landing.php。不,你对它理解得很好。会话变量就是这样工作的,你可以传递它们。问题是,考虑一下这个问题:如果你注销,然后用户按返回到这个页面,会话就已经结束了,这个变量就不存在了。所以只需使用
isset()
您会没事的。谢谢,但为什么不设置它?会话变量的目的不是在所有网页上传递变量吗?因为您只在有人登录/访问其他页面后才将变量设置为true-如果该值不存在会发生什么情况。例如,登录过期或未登录的用户尝试访问page、 但即使他们访问了另一个页面,错误仍然会发生。这就是问题所在。我转到第一页,设置了会话变量,然后单击链接转到第二页--仍然在同一个会话中--但变量不见了。@Scotthayer可能会话路径不可写,当您尝试设置
$\u会话['test'时会发生什么='0';
并尝试在另一个页面上访问它?同样的错误。请参阅我自己的答案,下面是精简的代码。我不是一个服务器人员。会话路径存储在哪里?如何更改它?True(不是双关语)。我对PHP不熟悉,所以只使用了字符串值,但无论发生什么情况,都会发生同样的事情。如果我使用$\u session['testvalue']=“Hello World“在第1页,当用户单击链接并转到第2页时,“echo$\u会话['testvalue']”会弹出未定义的索引testvalue消息,而不是打印“Hello world”!
if (!isset($_SESSION['valid'])) { 
    session_destroy(); 
    die("<b>You must be logged into this application to use it</b>"); 
?> 
if (!is_writable(session_save_path())) {
    echo session_save_path().'" is not writable!'; 
}
<?php 
if isset($_SESSION['valid']) && $_SESSION['valid'] == 'TRUE' ; ?>