我有一个网站的som代码,以前用得很好。我想检查是否设置了变量或会话。我使用了以下代码:
if ($_GET['something']){ //Do something }
现在我尝试在本地服务器上安装它,我得到一个错误代码,说有一个未定义的索引。
这需要我这样做:
if (isset($_GET['']) { //Do something }
我可以快速修复此问题,因为我不想更改代码这么多地方吗?
答案 0 :(得分:3)
您之前没有收到错误,因为您的error_reporting和/或display_error设置设置得过于宽松。您的第一个代码段 试图访问可能不存在的数组中的值。如果不是PHP 总是 发出通知
只有发出通知后才能发出通知(关闭display_errors
或将error_reporting
设置为不报告通知(~E_NOTICE
)。< / p>
你要求快速修复:
if (isset($_GET['something']))
只需要您添加isset()
。这很快,它解决了这个问题。此外:使用isset
是您应该做的事情。总是
偏离主题,但也许有用:
正如我在评论中所解释的那样:现在最好的解决方法是解决问题本身,而不是忽略通知。为此,一个简单的脚本扫描您的项目目录中的.php文件(使用glob
),读取它们并查找模式可能会有用:
foreach ($phpFiles as $file)
{
$code = file_get_contents($file);//read the file
if (preg_match_all('/if\s*\(\$[^[]+\[[^]]+\]\s*\)/',$code, $matches))
{//find all usages of "if ($rawVar['offset'])" in code
echo 'Expressions to check or fix in file: ', $file,':', PHP_EOL, '=>';
echo implode(PHP_EOL.'=>', $matches[0]), PHP_EOL;
}
}
运行脚本,或许将输出写入临时文件,然后设置为工作。输出应该类似于:
Expressions to check or fix in file: scriptname.php:
=> if ($_GET['something'])
=> if ($var[123])
等等。这是一种可行的格式,并且给定时间,您也可以编写脚本来自动重构代码。
也许在这里使用的更全面(如完整的)正则表达式将是:
/if\s*\((\|\||&&|\()?\$[^[]+\[[^]]+\]\s*(\|\||&&|\))?/
但是,这也有一些警告,但这是一个开始。
添加作业 - 我还会为您提供一个帮助:添加修复您在$var = $_GET['something'];
等作业表达式中获得的问题的代码。这可以自动完成,也非常容易:
foreach ($phpFiles as $file)
{
$code = file_get_contents($file);//read the file
$clean = preg_replace(
'/(\$[^\s]+\s*={1}\s*)(\$[^[]+[^]]+\])\s*;/',
'$1isset($2) ? $2 : null;',
$code
);
file_put_contents($file, $clean);
}
我已经像这样测试了这段代码:
$code = '$foo = 123;
$foo = $_GET["bar"];';
$clean = preg_replace(
'/(\$[^\s]+\s*={1}\s*)(\$[^[]+[^]]+\])\s*;/',
'$1isset($2) ? $2 : null;',
$code
);
echo $clean, PHP_EOL;
它产生了预期的输出:
$foo = 123;
$foo = isset($_GET["bar"]) ? $_GET["bar"] : null;
结合这两个正则表达式,你应该很好地重构你的代码......
答案 1 :(得分:1)
检查您是否有参数
东西
如果不是,则传递一些虚拟值进行检查。
答案 2 :(得分:1)
有两种方法可以修复或隐藏它。
第一个选项更好,可以使用isset()
功能完成,这是最佳解决方案。
另一种方法是隐藏您可以使用error_reporting(E_ALL & ~E_NOTICE);
执行此操作的通知错误我不推荐此解决方案
答案 3 :(得分:0)
如果您在检查时已经确定了$_GET['something']
的值,或者已经定义了if ($_GET['something']){
,那么将无法通知。此外,您在本地服务器上错误报告而不是在第二台服务器上,因此在本地服务器上提供通知。
isset()
如果未定义,则需要使用empty()
或if (isset($_GET['something'])){ // will check variable is already set
if (!empty($_GET['something'])){ // will check variable value is not blank or 0
来避免php通知。
{{1}}
或者您需要使用空白或某些预定义值初始化变量。
答案 4 :(得分:0)
使用这可能会有所帮助if(($ $ _ GET [&#39;&#39;])){}