Php if($ var)曾经工作过

时间:2014-10-07 10:34:46

标签: php if-statement isset

我有一个网站的som代码,以前用得很好。我想检查是否设置了变量或会话。我使用了以下代码:

if ($_GET['something']){ //Do something }

现在我尝试在本地服务器上安装它,我得到一个错误代码,说有一个未定义的索引。

这需要我这样做:

if (isset($_GET['']) { //Do something }

我可以快速修复此问题,因为我不想更改代码这么多地方吗?

5 个答案:

答案 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;])){}