PHP $_GET和$_POST未定义问题

4

我是新手,如果这个问题很简单,请见谅...

我正在将一个PHP网站从一个服务器迁移到另一个服务器。新服务器是IIS 7.0,PHP版本为5.2.1,并且开启了短标签,但我不知道原始服务器的设置情况(我只收到了代码)。

以下是页面上第一个代码段:

<?
ob_start();
session_start();

if($_GET['confirm'] == 13 || $_GET['confirm'] == 14 || $_GET['confirm'] == 15 || $_GET['confirm'] == 16) 
{
    include("test/query/test_query.php");
}
?>

当该页面执行时,总是显示以下错误:

PHP通知:在[file location].php的第6行中未定义索引: confirm

此外,用户通过从主页(一个标准的HTML页面)重定向访问此页面。当正确导航到页面时,完整的URL如下:

http://www.[site].com/test.php#login

... 我了解为什么会出现错误。我不明白的是这段代码在原始服务器上如何能够正常工作。我是否可能缺少配置设置?

*网站中的数十个位置都存在同样的问题。这只是该问题的一个具体表现。


我会再次检查您是否已将所有文件从旧服务器复制过来。此外,是否还有需要复制的数据库? - Phill Pafford
5个回答

28
新服务器的error_reporting设置为E_ALL。你看到的是一个通知,而不是一个错误。请尝试:
error_reporting(E_ALL ^ E_NOTICE)

当错误报告设置为E_ALL时,访问未设置的数组成员会生成一个错误。如果您不希望降低错误报告级别,在检查$_GET['var']之前,请更改您的代码为:

if(isset($_GET['confirm']) && ($_GET['confirm'] == 13 || $_GET['confirm'] == 14 || $_GET['confirm'] == 15 || $_GET['confirm'] == 16)) {

通过在实际访问$_GET['confirm']之前添加isset()函数的调用,您将验证您是否正在访问未设置的数组成员。(只有当URL以?confirm=...?something...&confirm=...结尾时,$_GET['confirm']才会被设置)

4
OP正在经历一些粗糙的编码实践,没有其他更多的情况。 - Lucas Oman

6
我建议优化代码以便更易读取:
if (isset($_GET['confirm']) && ($_GET['confirm'] >= 13 && $_GET['confirm'] <= 16)) 

我完全同意Josh的提议。


我更倾向于建议使用switch...case,但这比原始脚本要好得多。 - nikc.org

3

isset() 是一个有用的函数。它如果变量存在则返回“true”,否则返回“false”。通常,人们与超级全局变量一起使用,比如 $_GET$_POST ,以确定你是否从站点上的另一个页面发送 - 这允许您根据用户来自何处以及携带哪些数据创建不同的操作。它还可以防止尝试使用尚未定义的变量而导致的错误,就像 OP 所遇到的那样。因此,您可以在一个页面中完成所有操作,而无需编写两个不同的 .php 文件并担心将用户发送到错误的文件。

Jay, 我建议你小心使用这些调用。 <?php<? 更容易工作。我听说 session_start() 应该是设置给浏览器的第一件事,否则会导致头部问题。是的,您需要在使用之前声明变量 - 如果您没有在 URL 中键入 [file].php?confirm=[some number],您的页面将会崩溃,除非您修改它以允许断点。


3
由于没有索引$_GET['confirm'],PHP会抛出一个通知,告诉您正在查看未定义的索引。该通知显示是因为新服务器在某个地方设置了E_NOTICE标志(可能在php.ini、某个配置文件或页面加载时运行的启动程序中)。
从PHP手册中可知,E_NOTICE表示“运行时注意事项。表示脚本遇到可能指示错误但在正常运行脚本时也可能发生的情况。”
如果您不担心这些问题,可以尝试关闭这些通知,或者利用它们来追踪可能存在问题的地方。
对于您发布的代码,一个简单的解决方法是将条件更改为:
if(isset($_GET['confirm']) && <list of OR conditions>)

那样的话,如果没有“confirm”索引,PHP就会停止评估条件。

+1 是为了添加手册中 E_NOTICE 的描述。但请记得将 <lost of conditions> 用括号 ( 和 ) 括起来,因为 || 的优先级低于 &&! - Josh

2

这是因为confirm查询字符串变量似乎没有设置,您可以像这样检查:

ini_set('display_errors', true);
error_reporting(E_ALL);

var_dump($_GET['confirm']);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接