我正在运行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楼
为什么不保持简单?
<?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
?>
#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
<?=$_POST['something']?>
...再想一想! 更好的解决方案是:
// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>
(我使用自定义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
,它从