【问题标题】:Php if($var) used to work [closed]Php if($var) 曾经工作 [关闭]
【发布时间】:2014-12-01 18:19:51
【问题描述】:

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

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

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

这需要我做:

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

我可以快速解决这个问题吗,因为我不想在很多地方更改代码?

【问题讨论】:

  • 试试 if (isset($_GET['something']))
  • 那么something 不是该请求的“失败服务器”上的获取参数(即在查询字符串中)。很可能只是一个不同的请求/URL 缺少所说的 GET 参数。解决方案:在使用之前检查密钥是否存在..或提供有效的查询字符串,否则忽略此类通知..
  • isset 是解决方法。这是开展业务的最佳方式

标签: php if-statement isset


【解决方案1】:

如果您在检查时具有$_GET['something'] 的值或者它已经定义,则将在没有通知的情况下工作。此外,您在本地服务器上而不是在第二台服务器上错误报告,因此在本地服务器上通知您。

if ($_GET['something']){ 

如果未定义,您需要使用isset()empty() 来避免php 通知。

if (isset($_GET['something'])){ // will check variable is already set
if (!empty($_GET['something'])){ // will check variable value is not blank or 0

或者你需要用空白或一些预定义的值来初始化一个变量。

【讨论】:

    【解决方案2】:

    检查是否有参数

    某事

    如果不是,则传递一些虚拟值进行检查。

    【讨论】:

      【解决方案3】:

      有两种方法可以修复或隐藏它。

      第一个选项更好,可以使用isset() 函数完成,这是最好的解决方案。

      另一种方法是隐藏通知错误,您可以使用error_reporting(E_ALL & ~E_NOTICE); 做到这一点我不推荐此解决方案

      【讨论】:

        【解决方案4】:

        您之前没有收到该错误,因为您的 error_reporting 和/或 display_error 设置过于宽松。您的第一个 sn-p 正在 尝试访问可能不存在的数组中的值。如果没有,PHP 总是会发出通知。
        只有在通知发出后才能将其隐藏(通过关闭display_errors 或将error_reporting 设置为不报告通知(~E_NOTICE)。

        您要求快速修复:

        if (isset($_GET['something']))
        

        只需要您添加isset()。这很快,它解决了这个问题。此外:使用isset 是您应该 做的。总是。


        题外话,但也许有用:
        正如我在 cmets 中所解释的:现在对您来说最好的做法是解决问题本身,而不是忽略通知。为此,一个简单的脚本可以扫描您的项目目录中的 .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;
        

        结合这两个正则表达式,您应该可以很好地重构您拥有的代码...

        【讨论】:

        • 哦,好的。但这发生在大约 100 个文件中。所以我想简单的快速解决方法是不报告通知。
        • @TobiasLindgreen:那会忽略问题,而不是解决问题......
        • 我知道 :) 但在未来的项目中,我知道我应该使用 isset()。该网站在此之前运行良好;-)
        • @TobiasLindgreen:请注意,通知确实会产生成本(它们会减慢您的速度),并且它们的重点是指出可能隐藏的错误(var 名称中的拼写错误等...)悲伤,他们将最终。我将添加一个真正简短的蛮力脚本,让你的生活更轻松(重构)
        • 我想我只需要重构我的代码然后:-)
        【解决方案5】:

        使用它可能会有所帮助 if(isset(@$_GET[''])){ }

        【讨论】:

        • 使用 isset 语言结构将阻止 PHP 发出通知,您不需要 evil @ 运算符。 @ 是一个错误抑制器。通知会通知您可能存在的问题,抑制它们就是忽略可能是错误的地方。这就像建议孩子不要听父母说火很热:它会被烧毁。不要使用@
        猜你喜欢
        • 2011-09-26
        • 2010-09-29
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多