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

我正在运行PHP脚本并继续收到以下错误:

注意:未定义的变量:my_variable_name在C:\wamp\www\mypath\index.php第10行

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

警告:未定义的数组键“my_index”在C:\wamp\www\mypath\index.php第11行

第10和第11行看起来像这样:

echo "My variable value is: " . $my_variable_name;echo "My index value is: " . $my_array["my_index"];

这些错误信息的含义是什么?

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

我该怎么修复它们?


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

相关元讨论:

2111436 次浏览

试试这些

Q1:这个通知意味着$varname不是在当前范围内定义的脚本。

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

// recommended solution for recent PHP versions$user_name = $_SESSION['user_name'] ?? '';
// pre-7 PHP versions$user_name = '';if (!empty($_SESSION['user_name'])) {$user_name = $_SESSION['user_name'];}

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

// not the best solution, but works// in your php setting use, it helps hiding site wide noticeserror_reporting(E_ALL ^ E_NOTICE);

关于会话的说明:

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

  1. 如果是错误的,首先对变量进行适当的赋值:$varname=0;
  2. 如果它确实只是有时定义的,请在使用它之前测试它:if (isset($varname))
  3. 如果是因为你拼错了就纠正一下
  4. 也许甚至把你的警告PHP设置

这意味着您正在测试、评估或打印一个尚未分配任何内容的变量。这意味着您要么有错别字,要么需要检查该变量是否首先初始化为某个东西。检查您的逻辑路径,它可能在一个路径中设置,但在另一个路径中没有设置。

注意/警告:未定义的变量

来自PHP手册的智慧:

依赖未初始化变量的默认值在将一个文件包含到另一个使用相同变量名的文件中的情况下是有问题的。它也是register_globals打开的主要安全风险。在使用未初始化变量的情况下会发出E_NOTICE级错误,但是在将元素附加到未初始化数组的情况下不会发出。isset()语言构造可用于检测变量是否已经初始化。此外,更理想的是空()的解决方案,因为如果变量未初始化,它不会生成警告或错误消息。

PHP留档

如果变量不存在,则不会生成警告。这意味着空()本质上相当于! isset($var)||$var==false

这意味着您只能使用empty()来确定变量是否已设置,此外它还会根据以下内容检查变量,00.0"""0"nullfalse[]

示例:

$o = [];@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];array_walk($var, function($v) {echo (!isset($v) || $v == false) ? 'true ' : 'false';echo ' ' . (empty($v) ? 'true' : 'false');echo "\n";});

3v4l.org在线PHP编辑器中测试上面的代码段

虽然PHP不需要变量声明,但它确实建议这样做,以避免一些安全漏洞或错误,人们会忘记为稍后在脚本中使用的变量提供值。PHP在未声明变量的情况下所做的是发出一个非常低级别的错误,E_NOTICE,默认情况下甚至没有报告,但在开发过程中使用手册建议允许

处理这个问题的方法:

  1. 推荐:声明您的变量,例如当您尝试将字符串附加到未定义的变量时。或者使用#0/#1在引用它们之前检查它们是否已声明,如:

    //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开始,这变得更加清晰,现在您可以使用零合并算子

    // Null coalesce operator - No need to explicitly initialize the variable.$value = $_POST['value'] ?? '';
  1. 为E_NOTICE设置自定义错误处理程序并将消息重定向到远离标准输出的地方(可能是日志文件):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  2. 禁用E_NOTICE报告。排除E_NOTICE的快速方法是:

    error_reporting( error_reporting() & ~E_NOTICE )
  3. @李飞飞抑制错误。

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

注意:未定义索引/未定义偏移量/警告:未定义数组键

当您(或PHP)尝试访问数组的未定义索引时,会出现此通知/警告。

处理这个问题的方法:

  1. 在访问索引之前检查索引是否存在。为此,您可以使用#0#1

    //isset()$value = isset($array['my_index']) ? $array['my_index'] : '';//array_key_exists()$value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
  2. 语言构造#0在尝试访问不存在的数组索引时可能会生成这个:

    list($a, $b) = array(0 => 'a');//orlist($one, $two) = explode(',', 'test string');

两个变量用于访问两个数组元素,但是只有一个数组元素index0,因此这将生成:

注意:未定义偏移量:1

#$_POST/$_GET/$_SESSION变量

当使用$_POST$_GET$_SESSION时,上面的通知经常出现。对于$_POST$_GET,您只需在使用它们之前检查索引是否存在。对于$_SESSION,您必须确保会话以#6开始,并且索引也存在。

另请注意,所有3个变量都是超全局变量并且是大写的。

相关:

错误显示#0运算符

对于不需要的和冗余的通知,可以使用专用的#0运算符到“隐藏”未定义变量/索引消息。

$var = @($_GET["optional_param"]);
  • 这通常是不鼓励的。新人往往过度使用它。
  • 对于应用程序逻辑深处的代码(忽略不应该的未声明变量)非常不合适,例如对于函数参数或循环。
  • 然而,与isset?:??超级抑制相比,有一个好处。通知仍然可以被记录。并且可以使用以下方式复活@隐藏的通知:set_error_handler("var_dump");
    • 另外,您不应该在初始代码中习惯性地使用/推荐if (isset($_POST["shubmit"]))
    • 新手不会发现这样的错别字。它只是剥夺了您对这些情况的PHP通知。仅添加@isset之后验证功能。
    • <区块链>

      先解决原因。不是通知。

  • #0主要用于$_GET/$_POST输入参数,特别是如果它们是可选的

由于这涵盖了大多数此类问题,让我们扩展最常见的原因:

$_GET/$_POST/$_REQUEST未定义输入

  • 遇到未定义的索引/偏移量时,您要做的第一件事就是检查拼写错误:
    $count = $_GET["whatnow?"];

    • 这是一个预期的密钥名称并出现在每个页面请求中吗?
    • 变量名数组指示在PHP中区分大小写。
  • 其次,如果通知没有明显的原因,请使用#0#1来验证所有输入数组的当前内容:

    var_dump($_GET);var_dump($_POST);//print_r($_REQUEST);

    两者都将显示您的脚本是否使用正确或任何参数调用。

  • 替代或另外使用您的浏览器开发工具F12并检查网络选项卡的请求和参数:

    浏览器开发工具/网络选项卡

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

  • 对于$_GET参数,您还可以查看#1 in

    print_r($_SERVER);

    PHP有一些规则将合并非标准参数名称写入超全局变量。Apache也可能会进行一些重写。您还可以以这种方式查看提供的原始$_COOKIES和其他HTTP请求标头。

  • 更明显地查看浏览器地址栏中的GET参数

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

    ?问号后的name=value对是您的查询(GET)参数。因此,此URL只能产生$_GET["id"]$_GET["sort"]

  • 最后检查你的#0和#1声明,如果你期望一个参数但没有收到。

    • 确保每个必需的输入都有<input name=FOO>
    • id=title=属性是不够的。
    • method=POST表单应该填充$_POST
    • method=GET(或省略它)将产生$_GET变量。
    • 表单也可以通过$_GET提供action=script.php?get=param,并在$_POST中提供其余的method=POST字段。
    • 在现代PHP配置(≥5.6)中,再次使用#0已成为可行(不流行),它混合了GET和POST参数。
  • 如果您使用mod_rewrite,那么您应该同时检查access.log并启用RewriteLog以找出缺少的参数。

$_FILES

  • 同样的健全性检查适用于文件上传和$_FILES["formname"]
  • 再检查一下enctype=multipart/form-data
  • 以及<form>声明中的method=POST
  • 另见:PHP未定义索引错误$_FILES?

$_COOKIE

  • $_COOKIE数组永远不会在setcookie()之后填充,而是仅在任何后续HTTP请求上填充。
  • 此外,它们的有效性超时,它们可能会限制到子域或单个路径,用户和浏览器可以拒绝或删除它们。

我不想禁用通知,因为它很有帮助,但我想避免太多的输入。

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

function ifexists($varname){return(isset($$varname) ? $varname : null);}

因此,如果我想引用$name并回显是否存在,我只需编写:

<?= ifexists('name') ?>

对于数组元素:

function ifexistsidx($var,$index){return(isset($var[$index]) ? $var[$index] : null);}

在一个页面中,如果我想引用$_REQUEST['name']:

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

这是因为变量“$user_location”没有被定义。如果您在内部使用任何if循环,您正在声明“$user_location”变量,那么您也必须有一个其他循环并定义相同的值。例如:

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

上面的代码将创建一个错误,因为if循环不满足,并且在其他循环中没有定义'$user_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;}

保持简单:

<?phperror_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 noticeecho idxVal($arr['hey ho'], 'yo'); // Returns yo and assigns it to the array index. Nice?>

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

$user_location = null;

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

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

这一行几乎相当于:

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_location 不是您之前定义的,它没有任何值。所以我建议您请宣布这个变量之前使用它。例如:


$user_location = '';

$user_location = 'Los Angles';

这是你可能面临的一个非常常见的错误。所以不要担心;只需声明变量和享受编码

回答“为什么突然出现?这个脚本我用了很多年,从来没有遇到过任何问题。”

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

另一个关键设置是可以隐藏错误(即display_errors设置为“off”或“syslog”)。

在这种情况下会发生什么是error_reporting被更改为也显示通知(如示例所示)和/或设置被更改为屏幕上的display_errors(而不是抑制它们/记录它们)。

为什么他们变了?

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

但是,也可以在

  • . htconf(网络服务器配置,包括vhost和子配置)*
  • . htaccess
  • 在php代码本身

其中任何一个也可能被改变。

还有一个额外的复杂性,即Web服务器配置可以启用/禁用. htaccess指令,因此如果您在. htaccess中有突然启动/停止工作的指令,那么您需要检查这一点。

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

总结

  • 检查php.ini中的error_reportingdisplay_errors php指令没有更改,或者您没有使用与以前不同的php.ini。
  • 检查. htconf(或vhost等)中的error_reportingdisplay_errors php指令没有更改
  • 检查. htaccess中的error_reportingdisplay_errors php指令没有更改
  • 如果. htaccess中有指令,请检查. htconf文件中是否仍然允许它们
  • 最后检查你的代码;可能是一个不相关的库;看看error_reportingdisplay_errors php指令是否设置在那里。

关于这部分质询:

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

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

  1. 您已将PHP升级到较新版本,该版本可以具有error_reporting、display_errors或其他相关设置的其他默认值。

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

  3. 您更改了Web服务器配置(此处假设为apache):.htaccess文件和vhost配置也可以操作php设置。

  4. 通常不会显示/报告通知(请参阅php手册)因此,有可能在设置服务器时,由于某种原因(文件权限??)无法加载php.ini文件,而您使用的是默认设置。后来,“bug”已经解决(偶然),现在它可以加载正确的php.ini文件,error_reporting设置为显示通知。

为什么会这样?

随着时间的推移,PHP已经成为一种更加注重安全性的语言。过去默认关闭的设置现在默认打开。一个完美的例子是E_STRICT,它从PHP 5.4.0开始默认打开。

此外,根据PHP留档,默认情况下,E_NOTICE在文件php.ini中被禁用。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-reportingerror_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

请注意,error_reporting实际上默认设置为生产值,而不是默认设置为“默认”值。这有点令人困惑,在php.ini之外没有记录,所以我在其他发行版上验证了这一点。

但是,为了回答您的问题,此错误现在弹出,因为它之前没有弹出:

  1. 您安装了PHP,新的默认设置记录得不太好,但不排除E_NOTICE

  2. E_NOTICE警告,如未定义变量和未定义索引,实际上有助于使您的代码更干净,更安全。我可以告诉你,几年前,保持E_NOTICE启用迫使我声明我的变量。它使学习C变得更容易。在C中,不声明变量是一个更大的麻烦。

我能做些什么呢?

  1. 通过复制“默认值”E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED并将其替换为error_reporting =中等号后当前未注释的内容来关闭E_NOTICE。如果使用CGI或FPM,请重新启动Apache或PHP。确保您正在编辑“正确”的php.ini文件。如果您使用Apache运行PHP,正确的将是Apache,如果运行PHP-FPM,则为fpm或php-fpm,如果运行PHP-CGI,则为cgi,等等。这不是推荐的方法,但如果您有非常难以编辑的遗留代码,那么它可能是您最好的选择。

  2. 在文件或文件夹级别关闭E_NOTICE。如果您有一些遗留代码但想以“正确”的方式做事,这可能更可取。为此,您应该咨询Apache 2、Nginx或您选择的任何服务器。在Apache中,您将在<Directory>中使用php_value

  3. 重写代码,使其更清晰。如果您需要在迁移到正式生产环境时执行此操作,或者不想让别人看到您的错误,请确保禁用任何错误显示,并且仅显示伐木错误(请参阅php.ini和服务器设置中的display_errorslog_errors)。

扩展选项3:这是理想的。如果你可以走这条路,你应该这样做。如果你一开始不走这条路,考虑通过在开发环境中测试你的代码来最终改变这条路线。当你在做的时候,摆脱~E_STRICT~E_DEPRECATED,看看未来可能会出现什么问题。你会看到很多不熟悉的错误,但它会阻止你在未来需要升级PHP时遇到任何不愉快的问题。

错误是什么意思?

Undefined variable: my_variable_name-当一个变量在使用前没有被定义时,就会发生这种情况。当PHP脚本执行时,它在内部只是假设一个空值。但是,在什么情况下你需要在定义变量之前检查它?最终,这是“草率代码”的一个论点。作为一名开发人员,我可以告诉你,当我看到一个开源项目,其中变量被定义在它们可以定义的范围内时,我很喜欢它。它使得更容易判断将来会弹出什么变量,并且更容易阅读/学习代码。

function foo(){$my_variable_name = '';
//....
if ($my_variable_name) {// perform some logic}}

Undefined index: my_index-当您尝试访问数组中的值但它不存在时,会发生这种情况。要防止此错误,请执行条件检查。

// verbose way - generally betterif (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';

(额外提示)

  • 当我遇到这些和其他问题时,我使用了NetBeanssIDE(免费),它给了我许多警告和通知。其中一些提供了非常有用的提示。这不是一个要求,除了大型项目,我不再使用IDE了。这些天我更像一个vim的人:)。

在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手册PHP 7.0

未定义的索引意味着在您请求的数组中存在不可用的数组索引。例如,

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

未定义的变量意味着您完全没有使用现有变量,或者没有用该名称定义或初始化。例如,

<?php print_r($myvar); ?>

未定义的偏移量意味着您在数组中要求使用不存在的键。解决方案是在使用前检查:

php> echo array_key_exists(1, $myarray);

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

class Person{protected $firstName;protected $lastName;
public function setFullName($first, $last){// Correct$this->firstName = $first;
// Incorrect$lastName = $last;
// Incorrect$this->$lastName = $last;}}

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

即:

$query = "SELECT col1 FROM table WHERE col_x = ?";

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

即:

print_r($row['col1']);print_r($row['col2']); // undefined index thrown

或者在while循环中:

while( $row = fetching_function($query) ) {
echo $row['col1'];echo "<br>";echo $row['col2']; // undefined index thrownecho "<br>";echo $row['col3']; // undefined index thrown
}

需要注意的是,在*NIX OS和Mac OS X上,事情是区分大小写的。

在Stack上查看以下Q&A:

可能您使用的是旧的PHP版本,直到现在升级了PHP,这就是它多年来一直工作而没有任何错误的原因。

在PHP 4之前,如果您使用变量而不定义它,则没有错误,但从PHP 5开始,它会为有问题的代码抛出错误。

处理文件时,需要适当的enctype和POST方法,如果表单中不包含任何一个,这将触发未定义的索引通知。

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

超文本标记语言

<!-- 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

<?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>";
?>

参考:

这些通知是因为您没有使用的变量defined,并且my_index键没有出现在$my_array变量中。

这些通知每次都被触发,因为你的code不正确,但可能你没有报告通知。

解决bug:

$my_variable_name = "Variable name"; // defining variableecho "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)

在PHP中,您首先需要定义变量。之后您可以使用它。

我们可以以非常有效的方式检查变量是否已定义!

// 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 if the variable is defined or undefined// Isset() does not check that variable has a true or false value// But it checks the null value of a variableif(isset($my_variable_name)){
}

简单解释

// It will work with: true, false, and NULL$defineVariable = false;if($defineVariable){echo "true";}else{echo "false";}
// It will check if the variable is defined or not and if the variable has a null value.if(isset($unDefineVariable)){echo "true";}else{echo "false";}

在提交超文本标记语言表单后不存在变量的一个常见原因是表单元素不包含在<form>标记中:

示例:元素不包含在<form>

<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>

<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>

使用三元算子简单、易读且干净:

PHP 7

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

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

php7+

除了使用零聚结算子之外,情况相同。不再需要调用isset(),因为这是内置的,也不需要提供要返回的变量,因为它假设返回被检查变量的值:

$newVariable = $thePotentialData ?? null;

两者都有将停止OP问题中的通知两者完全等价于:

if (isset($thePotentialData)) {$newVariable = $thePotentialData;} else {$newVariable = null;}

如果您不需要设置新变量,那么您可以直接使用三元运算符的返回值,例如echo、函数参数等:

回声:

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}}

上面的操作与数组相同,包括会话等,将检查的变量替换为例如:

$_SESSION['checkMe']

或者你需要多少层次,例如:

$clients['personal']['address']['postcode']


抑制:

可以用@来抑制PHP通知或降低您的错误报告级别,但它并不能解决问题。它只是停止在错误日志中报告它。这意味着您的代码仍然尝试使用未设置的变量,这可能意味着也可能不意味着某些东西不能按预期工作-这取决于缺失值的关键程度。

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

如果您只关心通知不在错误日志中,那么作为一个选项,您可以简单地忽略错误日志。

我问了一个关于这个的问题,我被推荐到这篇文章,上面写着:

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

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

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

这是错误:

在此处输入图片描述

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

153    foreach($cities as $key => $city){154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

我认为问题是我正在为变量$city编写if条件,它不是键,而是$key => $city中的值。首先,你能确认这是否是警告的原因吗?第二,如果这是问题,为什么我不能根据值编写条件?我需要编写条件是否必须使用键?

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

更新2:这是我使用array_key_exists()修复它的方式:

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 an error as $my is not 9.}echo $test;

我们可以在分配它们的值或使用它们之前将变量初始化为NULL

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

$test = NULL;if ($my == 9) {$test = 'yes';  // Will produce an error as $my is not 9.}echo $test;

这不会干扰任何程序逻辑,即使$test没有值也不会产生通知。

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

并修复所有错误。

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

如果您要将数据发送到API,只需使用isset()

if(isset($_POST['param'])){$param = $_POST['param'];} else {# Do something else}

如果错误是因为会话,请确保您已正确启动会话。