我正在运行 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"];
这些错误消息的含义是什么?
他们为什么突然出现?我曾经使用这个脚本多年,我从来没有遇到任何问题。
我该如何解决?
这是一般参考问题
相关元讨论:
28 回答
注意:未定义的变量
来自PHP 手册的广阔智慧:
来自PHP 文档:
这意味着您只能使用
empty()
来确定是否设置了变量,此外它还会根据以下内容检查变量:0
,0.0
,""
,"0"
,null
,false
或[]
。例:
在3v4l.org 在线 PHP 编辑器中测试上面的片段
尽管 PHP 不需要变量声明,但它确实建议使用它以避免一些安全漏洞或错误,因为人们会忘记为稍后将在脚本中使用的变量赋值。 PHP 在未声明变量的情况下所做的是发出一个非常低级别的错误,
E_NOTICE
,默认情况下甚至没有报告,但在开发期间是手动建议允许。处理问题的方法:
从 PHP 7.0 开始,这变得更加清晰,现在你可以使用null coalesce operator:
E_NOTICE
的快速方法是:**注意:**强烈建议仅执行第 1 点。
注意:未定义的索引/未定义的偏移量
当您(或 PHP)尝试访问数组的未定义索引时,会出现此通知。
处理问题的方法:
两个变量用于访问两个数组元素,但是只有一个数组元素 index
0
,所以这将生成:$_POST/$_GET/$_SESSION 变量
使用
$_POST
,$_GET
或$_SESSION
时,通常会出现上述注意事项。对于$_POST
和$_GET
,您只需在使用之前检查索引是否存在。对于$_SESSION
,您必须确保以session_start()开始会话并且索引也存在。另请注意,所有 3 个变量都是超全局变量并且是大写的。
有关:
注意:未定义的变量
注意:未定义的索引
试试这些
Q2:在使用任何可疑变量之前使用 isset(),empty()条件效果很好。
或者,作为快速而肮脏的解决方案:
关于会话的说明:
使用会话时,需要使用会话将
session_start();
放在所有文件中。http://php.net/manual/en/features.sessions.php
错误显示@运算符
对于不需要的和冗余的通知,可以使用专用的@运营商到»hide«undefined variable/index 消息。
通常不鼓励这样做。新移民倾向于过度使用它。
对于应用程序逻辑深处的代码(忽略你不应该的未声明的变量),这是非常不合适的,e.g. 用于函数参数或循环。
然而,
isset?:
或??
super-supression 有一个好处。通知仍然可以记录。并且可以通过以下方式恢复@
-hidden 通知:set_error_handler("var_dump");
另外,您不应该习惯性地在初始代码中使用 use/recommend
if (isset($_POST["shubmit"]))
。新人不会发现这样的错别字。它只是剥夺了 PHP 的注意事项。仅在验证功能后添加
@
或isset
。$_GET
/$_POST
输入参数,特别是如果它们是可选的。由于这涵盖了大多数此类问题,让我们扩展最常见的原因:
$_GET/$_POST/$_REQUEST 未定义输入
遇到未定义的 index/offset 时,你要做的第一件事是检查拼写错误:
$count = $_GET["whatnow?"];
这是一个预期的密钥名称并出现在每个页面请求中吗?
变量名和数组标记在 PHP 中为 case-sensitive。
其次,如果通知没有明显原因,请使用var_dump或print_r来验证所有输入数组的内容:
两者都将揭示您的脚本是否使用正确或任何参数调用。
POST 参数和 GET 输入将单独显示。
$_GET
参数,您还可以查看QUERY_STRING inPHP 有一些规则将合并 non-standard 参数名称放入 superglobals 中。 Apache 也可能会进行一些重写。您还可以通过这种方式查看提供的原始
$_COOKIES
和其他 HTTP 请求标头。http://example.org/script.php?id=5&sort=desc
?
问号后的name=value
对是您的查询(GET)参数。因此,此 URL 只能产生$_GET["id"]
和$_GET["sort"]
。最后检查你的**<form>和<input>**声明,如果你期望一个参数但是没有收到。
确保每个必需的输入都有
<input name=FOO>
id=
或title=
属性不够。一个
method=POST
形式应该填充$_POST
。而
method=GET
(或将其遗漏)会产生$_GET
变量。表单也可以通过$_GET 提供
action=script.php?get=param
,并在$_POST 中提供剩余的method=POST
字段。使用现代 PHP 配置(≥5.6),再次使用$_REQUEST [ '瓦尔']变为可行(非时尚),这会使 GET 和 POST 参数混淆。
如果您正在使用 mod_rewrite,那么您应该检查
access.log
以及启用RewriteLog以找出缺少的参数。$_FILES
相同的健全性检查适用于文件上载和
$_FILES["formname"]
。另外检查
enctype=multipart/form-data
和
<form>
声明中的method=POST
一样。另见:PHP 未定义索引错误$_FILES?
$_COOKIE
$_COOKIE
数组永远不会在setcookie()
之后填充,而是仅在任何后续 HTTP 请求上填充。此外,它们的有效性超时,它们可能是对子域或单个路径的约束,用户和浏览器可以拒绝或删除它们。
一般是因为“糟糕的编程”,现在或以后都有可能出错。
如果这是一个错误,请首先对变量进行适当的分配:$varname=0;
如果它确实只是有时定义,请在使用之前测试它:
if (isset($varname))
如果是因为拼错了,那就纠正错误
也许你甚至会转过警告PHP-settings
这意味着您正在测试,评估或打印尚未分配任何内容的变量。这意味着您要么输入错误,要么需要先检查变量是否已初始化为某些内容。检查您的逻辑路径,它可以设置在一个路径中,但不能设置在另一个路径中。
我不想禁用通知,因为它有用,但是想避免太多打字。
我的解决方案是这个功能:
所以,如果我想引用$name 和 echo if exists,我只需写:
对于数组元素:
在页面中,如果我想参考$_REQUEST [155]:
获取输入string的最佳方法是:
这个 one-liner 几乎相当于:
如果你绝对想要string值,就像:
这是因为变量'$user_location'没有被定义。如果您正在使用任何 if 循环来声明'$user_location'变量,那么您还必须有一个 else 循环并定义相同的循环。例如:
上面的代码将创建错误,因为 if 循环不满足,并且在 else 循环中没有定义'$user_location'。仍然要求 PHP 回应变量。因此,要修改代码,您必须执行以下操作:
回答“”为什么它们突然出现?我以前使用这个脚本多年了,我从来没有遇到任何问题.“
大多数网站在“显示所有错误,但不是'通知'和'已弃用'”的“默认”错误报告下运行是很常见的。这将在 php.ini 中设置并应用于服务器上的所有站点。这意味着示例中使用的那些“通知”将被抑制(隐藏),而其他被认为更为关键的错误将是 shown/recorded。
另一个关键设置是可以隐藏错误(i.e.
display_errors
设置为“off”或“syslog”)。在这种情况下会发生的是,
error_reporting
被更改为还显示通知(根据示例)and/or,设置在屏幕上更改为display_errors
(而不是抑制 them/logging)。他们为什么要改变?
obvious/simplest 答案是有人在 php.ini 中调整了这些设置中的任何一个,或者 PHP 的升级版现在使用了之前的不同 php.ini。这是第一个看的地方。
但是,也可以覆盖这些设置
.htconf(网络服务器配置,包括 vhosts 和 sub-configurations)*
.htaccess
在 PHP 代码本身
其中任何一个也可以改变。
还有一个额外的复杂性,即 Web 服务器配置可以 enable/disable .htaccess 指令,所以如果.htaccess 中的指令突然 start/stop 工作,那么你需要检查它。
(.htconf/.htaccess 假设您正在以 apache 身份运行.如果运行命令行,则不适用;如果运行 IIS 或其他 Web 服务器,则需要相应地检查这些配置)
摘要
检查 php.ini 中的
error_reporting
和display_errors
php 指令是否未更改,或者您之前没有使用其他 php.ini。检查.htconf(或 vhosts 等)中的
error_reporting
和display_errors
php 指令是否未更改检查.htaccess 中的
error_reporting
和display_errors
php 指令没有改变如果在.htaccess 中有指令,请检查.htconf 文件中是否仍允许它们
最后检查你的代码;可能是一个无关的图书馆;看看是否已经设置了
error_reporting
和display_errors
php 指令。快速解决方法是在代码顶部将变量赋值为 null
我曾经诅咒这个错误,但提醒你逃避用户输入会很有帮助。
例如,如果您认为这是一个聪明的速记代码:
再次...Think!更好的解决方案是:
(我使用自定义
html()
函数来逃避角色,你的里程可能会有所不同)我用自己有用的函数**exst()**自动声明变量。
你的代码将是 -
用非常简单的语言**。
错误是你使用的是一个变量
$user_location
,它不是你之前定义的,它没有任何值所以我建议你**********************例:$user_location = '';
要么
$user_location = 'Los Angles';
这是一个非常常见的错误,你可以 face.So 不要担心只是声明变量和Enjoy Coding。
在 PHP 7.0 中,现在可以使用 Null 合并运算符:
等于:
PHP 手册 PHP 7.0
为什么不把事情简单化?
为什么会发生这种情况?
随着时间的推移,PHP 已成为一种更为 security-focused 的语言。默认情况下,以前关闭的设置现在处于打开状态。一个完美的例子是
E_STRICT
,默认情况下从PHP 5.4.0开启。此外,根据 PHP 文档,默认情况下,php.ini 在 php.ini 中被禁用。 PHP 文档推荐打开它进行调试。但是,当我从 Ubuntu 存储库下载 PHP 并从 BitNami 的 Windows 堆栈中下载时,我看到了别的东西。
请注意,默认情况下
error_reporting
实际上设置为生产值,而不是默认设置为“默认”值。这有点令人困惑,并没有在 php.ini 之外记录,所以我没有**在其他发行版上验证这一点。但是,要回答您的问题,此错误会在之前未弹出时弹出,原因是:
您安装了 PHP 并且新的默认设置文档记录较差,但不排除
E_NOTICE
。E_NOTICE
警告,如未定义的变量和未定义的索引实际上有助于使您的代码更清洁,更安全。我可以告诉你,多年前,保持E_NOTICE
启用迫使我声明我的变量。这使得它更容易学习 C,没有声明变量更大的麻烦。我可以做些什么?
通过复制“默认值”
E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
关闭E_NOTICE
并将其替换为error_reporting =
中等号后当前未注释的内容。如果使用 CGI 或 FPM,请重新启动 Apache 或 PHP。确保您正在编辑“正确”php.ini。如果您使用 Apache 运行 PHP,那么正确的将是 Apache,如果运行 PHP-FPM 则运行,如果运行 PHP-CGI 则运行 cgi,等等。这不是推荐的方法,但如果您的遗留代码非常难以编辑,那么这可能是你最好的选择。关闭文件或文件夹级别的
E_NOTICE
。如果您有一些遗留代码但希望以“正确”方式执行操作,这可能更为可取。要做到这一点,您应该咨询 Apache2,Nginx 或您选择的服务器。在 Apache 中,您将在<Directory>
中使用php_value
。重写您的代码更清洁。如果您在迁移到生产环境时需要执行此操作,或者不希望有人看到您的错误,请确保您禁用任何错误显示,并且只记录**您的错误(请参阅 php.ini 中的
display_errors
和log_errors
和你的服务器设置)。扩展选项 3:这是理想的选择。如果你能走这条路,你应该。如果您最初没有使用此路由,请考虑最终通过在开发环境中测试代码来移动此路由。当你在它的时候,摆脱
~E_STRICT
和~E_DEPRECATED
来看看未来会出现什么问题。您将看到很多不熟悉的错误,但是当您将来需要升级 PHP 时,它会阻止您遇到任何不愉快的问题。错误意味着什么?
Undefined variable: my_variable_name
- 在使用前未定义变量时会发生这种情况。执行 PHP 脚本时,它在内部只假定一个空值。但是,在哪种情况下,您需要在定义变量之前检查变量?最终,这是“草率代码”的论据。作为一名开发人员,我可以告诉你,当我看到一个开源项目时,我喜欢它,在这个项目中,变量被定义为可以定义的范围内的高位。它可以更容易地告诉将来会弹出哪些变量,并且更容易 read/learn 代码。Undefined index: my_index
- 当您尝试访问数组中的值并且它不存在时,会发生这种情况。要防止此错误,请执行条件检查。另一种选择是在函数顶部声明一个空数组。这并不总是可行的。
(附加提示)
vim
人。例如,未定义的索引表示您为不可用的数组索引请求的数组
未定义的变量意味着您完全不使用现有变量,或者未使用该名称定义或初始化该变量
undefined offset 表示您已请求不存在的键。解决方法是在使用前进行检查
关于这部分问题:
没有明确的答案,但这里有一些可能的解释为什么设置可以“突然”改变:
您已将 PHP 升级到较新版本,该版本可能具有 error_reporting,display_errors 或其他相关设置的其他默认值。
您已经删除或引入了一些代码(可能在依赖项中),它们在运行时使用
ini_set()
或error_reporting()
设置相关设置(在代码中搜索这些)您更改了 Web 服务器配置(假设此处为 apache):
.htaccess
文件和 vhost 配置也可以操作 php 设置。通常不会显示/报告通知(请参阅PHP 手册),因此在设置服务器时,由于某种原因(文件权限??)无法加载 php.ini 文件,并且您处于默认设置。后来,“bug”已经解决(偶然),现在它可以加载正确的 php.ini 文件,并设置 error_reporting 来显示通知。
如果使用类,则需要确保使用
$this
引用成员变量:将抛出未定义的索引通知的另一个原因是,数据库查询中省略了一列。
I.e:
然后尝试在循环内访问更多 columns/rows。
I.e:
或者在
while
循环中:需要注意的是,在* NIX OS 和 Mac OS X 上,事情是 case-sensitive。
请参阅堆栈上的以下问答:
MySQL 中的表名是否区分大小写?
查询中的 mysql 区分大小写的表名
MySql - 不同服务器中表的区分大小写问题
使用三元是简单,可读和干净的:
PHP 7 之前
如果设置了另一个变量的值,则将变量分配给另一个变量的值,否则分配
null
(或您需要的任何默认值):PHP 7
除了使用空融合运算符之外。不再需要调用
isset()
,因为它是内置的,并且不需要提供变量来返回,因为它假定返回被检查变量的值:两个都将停止 OP 问题的通知,****两者的确切等效于:
如果您不需要设置新变量,那么您可以直接使用三元的返回值,例如使用
echo
,函数参数等:回声:
功能:
以上将与数组相同,包括会话等,用 e.g 替换正在检查的变量:
$_SESSION['checkMe']
或者你需要多深层次,e.g:
$clients['personal']['address']['postcode']
抑制:
可以使用
@
来抑制 PHP 通知或降低错误报告级别,但不能解决问题,它只是阻止它在错误日志中报告。这意味着您的代码仍然尝试使用未设置的变量,这可能会或可能不会意味着某些内容无法正常工作 - 具体取决于缺失值的重要性。你应该真正检查这个问题并适当地处理它,或者提供不同的消息,或者甚至只是为其他一切返回一个空值来识别精确的状态。
如果您只关心通知不在错误日志中,那么作为选项,您可以简单地忽略错误日志。
可能你使用旧的 PHP 版本,直到现在升级 PHP,这是它工作的原因,直到现在多年来没有任何错误。直到 PHP4,如果您在没有定义变量的情况下使用变量,则没有错误,但从 PHP5 开始,它会抛出相关问题的错误。
处理文件时,需要正确的 enctype 和 POST 方法,如果表单中没有包含任何索引,则会触发未定义的索引通知。
手册说明了以下基本语法:
**** HTML
**** PHP
参考:
提交 HTML 表单后变量不存在的一个常见原因是表单元素未包含在
<form>
标记中:**示例:<form>**中未包含的元素
**示例:元素现在包含在<form>**中
我问了一个关于这个的问题,我在这篇文章中提到了这样的信息:
使用 PHP“注意:未定义的变量”,“注意:未定义的索引”和“通知:未定义的偏移量”
我在这里分享我的问题和解决方案:
这是错误:
第 154 行是问题所在。这就是我在 154 行中的内容:
我认为问题是我正在编写变量
$city
的条件,这不是关键而是$key => $city
中的值。首先,您能否确认这是否是警告的原因?第二,如果那是问题,为什么我不能根据价值写出条件呢?是否必须使用我需要写入条件的密钥?更新 1:问题在于,当执行
$citiesCounterArray[$key]
时,$key
有时对应于$citiesCounterArray
数组中不存在的键,但根据我的循环数据并非总是如此。我需要的是设置一个条件,这样如果数组中存在$key
,则运行代码,否则跳过它。更新 2:这是我使用
array_key_exists()
修复它的方法:每当我们使用未设置的变量时,就会发生这些错误。
处理这些问题的最佳方法是在开发过程中设置错误报告。
设置错误报告:
在生产服务器上,错误报告已关闭,因此,我们不会收到这些错误。
但是,在开发服务器上,我们可以设置错误报告。
为了摆脱这个错误,我们看到以下示例:
我们可以在赋值或使用它们之前将变量初始化为
NULL
。因此,我们可以将代码修改为:
这不会干扰任何程序逻辑,即使
$test
没有值也不会产生通知。所以,基本上,它总是更好地为开发设置错误报告。
并修复所有错误。
在生产时,应将错误报告设置为关闭。
这些通知是因为您没有使用的变量
defined
和my_index
键不存在于$my_array
变量中。这些通知每次都被触发,因为你的
code
不正确,但可能你没有报告通知。解决错误:
解决这个问题的另一种方法:
在 PHP 中,您需要先定义变量,然后才能使用它。
我们可以非常有效地检查变量是否定义!
简单说明