我正在运行一个PHP脚本,并继续收到错误,如:
注意:未定义变量my_variable_name在C:\wamp\www\mypath\index.php第10行
注意:第11行未定义索引:my_index C:\wamp\www\mypath\index.php
警告:在C:\wamp\www\mypath\index.php第11行未定义数组键“my_index”
第10和11行是这样的:
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
这些错误消息的含义是什么?
为什么他们会突然出现?我曾经使用这个脚本多年,从来没有任何问题。
我该如何修复它们?
这是一个一般参考问题,供人们链接作为副本,而不是需要一遍又一遍地解释这个问题。我觉得这很有必要,因为现实世界中关于这个问题的答案都非常具体。
相关元讨论:
如何应对重复的问题?
“参考问题”有意义吗?
这些注意是因为您没有定义used变量,并且my_index键没有出现在$my_array变量中。
这些通知每次都会被触发,因为您的代码不正确,但可能您没有通知的报告。
解决bug:
$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)
抛出未定义索引通知的另一个原因是数据库查询中遗漏了一列。
例如:
$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 thrown
echo "<br>";
echo $row['col3']; // undefined index thrown
}
另外需要注意的是,在*NIX操作系统和Mac OS X上,事情是区分大小写的。
参考Stack上的以下问答:
MySQL中的表名是否区分大小写?
Mysql查询中区分大小写的表名
MySql -表在不同服务器中的大小写敏感问题
在回答“为什么他们突然出现?”我使用这个脚本很多年了,从来没有遇到过任何问题。”
对于大多数网站来说,在“默认”错误报告下操作是很常见的,“显示所有错误,但不显示‘通知’和‘已弃用’”。这将在php.ini中设置,并应用于服务器上的所有站点。这意味着示例中使用的那些“通知”将被抑制(隐藏),而其他被认为更严重的错误将被显示/记录。
另一个关键设置是可以隐藏错误(即display_errors设置为“off”或“syslog”)。
在这种情况下发生的情况是,error_reporting被更改为也显示通知(如示例所示)和/或设置被更改为屏幕上的display_errors(而不是抑制它们/记录它们)。
他们为什么改变了?
最明显/最简单的答案是有人在PHP .ini中调整了这些设置之一,或者PHP的升级版本现在使用与以前不同的PHP .ini。这是首先要看的地方。
但是,也可以覆盖这些设置
.htconf (webserver配置,包括vhosts和子配置
. htaccess
在PHP代码中
这些都可以被改变。
还有一个额外的复杂性,web服务器配置可以启用/禁用。htaccess指令,所以如果你的。htaccess指令突然启动/停止工作,那么你需要检查它。
(.Htconf / .htaccess假设你以apache运行。如果运行命令行,这将不适用;如果运行IIS或其他web服务器,则需要相应地检查这些配置)
总结
检查php.ini中的error_reporting和display_errors php指令是否更改,或者您使用的php.ini与以前不同。
检查error_reporting和display_errors php指令在.htconf(或vhosts等)没有改变
检查error_reporting和display_errors php指令在.htaccess中没有改变
如果你在.htaccess中有指令,检查它们在.htconf文件中是否仍然被允许
最后检查你的代码;可能是一个不相关的库;查看error_reporting和display_errors PHP指令是否已经设置在那里。
我一直使用自己的有用函数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;
}
试试这些
Q1:这个通知意味着$varname不是
的当前范围内定义
脚本。
Q2:在使用任何可疑变量之前,使用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