回答

收藏

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

技术问答 技术问答 232 人阅读 | 0 人回复 | 2023-09-12

我在操作 PHP 脚本并继续收到以下错误:! s- D' R) F  Q, h
注:未定义变量:第 10 行 C:\wamp\www\mypath\index.php 中的 my_variable_name4 ~+ n; N5 J6 F# k, b$ `
注:未定义索引: 11 行 my_index C:\wamp\www\mypath\index.php  `6 E3 G# z- V
如下所示 行和第 11 行如下:
  F: O/ {# T- X' {* ]( b
    echo "My variable value is: " . $my_variable_name;echo "My index value is: " . $my_array["my_index"];
    . }7 g$ A3 D( a8 v3 n
这些错误消息的含义是什么?9 U: R' J2 g- u
为什么它们会突然出现?我用这个脚本已经很多年了,我从来没有遇到过任何问题。  S/ m# i6 m# O/ `, ?+ |
如何修复它们?
9 s& b' R% U7 V                                                               
' d1 Q5 O$ X- K6 e9 C/ k    解决方案:                                                               
1 L6 S% p: K3 O; c$ }. y( F                                                                注:未定义的变量来自PHP 手册的丰富智慧:" `6 t  H3 V+ y- ?. I" [
当一个文件包含在另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的。这也是一个重大的安全风险register_globals的开启。E_NOTICE在使用未初始化变量的情况下级错误,但不会将元素附加到未初始化数组中。isset()语言结构可用于检测变量是否已初始化。此外,更理想的是empty()解决方案,因为如果变量不初始化,就不会产生警告或错误信息。
' j# L$ _" f3 H6 e4 |8 X+ M0 B来自PHP 文档:* x. k( Q$ d" D7 x
如果变量不存在,则不会发出警告。这意味着 empty()本质上是等价的!isset($var) || $var == 假' w3 @+ S2 l/ M
这意味着你只能用empty()确定变量是否已设置,并根据以下内容检查变量,0、0、0.0,"","0",null,false或[]。, S$ ~5 ~+ S5 Z+ f9 j  T% }
例子:
& ?1 v# O' x* N" O7 o8 ]
    $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";});+ _9 [4 N" [8 M0 i7 H
在3v4l.org 在线 PHP 在编辑器中测试上述代码段6 R5 Z, W2 y: v
尽管 PHP 不需要变量声明,但确实建议这样做,以避免一些安全漏洞或错误,因为人们会忘记将来在脚本中使用的变量赋值。PHP 在不声明变量的情况下所做的是发出一个非常低级的错误,E_NOTICE默认情况下甚至不会报告,但建议在开发过程中允许手册。  X+ n, L7 }; ?7 W3 o, h1 d
处理问题的方法:
8 M: B- X; L6 Q" H[ol]推荐:例如,当您尝试将字符串添加到未定义的变量中时,声明您的变量。或者 在引用它们之前使用isset()/!empty()来检查它们是否已声明,如下所示:[/ol]php   //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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$ `7 f( O, c& _5 B从 PHP 7.从0 开始,它变得更清晰了,现在你可以用了null 合并运算符:
3 R- v9 V% h1 h% f: C9 K0 [& j* Tphp   // Null coalesce operator - No need to explicitly initialize the variable.   $value = $_POST['value  
) v2 f  ?3 {6 j1 c+ ]) J) ~[ol]为 E_NOTICE设置自定义错误处理程序,重定向标准输出消息(可能到日志文件):[/ol]php   set_error_handler('myHandlerForMinorErrors',E_NOTICE | E_STRICT)
4 x  r0 ?- A4 [$ Q[ol]禁用 E_NOTICE 报告E_NOTICE是:[/ol]php   error_reporting( error_reporting() & ~E_NOTICE )0 [5 f  C+ k9 D0 l. I& O
[ol]使用@ 操作符抑制错误。[/ol]注意:强烈建议只实施第 1 点。' z4 I4 v9 u* x
注:未定义索引/未定义偏移当您(或 PHP)本通知将出现在试图访问数组未定义索引时。$ T7 k% {3 x$ T; c* U' z# W" D
处理问题的方法:
/ A9 w' N2 p5 D/ {2 ?[ol]检查索引是否存在于访问前。为此,您可以使用它isset()或array_key_exists():[/ol]php   //isset()   $value = isset($array['my_index) $array['my_index  array_key_exists()   $value = array_key_exists('my_index',$array) ? $array['my_index ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5 n& e6 z# V) t  Y7 n  I  X
[ol]语言构造list()在尝试访问不存在的数组索引时,可能会生成此信息:[/ol]php   list($a,$b) = array(0 => 'a);or   list($one,$two) = explode,test string');" t8 ]& d1 C# \( ]' U9 F
两个变量用于访问两个数组元素,但只有一个数组元素 index因此,这将产生:2 Z0 l- ~! S& C) R: ]
注:未定义的偏移:1
2 p* S# @7 u8 ?4 \) u+ T+ Z7 ]$_POST/ $_GET/$_SESSION可变使用$_POST,$_GET上述注意事项经常出现$_SESSION。对于$_POST和$_GET如果索引存在或不使用它们,你只需要检查一下。$_SESSION一定要保证会话开始session_start()并且索引也存在。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则