4

我是 PHP 新手,所以如果这是一个简单的问题,我深表歉意......

我正在将 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 通知:未定义索引:在第 6 行的 [文件位置].php 中确认

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

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

...我明白为什么会抛出错误。我不明白的是这段代码如何像在原始服务器上一样工作。我可能缺少配置设置吗?

*同样的问题发生在整个站点的数十个位置。这只是该问题的一种具体情况。

4

5 回答 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)) {

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

于 2009-08-31T20:26:05.087 回答
6

我建议优化阅读代码:

if (isset($_GET['confirm']) && ($_GET['confirm'] >= 13 && $_GET['confirm'] <= 16)) 

我完全同意乔希的提议。

于 2009-08-31T20:50:09.517 回答
3

isset()是一个有用的功能。如果变量存在则返回“true”,否则返回“false”。通常,人们将它与超全局赞一起使用,$_GET或者$_POST确定您是否是从网站上的另一个页面发送过来的——这允许您根据用户来自哪里以及正在标记的数据创建不同的操作。它还可以防止在尝试使用尚未定义的变量时出错,就像 OP 一样。因此,无需编写两个不同的 .php 文件并担心将用户发送到错误的文件,您可以在一页中完成所有操作。

杰,我会小心你对这些电话的使用。<?php比 更有可能工作<?。我听说 session_start() 应该是浏览器的第一件事,否则它可能会导致标题问题。是的,您需要在使用它之前声明一个变量 - 如果您没有输入[file].php?confirm=[some number]您的 URL,除非您修改它以允许中断,否则您的页面将会中断。

于 2011-03-22T21:02:57.027 回答
3

由于没有索引 $_GET['confirm'],PHP 会提示您正在查看未定义的索引。之所以显示该通知,是因为新服务器E_NOTICE在 error_reporting 某处设置了标志,无论是在 php.ini 还是在某些配置文件或在页面加载上运行的引导程序中。

从 php 手册中,E_NOTICE:“运行时通知。指示脚本遇到了可能表明错误的事情,但也可能在运行脚本的正常过程中发生。”

如果您不担心这些通知,您可以尝试关闭它们,或者使用它们来追踪可能存在问题的地方。

对于您发布的代码,一个简单的解决方法是将条件更改为

if(isset($_GET['confirm']) && <list of OR conditions>)

这样,如果没有“确认”索引,PHP 就会退出评估条件。

于 2009-08-31T20:39:25.217 回答
2

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

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

var_dump($_GET['confirm']);
于 2010-06-19T16:28:09.110 回答