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

您所在的位置:网站首页 未定义函数或变量是什么意思 使用PHP的“注意:未定义的变量”,“注意:未定义的索引”和“注意:未定义的偏移量”

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

2023-08-06 18:24| 来源: 网络整理| 查看: 265

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

注意:第10行上C:\\ wamp \\ www \\ mypath \\ index.php中的未定义变量:my_variable_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楼

这是因为未定义变量'$ user_location'。 如果要在其中声明“ $ user_location”变量的情况下使用if循环,则还必须具有else循环并对其进行定义。 例如:

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

上面的代码将创建错误,因为不满足if循环并且在else循环中未定义'$ user_location'。 仍然要求PHP回显变量。 因此,要修改代码,您必须执行以下操作:

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

我一直使用自己有用的函数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; } #3楼

为什么不保持简单?

#4楼

快速的解决方法是在代码顶部将变量分配为null

$user_location = null; #5楼

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

$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'); #6楼

我曾经诅咒这个错误,但是提醒您避免用户输入可能会有所帮助。

例如,如果您认为这很聪明,则简写代码:

// Echo whatever the hell this is

...再想一想! 更好的解决方案是:

// If this is set, echo a filtered version

(我使用自定义html()函数转义字符,您的里程可能会有所不同)

#7楼

用非常简单的语言 。 错误是您使用的变量$user_location之前没有定义,并且没有任何值,因此我建议您在 使用 前 声明此变量,例如:

$user_location = ''; 要么 $user_location = 'Los Angles'; 这是您可能会遇到的非常常见的错误。因此,不必担心,只需声明变量并 享受编码即可 。

#8楼

回答“”,为什么它们突然出现? 我曾经使用此脚本多年,而且从未遇到任何问题。”

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

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

在这种情况下将发生的情况是,要么将error_reporting更改为还显示通知(根据示例),并且/或者将设置更改为在屏幕上显示为display_errors (而不是抑制/记录它们)。

为什么要改变?

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

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

.htconf(网络服务器配置,包括虚拟主机和子配置)* .htaccess 在PHP代码本身

并且其中任何一个都可能已经更改。

Web服务器配置可以启用/禁用.htaccess指令还增加了复杂性,因此,如果您在.htaccess中有突然启动/停止工作的指令,则需要进行检查。

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

摘要

检查php.ini中的error_reporting和display_errors php指令没有更改,或者您没有使用与以前不同的php.ini。 检查.htconf(或虚拟主机等)中的error_reporting和display_errors php指令是否已更改 检查.htaccess中的error_reporting和display_errors php指令未更改 如果您在.htaccess中有指令,请检查.htconf文件中是否仍然允许使用它们 最后检查您的代码; 可能是无关的库; 查看是否在此处设置了error_reporting和display_errors php指令。 #9楼

关于这部分问题:

为什么它们突然出现? 我曾经使用此脚本多年,但从未遇到任何问题。

没有确切的答案,但是以下是一些设置可能会“突然”更改的可能解释:

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

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

您更改了Web服务器配置(此处为apache) .htaccess文件和虚拟主机配置也可以操纵php设置。

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

#10楼 为什么会这样?

随着时间的流逝,PHP已成为一种更加注重安全性的语言。 以前默认情况下已关闭的设置现在默认情况下已打开。 一个完美的例子就是E_STRICT ,它从PHP 5.4.0开始默认打开。

此外,根据PHP文档,默认情况下,php.ini中禁用E_NOTICE 。 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

请注意, error_reporting实际上默认情况下设置为生产值,而不是默认情况下设置为“默认”值。 这有些令人困惑,并且没有在php.ini之外进行记录,因此我没有在其他发行版上对此进行过验证。

但是,要回答您的问题,以前没有弹出此错误时会弹出此错误,原因是:

您已经安装了PHP,并且新的默认设置在某些方面没有得到很好的记录,但是并不排除E_NOTICE 。

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

我该怎么办?

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

在文件或文件夹级别上关闭E_NOTICE 。 如果您有一些旧代码,但又想以“正确”的方式进行操作,则这可能是更可取的。 为此,您应该查阅Apache2,Nginx或您选择的任何服务器。 在Apache中,您可以在内使用php_value 。

重写代码以使代码更整洁。 如果您在移至生产环境时需要执行此操作,或者不想让别人看到您的错误,请确保禁用任何错误显示,并仅记录您的错误(请参阅php.ini和您的服务器中的display_errors和log_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 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'; (其他提示) 当我遇到这些问题和其他问题时,我使用了NetBeans IDE (免费),它给了我很多警告和注意。 其中一些提供了非常有用的提示。 这不是必需的,除了大型项目之外,我不再使用IDE。 这些天我更vim人了:)。 #11楼

在PHP 7.0中,现在可以使用Null合并运算符:

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

#12楼

未定义索引表示在您请求的数组中不可用的数组索引中,例如

未定义的变量意味着您已经使用了完全不存在的变量,或者未使用该名称定义或初始化的变量

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

php> echo array_key_exists(1, $myarray); #13楼

试试这些

问题1:此通知表示未在脚本的当前作用域中定义$ varname。

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

// 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 notices error_reporting(E_ALL ^ E_NOTICE);

关于会话的注意事项:

使用会话时, session_start(); 必须使用会话放置在所有文件中。

http://php.net/manual/en/features.sessions.php

#14楼

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

如果输入错误,请先为变量进行适当的赋值:$ varname = 0; 如果确实只是有时定义了它,请对其进行测试: if (isset($varname)) ,然后再使用它 如果是因为您拼写错误,请更正 甚至在您的PHP设置中打开警告 #15楼

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

#16楼 注意:未定义的变量

从PHP手册的广泛智慧中:

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

从PHP文档 :

如果变量不存在,则不会生成警告。 这意味着empty()本质上与!isset($ var)||等效。 $ var == false

这意味着,可以使用仅empty()以确定是否变量设置,并且另外它检查变量对以下, 0 , 0.0 , "" , "0" , null , false或[]

例:

$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不需要变量声明,但它确实推荐这样做,以避免某些安全漏洞或bug,因为这些漏洞或bug可能会忘记为变量提供值,该变量将在脚本的后面使用。 在未声明变量的情况下,PHP会发出一个非常低级的错误E_NOTICE ,默认情况下甚至不会报告该错误,但《手册》 建议在开发过程中允许这样做。

解决问题的方法:

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

//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合并运算符 :

// Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST['value'] ?? '';

为E_NOTICE设置自定义错误处理程序 ,并将消息重定向到标准输出之外(也许重定向到日志文件):

set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)

禁用E_NOTICE的报告功能。 仅排除E_NOTICE一种快速方法是:

error_reporting( error_reporting() & ~E_NOTICE )

使用@运算符抑制错误。

注意:强烈建议仅实施第1点。

注意:未定义的索引/未定义的偏移量

当您(或PHP)尝试访问数组的未定义索引时,将显示此通知。

解决问题的方法:

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

//isset() $value = isset($array['my_index']) ? $array['my_index'] : ''; //array_key_exists() $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';

语言构造list()尝试访问不存在的数组索引时可能会生成以下代码:

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

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

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

$_POST / $_GET / $_SESSION变量

当使用$_POST , $_GET或$_SESSION时,上面的通知经常出现。 对于$_POST和$_GET您只需要在使用索引之前检查索引是否存在。 对于$_SESSION您必须确保已使用session_start()启动会话,并且该索引也存在。

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

有关:

注意:未定义的变量 注意:未定义的索引 #17楼 错误显示@运算符

对于不想要的和多余的通知,可以使用专用的@运算符 » 隐藏 «未定义的变量/索引消息。

$var = @($_GET["optional_param"]); 通常不建议这样做。 新来者倾向于过度使用它。 对于应用程序逻辑内部的代码(忽略不应声明的变量),例如函数参数或循环,这是非常不合适的。 isset?:有一个上升空间isset?: ?? 但是超级压抑。 通知仍然可以记录。 可以使用以下命令复活@隐藏的通知: set_error_handler("var_dump"); 另外,您不应该在初始代码中习惯性地使用/推荐if (isset($_POST["shubmit"])) 。 新来者不会发现这种错别字。 在这些情况下,它只会使您失去PHP声明。 仅在验证功能后添加@或isset 。

首先解决原因。 没有通知。

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

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

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

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

这是预期的密钥名称,并且出现在每个页面请求中吗? 变量名称和数组标记在PHP中区分大小写。

其次,如果通知没有明显原因,请使用var_dump或print_r验证所有输入数组的当前内容:

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

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

或者使用浏览器devtools ( F12 ),并检查“网络”选项卡上的请求和参数:

浏览器开发人员工具/“网络”标签

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

对于$_GET参数,您还可以浏览以下位置的QUERY_STRING

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"] 。

最后,如果需要参数但什么都没有收到,请检查您的和声明。

确保每个必需的输入都有一个 id=或title=属性不足。 应该使用method=POST形式填充$_POST 。 而method=GET (或忽略它)将产生$_GET变量。 表单也可以通过$ _GET和$ _POST中的剩余method=POST字段一起提供action=script.php?get=param 。 在现代PHP配置( $_REQUEST['vars'] )下,再次使用$_REQUEST['vars']已经变得可行 (不时髦),后者混搭了GET和POST参数。

如果使用mod_rewrite,则应同时检查access.log并启用RewriteLog以找出不存在的参数。

$_FILES 相同的健全性检查适用于文件上传和$_FILES["formname"] 。 此外检查enctype=multipart/form-data 以及声明中的method=POST 。 另请参见: PHP未定义索引错误$ _FILES? $_COOKIE 在setcookie() ,绝不会填充$_COOKIE数组,而只能在任何后续HTTP请求中填充。 此外,它们的有效性会超时,它们可能会受到子域或单个路径的约束,并且用户和浏览器只能拒绝或删除它们。 #18楼

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

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

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

即:

$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 ""; echo $row['col2']; // undefined index thrown echo ""; echo $row['col3']; // undefined index thrown }

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

请参阅以下有关堆栈的问答:

MySQL中的表名是否区分大小写?

MySQL查询中区分大小写的表名

MySql-不同服务器中表的区分大小写问题

#20楼

可能直到现在您都使用旧的PHP版本,现在又升级了PHP,这就是几年来一直没有任何错误的原因。 直到PHP4为止,如果您使用的是未定义变量就没有错误,但是从PHP5开始,它会为上述代码引发错误。

#21楼

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

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

的HTML

Send this file:

的PHP

参考:

http://php.net/manual/zh/features.file-upload.post-method.php #22楼

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

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

解决错误:

$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) #23楼

在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 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"; } #24楼

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

示例: 不包含的元素

choice 1 choice 2 choice 3 choice 4

示例:元素现在包含在

choice 1 choice 2 choice 3 choice 4

#25楼

使用三元是简单,易读且干净的:

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

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

PHP 7+ 除使用Null合并运算符外,其他均相同。 内置时不再需要调用isset() ,也不需要提供要返回的变量,因为假定它返回了要检查的变量的值:

$newVariable = $thePotentialData ?? null;

两者都将停止来自OP问题的通知,并且两者完全等同于:

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

如果您不需要设置新变量,则可以直接使用三元组的返回值,例如echo ,function arguments等:

回声:

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通知,或降低错误报告级别,但不能解决问题 ,只是停止在错误日志中报告该问题 。 这意味着您的代码仍尝试使用未设置的变量,这可能意味着某项未按预期工作,这取决于缺失值的重要性。

您确实应该检查此问题并进行适当处理,或者发送不同的消息,甚至为其他所有内容返回空值以标识准确的状态。

如果您只是在乎通知不在错误日志中,那么可以选择忽略错误日志。

#26楼

我问了一个有关此的问题,并在此消息中提到了我:

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

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

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

这是错误:

在此处输入图片说明

154行就是问题所在。 这是我在第154行中的内容:

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

我认为问题是我正在写变量$city条件,条件不是键,而是$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)){ #27楼

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

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

设置错误报告的依据:

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;

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

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

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

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

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

并修复所有错误。

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

#28楼

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

我的解决方案是此功能:

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

因此,如果我要引用$ name并回显(如果存在),我只需写:

对于数组元素:

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3