Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP的“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”_Php_Arrays_Variables_Warnings_Undefined Index - Fatal编程技术网

使用PHP的“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”

使用PHP的“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”,php,arrays,variables,warnings,undefined-index,Php,Arrays,Variables,Warnings,Undefined Index,我正在运行一个PHP脚本,并继续收到如下错误: 注意:未定义变量:第10行C:\wamp\www\mypath\index.php中的my\u variable\u name 注意:未定义索引:第11行的my_index C:\wamp\www\mypath\index.php 第10行和第11行如下所示: echo "My variable value is: " . $my_variable_name; echo "My index value is: &quo

我正在运行一个PHP脚本,并继续收到如下错误:

注意:未定义变量:第10行C:\wamp\www\mypath\index.php中的my\u variable\u name

注意:未定义索引:第11行的my_index C:\wamp\www\mypath\index.php

第10行和第11行如下所示:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
这些错误消息的含义是什么

为什么它们突然出现?我使用这个脚本多年了,从来没有遇到过任何问题

我怎样修理它们

这是一个一般的参考问题,人们可以将其作为重复链接,而不必反复解释这个问题。我觉得这是必要的,因为在这个问题上,大多数现实世界的答案都非常具体

相关元讨论:

试试这些

问题1:此通知意味着$varname不可用 在当前的范围内定义 剧本

问题2:在使用任何可疑变量之前,使用isset、空条件效果良好

或者,作为一种快速而肮脏的解决方案:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);
关于会议的说明:

使用会话时,会话启动;需要使用会话将放置在所有文件中


通常是因为糟糕的编程,以及现在或以后出错的可能性

如果是错误的,首先对变量进行正确赋值:$varname=0; 如果它确实只是偶尔定义的,那么在使用它之前测试它:If isset$varname 如果是因为你拼错了,就纠正它 甚至可能在PHP设置中出现警告
这意味着您正在测试、评估或打印尚未分配任何内容的变量。这意味着您要么有输入错误,要么需要先检查变量是否初始化为某个值。检查逻辑路径,可以在一个路径中设置,但不能在另一个路径中设置。

注意:未定义变量 来自世界的巨大智慧:

在将一个文件包含到另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的。它也是一个打开的大调。在使用未初始化的变量时会发出级别错误,但在向未初始化的数组追加元素时不会发出级别错误。语言构造可用于检测变量是否已初始化。此外,更理想的解决方案是,因为如果变量未初始化,它不会生成警告或错误消息

发件人:

如果变量不存在,则不会生成警告。这意味着 空本质上是简洁的等价物!isset$var | |$var ==错误

这意味着您只能使用empty来确定是否设置了变量,此外,它会根据以下内容检查变量:0、0.0、0、null、false或[]

例如:

在中测试上述代码段

尽管PHP不需要变量声明,但它还是建议使用它,以避免出现一些安全漏洞或bug,在这些漏洞或bug中,人们会忘记为稍后在脚本中使用的变量赋值。PHP在未声明变量的情况下所做的是发出一个非常低级的错误,E_注意到,默认情况下甚至没有报告这个错误,而是在开发过程中手动报告的

处理这一问题的方法:

建议:声明变量,例如,当您尝试将字符串附加到未定义的变量时。或在引用它们之前使用/检查它们是否已声明,如中所示:

//Initializing variable
$value = ""; //Initialization value; Examples
             //"" When you want to append stuff later
             //0  When you want to add numbers later
//isset()
$value = isset($_POST['value']) ? $_POST['value'] : '';
//empty()
$value = !empty($_POST['value']) ? $_POST['value'] : '';
这在PHP 7.0中变得更加清晰,现在您可以使用:

设置一个E_通知,并将消息从标准输出重定向到日志文件:

set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
从报告中禁用E_通知。仅排除E_通知的快速方法是:

使用命令来抑制错误

注意:强烈建议只实现第1点

注意:未定义索引/未定义偏移 当您或PHP尝试访问数组的未定义索引时,会出现此通知

处理这一问题的方法:

在访问该索引之前,请检查该索引是否存在。为此,您可以使用或:

当语言构造试图访问不存在的数组索引时,它可能会生成:

list($a, $b) = array(0 => 'a');
//or
list($one, $two) = explode(',', 'test string');
两个变量用于访问两个数组元素,但是只有一个数组元素,即索引0,因此这将生成:

注意:未定义的偏移量:1

$\u POST/$\u GET/$\u会话变量 使用$\u POST、$\u GET或$\u会话时,上述通知经常出现。对于$\u POST和$\u GET,您只需在使用它们之前检查索引是否存在。对于$\u会话,您必须确保会话已开始,并且索引也存在

还请注意,所有3个变量都是和,都是大写

相关的:

错误显示 对于不需要的和冗余的通知,可以使用专用于»隐藏«未定义的变量/索引消息

$var = @($_GET["optional_param"]);
这通常是不鼓励的。纽克 奥马尔人往往过度使用它。 如果应用程序逻辑中的代码忽略了不应该声明的未声明变量,例如函数参数或循环中的未声明变量,这是非常不合适的。 在isset上有一个颠倒的地方?:或者??然而,超级压制。通知仍然可以被记录。人们可能会通过以下方式复活隐藏的通知:set_error_handlervar_dump; 另外,您不应该习惯性地在初始代码中使用/推荐if$\u POST[shubmit]。 新来的人不会发现这样的打字错误。它只是剥夺了你在这些情况下的PHPs通知。仅在验证功能后添加@或isset。 首先解决原因。不是通知

对于$\u GET/$\u POST输入参数来说,主要是可以接受的,特别是如果它们是可选的。 由于这涵盖了大多数此类问题,让我们进一步探讨最常见的原因:

$\u GET/$\u POST/$\u请求未定义的输入 遇到未定义的索引/偏移量时,您要做的第一件事是检查输入错误: $count=$\你得到了什么

这是一个预期的键名,并且出现在每个页面请求中吗? 在PHP中,变量名和数组标记区分大小写。 其次,如果通知没有明显的原因,请使用或验证所有输入数组的当前内容:

var_dump($_GET);
var_dump($_POST);
//print_r($_REQUEST);
两者都将显示脚本是否使用正确的参数或任何参数调用

或者使用或另外使用,并检查“网络”选项卡中的请求和参数:

POST参数和GET输入将分别显示

对于$\u获取参数,您还可以查看

PHP有一些规则可以将非标准参数名转换为超全局参数。Apache也可以进行一些重写。 您还可以通过这种方式查看提供的原始$_COOKIES和其他HTTP请求头

更明显的是,请查看您的浏览器地址栏:

http://example.org/script.php?id=5&sort=desc

名称=后面的值对?问号是您的查询获取参数。因此,此URL可能只会生成$\u GET[id]和$\u GET[sort]

最后检查您的和声明,如果您需要一个参数,但没有收到任何参数

确保每个必需的输入都有一个 id=或title=属性不够。 method=POST表单应该填充$\u POST。 而一个方法=GET或省略它将产生$\u GET变量。 表单还可以通过$\u get提供action=script.php?get=param和$\u POST中剩余的method=POST字段。 使用现代PHP配置≥ 5.6再次使用它已不再流行,因为它会将获取和发布参数混为一谈。 如果您使用mod_rewrite,那么您应该检查access.log并启用以找出缺少的参数

$\u文件 同样的健全性检查也适用于文件上载和$_文件[formname]。 此外,检查enctype=多部分/表单数据 以及声明中的method=POST。 另见: 美元饼干 $\u COOKIE数组永远不会在setcookie之后立即填充,而是仅在任何后续HTTP请求上填充。 此外,它们的有效性超时,它们可能是子域或单个路径的约束,用户和浏览器可以拒绝或删除它们。
我不想禁用通知,因为它很有用,但我想避免过多的键入

我的解决方案是这个函数:

function ifexists($varname)
{
  return(isset($$varname)?$varname:null);
}
因此,如果我想引用$name并在存在时回显,我只需写:

<?=ifexists('name')?>
在第页中,如果我想引用$\u请求['name']:

<?=ifexistsidx($_REQUEST,'name')?>

这是因为未定义变量“$user_location”。如果使用的是在其中声明“$user\U location”变量的任何If循环,则还必须有一个else循环并定义相同的循环。例如:

$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;
上述代码将创建错误,因为if循环不满足,并且else循环中未定义“$user\u location”。仍然要求PHP回显变量。因此,要修改代码,必须执行以下操作:

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;

我一直使用自己有用的函数exst,它可以自动声明变量

您的代码将被删除-

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}

为什么不保持简单呢

<?php
error_reporting(E_ALL); // making sure all notices are on

function idxVal(&$var, $default = null) {
         return empty($var) ? $var = $default : $var;
  }

echo idxVal($arr['test']);         // returns null without any notice
echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

?>

快速修复方法是在代码顶部将变量赋值为null

$user_location = null;

获取输入字符串的最佳方法是:

这一班轮几乎相当于:

if (!isset($_POST['value'])) {
    $value = null;
} elseif (is_array($_POST['value'])) {
    $value = false;
} else {
    $value = $_POST['value'];
}
如果您绝对想要字符串值,就像:

$value = (string)filter_input(INPUT_POST, 'value');

我过去常常诅咒这个错误,但提醒您避开用户输入可能会有所帮助

例如,如果您认为这是一个聪明的速记代码:

// Echo whatever the hell this is
<?=$_POST['something']?>
……再想一想!更好的解决方案是:

// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>
我使用一个自定义html函数来转义字符,您的里程数可能在一种非常简单的语言中有所不同。错误在于您使用的变量$user\u location不是您之前定义的,它没有任何值,因此我建议您在使用它之前请声明此变量,例如:$user\u location=;或$user_location='洛杉矶'; 这是一个非常常见的错误。所以不要担心,只需声明变量并享受编码。

回答为什么它们会突然出现?我曾经 使用这个脚本多年了,我从来没有遇到过任何问题

大多数站点在默认错误报告“显示所有错误,但不显示“通知”和“已弃用”的情况下运行是非常常见的。这将在php.ini中设置,并应用于服务器上的所有站点。这意味着示例中使用的通知将被隐藏,而其他被认为更重要的错误将被显示/记录

另一个关键设置是可以隐藏错误,即显示错误设置为off或syslog

这种情况下会发生的情况是,错误报告被更改为也按照示例显示通知,和/或设置被更改为在屏幕上显示错误,而不是抑制错误/记录错误

他们为什么改变了

最明显/最简单的答案是,有人在php.ini中调整了这些设置,或者php的升级版本现在使用的是与以前不同的php.ini。那是第一个看的地方

但是,也可以在中覆盖这些设置

.htconf Web服务器配置,包括vhost和子配置* .htaccess 在php代码本身中 任何一个都有可能被改变

此外,web服务器配置还可能会启用/禁用.htaccess指令,因此如果.htaccess中的指令突然启动/停止工作,则需要检查该指令

.htconf/.htaccess假设您以apache运行。如果运行命令行,这将不适用;如果运行IIS或其他Web服务器,则需要相应地检查这些配置

总结

检查错误报告和显示错误php.ini中的php指令没有更改,或者您没有使用与以前不同的php.ini。 检查错误报告和显示错误。htconf或vhosts等中的php指令未更改 检查错误报告和显示错误。htaccess中的php指令未更改 如果在.htaccess中有指令,请检查在.htconf文件中是否仍然允许它们 最后检查代码;可能是一个无关的图书馆;要查看是否在那里设置了错误报告和显示错误php指令。
关于问题的这部分:

为什么它们突然出现?我使用这个脚本多年了,从来没有遇到过任何问题

没有明确的答案,但以下是一些可能的解释,解释为什么设置会“突然”改变:

您已将PHP升级到一个更新的版本,该版本可以具有错误报告、显示错误或其他相关设置的其他默认值

您已经删除或引入了一些代码,这些代码可能是在依赖项中使用ini_set或error_reporting搜索在运行时设置相关设置的代码

您更改了Web服务器配置,假设apache here:.htaccess文件和vhost配置也可以操作php设置

通常不会显示/报告通知,请参见 因此,在设置服务器时,可能由于某些原因无法加载php.ini文件文件权限??你是在默认设置上。后来,“bug”被意外地解决了,现在它可以加载正确的php.ini文件,并将错误报告设置为显示通知

为什么会这样? 随着时间的推移,PHP已经成为一种更加注重安全性的语言。以前默认关闭的设置现在默认打开。E_STRICT就是一个很好的例子,它在默认情况下于启用

此外,根据PHP文档,默认情况下,PHP.ini中禁用了E_通知。PHP文档推荐。然而,当我从Ubuntu存储库和BitNami的Windows堆栈下载PHP时,我看到了其他东西

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
请注意,错误报告实际上默认设置为生产值,而不是默认值。这有点令人困惑,在php.ini之外没有文档记录,所以我没有在其他发行版上验证过这一点

但是,为了回答您的问题,此错误现在会在以前未弹出时弹出,因为:

您安装了PHP,新的默认设置的文档记录有点糟糕,但不排除E_通知

注意,像未定义变量和未定义索引这样的警告实际上有助于使代码更干净、更安全。我可以告诉你,几年前,启用E_通知迫使我声明我的变量。这使学习C变得容易多了,因为不声明变量更麻烦

我能怎么办? 通过复制默认值E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED并将其替换为当前在等号登录错误后未注释的值来关闭E_NOTICE。重新启动Apache,如果使用CGI或FPM,则重新启动PHP。确保您正在编辑正确的php.ini。如果您使用Apache运行PHP,则正确的版本是Apache,如果运行PHP-fpm,则正确的版本是PHP fpm,如果运行PHP-cgi,则正确的版本是cgi,等等。这不是 推荐的方法,但如果您有非常难以编辑的遗留代码,那么它可能是您的最佳选择

关闭文件或文件夹级别的E_通知。如果您有一些遗留代码,但希望以正确的方式进行操作,那么这可能更可取。为此,您应该咨询Apache2、Nginx或您选择的任何服务器。在Apache中,您将在中使用php_值

重新编写代码,使其更干净。如果您需要在移动到生产环境时执行此操作,或者不希望有人看到您的错误,请确保您正在禁用任何错误显示,并且仅记录您的错误请参阅php.ini中的显示错误和记录错误以及您的服务器设置

扩展选项3:这是理想的选择。如果你能走这条路,你应该走。如果最初不走这条路线,请考虑通过在开发环境中测试代码来最终移动此路由。当你这么做的时候,摆脱~E_STRICT和~E_DEPRECATED,看看将来会出什么问题。您将看到许多不熟悉的错误,但这将阻止您在将来需要升级PHP时遇到任何不愉快的问题

这些错误意味着什么? 未定义变量:my_variable_name-使用前未定义变量时发生此情况。当执行PHP脚本时,它在内部只假设一个空值。但是,在哪种情况下,您需要在定义变量之前检查它?最终,这是一个草率代码的理由。作为一名开发人员,当我看到一个开源项目时,我可以告诉你,我喜欢它,在这个项目中,变量在其作用域中被定义为可以定义的最高级别。它可以更容易地告诉您将来会弹出哪些变量,并且更容易阅读/学习代码

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}
未定义索引:my_索引-当您尝试访问数组中的值而该值不存在时,会发生此情况。要防止此错误,请执行条件检查

// verbose way - generally better
if (isset($my_array['my_index'])) {
    echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;   
另一个选项是在函数顶部声明一个空数组。这并不总是可能的

$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';
附加提示 当我遇到这些和其他问题时,我使用免费软件,它给了我很多警告和通知。其中一些提供了非常有用的提示。这不是一个要求,除了大型项目,我不再使用IDE。我现在更像是一个活泼的人。
在PHP 7.0中,现在可以使用空合并运算符:

echo "My index value is: " . ($my_array["my_index"] ?? '');
等于:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

未定义索引指的是您请求的数组中的不可用数组索引,例如

<?php 

$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);

?>
<?php print_r($myvar); ?>

如果使用类,则需要确保使用$this引用成员变量:


引发未定义索引通知的另一个原因是数据库查询中省略了一列

即:

然后尝试访问循环中的更多列/行

即:

或者在while循环中:

另外需要注意的是,在*NIX操作系统和MacOSX上,事情是区分大小写的

请参阅堆栈上的以下问答:


可能您以前一直在使用旧的PHP版本,而现在升级了PHP,这就是为什么多年来它一直没有出现任何错误。
在PHP4之前,如果您使用变量而未定义变量,则不会出现错误,但从PHP5开始,它会对上述代码抛出错误。

处理文件时,需要正确的enctype和POST方法,如果表单中未包含任何一个,则会触发未定义索引通知

本手册规定了以下基本语法:

HTML

PHP

参考:


这些注意事项是因为您没有定义所使用的变量,并且$my_数组变量中没有my_索引键

这些通知每次都会触发,因为您的代码不正确,但可能您没有在上报告通知

解决错误:

ini_set("error_reporting", false)
另一种方法是:

//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}

在PHP中,首先需要定义变量,然后才能使用它。 我们可以用非常有效的方法检查变量是否已定义

//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}
简单解释


HTML表单提交后不存在变量的一个常见原因是表单元素不包含在标记中:

示例:元素不包含在

示例:元素现在包含在

使用一个简单、易读且干净的:

PHP7之前 将一个变量分配给另一个变量的值(如果已设置),否则分配null或任何您需要的默认值:

$newVariable = $thePotentialData ?? null;
PHP7+ 除了使用,其他都一样。不再需要调用isset,因为它是内置的,也不需要提供要返回的变量,因为假定它返回被检查变量的值:

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}
两者都将阻止OP问题的通知,两者完全等同于:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';
如果不需要设置新变量,则可以直接使用三元值的返回值,例如使用echo、函数参数等:

回声:

< p> 功能:

上述操作对数组(包括会话等)的作用相同,将要检查的变量替换为,例如: $\u会话['checkMe'] 或者无论您需要多深的层次,例如: $clients['personal']['address']['postcode']

抑制:

可以使用@抑制PHP通知或降低错误报告级别,但这并不能解决问题,它只是停止在错误日志中报告。这意味着您的代码仍然试图使用未设置的变量,这可能意味着或者可能不意味着某些内容无法按预期工作-这取决于缺少的值的重要性

您真的应该检查这个问题并适当地处理它,或者提供不同的消息,或者甚至只是为其他所有内容返回一个空值来标识精确的状态


如果你只关心通知不在错误日志中,那么作为一种选择,你可以忽略错误日志。

我问了一个关于这个的问题,我被推荐到这篇文章中,其中有一条消息:

这个问题在这里已经有了答案:

“注意:未定义变量”、“注意:未定义索引”和“注意: 使用PHP的“未定义的偏移量”

我在这里分享我的问题和解决方案:

这就是错误:

第154行就是问题所在。这是我在第154行中看到的:

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
我认为问题在于我正在为变量$city编写if条件,它不是键而是$key=>$city中的值。首先,你能确认这是否是警告的原因吗?第二,如果这是问题所在,为什么我不能基于该值编写条件?我写条件的时候一定要用钥匙吗

更新1:问题是在执行$CitiesCounterray[$key]时,$key有时对应于$CitiesCounterray数组中不存在的键,但根据我的循环数据,情况并非总是如此。我需要设置一个条件,如果数组中存在$key,那么运行代码,否则跳过它

更新2:这是我通过使用数组\u key\u exists修复它的方式:


每当我们使用未设置的变量时,就会发生这些错误

处理这些问题的最佳方法是在开发时设置错误报告

要在上设置错误报告,请执行以下操作:

if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;
在生产服务器上,错误报告处于关闭状态,因此,我们不会收到这些错误

但是,在开发服务器上,我们可以设置错误报告

要消除此错误,我们将看到以下示例:

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;
我们可以在赋值或使用变量之前将变量初始化为NULL

因此,我们可以将代码修改为:

if(isset($_POST['param'])){
    $param = $_POST['param'];
} else {
#do something else
}
这不会干扰任何程序逻辑,即使$test没有值,也不会产生通知

因此,基本上,为开发设置错误报告总是更好的

并修复所有错误


在生产环境中,错误报告应该设置为关闭。

如果要向API发送数据,只需使用isset即可


如果错误是由于会话引起的,请确保会话已正确启动。

请不要关闭警告。在更严格的语言中,它们通常意味着可能存在错误,您最好检查这一行两次——在像PHP这样允许的语言中,它们通常意味着这段代码是垃圾代码,可能充满了错误;我会尽量弄明白,但你最好尽快解决这个问题。虽然我同意前三点,但4是完全错误的。隐藏一个问题不会让它消失,它甚至可能会导致更多的问题。@Freek绝对正确,但在某些情况下,购买的脚本,零技术知识,需要在明天之前运行它。。。这是管道胶带解决方案——非常糟糕,需要强调的是,但是在PHP5.3中,可选的ifexists函数对我来说不起作用。调用方的变量在函数的局部作用域see Variable scope中不可用,除非它们是超全局变量或您摆弄$GLOBALS,所以$foo=BABABAR;如果存在“foo”;通常将返回null。斜体是php.net章节。现在您将从。。。重点是什么?只要检查值,如果!空$user和!空$location echo hello$user…变量的可能副本可能尚未初始化。是否从post、get或任何数组初始化变量?如果是这种情况,那么该数组中可能没有字段。“那是你的车吗?”佩卡웃 - 我注意到编辑添加了注释:Undefined offset-使用PHP是否更有意义:“Undefined variable”、“Undefined index”、“Undefined offset”注释甚至去掉了PHP,因为它被标记为PHP。另外,URL在处被截断,请注意undef,这只是一个建议,这样URL就不会被截断。甚至可能删除太多的引号。或PHP:“未定义变量/索引/偏移量”notices@Fred我想这两种说法都有道理。新手有可能进入整个队伍,
包括通知:进入他们的搜索查询,我相信这是这个问题的主要流量生成器。如果这些消息全部存在,这可能会提高搜索的可视性engines@Pekka웃 我理解。我之所以这么说,是因为URL在之前没有被切断,现在它被切断了,请注意undef。这只是一些建议。注意:未定义。@dieselpower44一些想法:闭嘴操作员有一些性能问题。此外,由于它会抑制特定范围内的所有错误,因此不小心使用它可能会屏蔽您希望看到的消息。隐藏问题不是处理问题的方法。项目2…4只能在生产服务器上使用,而不是在一般情况下。在使用自定义错误处理程序时,是否可以关闭消息内联不在处理程序中$var=@$_GET['不存在'];仍然会引起注意。为什么建议使用1$value=isset$\u POST['value']$_POST['value']:;而不是使用4$value=@$_POST['value'];?我不建议对数组使用isset,例如$str='111';,我知道它应该是数组isset$str[0]将返回true。最好使用array_key_exist而不是isseti如果你想知道性能影响是什么,这篇文章总结得很好,@GajusKuizinas自2009年以来有了一些变化,特别是结果发生了重大变化,请参见Zend Engine,performance and silence operator。谢谢@mario,很有意思。现在,如果有人能很好地衡量这两个。。。根据这个测试,似乎是相同的规模变化的通知。如果使用php.ini配置文件中的E_通知,则执行错误报告=E_ALL&~E_通知从上面的回答中,我尝试了isset,数组_key_存在,但这些都不起作用。我试过你的答案,。空的,它是有效的。非常感谢你!这在if语句中也可以很好地工作。如果是_数组$my_数组['idontexist']??{dosomething;}您的代码实际上是一个很好的被忽略的错误:??-如果传递的是is_数组,则只检查isset。这是一个布尔值,随后将出现意外行为。我们遇到了类似于此的行为变化,这是由于错误报告的行为与预期不同,因为我们的代码中有一个我们以前不知道的自定义错误处理程序。
$query = "SELECT col1 FROM table WHERE col_x = ?";
print_r($row['col1']);
print_r($row['col2']); // undefined index thrown
while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}
<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>
<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>
$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}
ini_set("error_reporting", false)
//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}
//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}
<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>
<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>
$newVariable = isset($thePotentialData) ? $thePotentialData : null;
$newVariable = $thePotentialData ?? null;
if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}
echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';
$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId)
{
    if ($userId === null) {
        // Etc
    }
}
153    foreach($cities as $key => $city){
154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;
$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;
if(isset($_POST['param'])){
    $param = $_POST['param'];
} else {
#do something else
}