这是错误的做法使用错误抑制操作符吗?

时间:2011-04-06 21:53:00

标签: php post error-handling get sanitization

我正在使用数据库驱动的站点,该站点使用的是普通数据库方法而不是预处理语句。因此,我必须在传递给表单操作PHP脚本时清理POST和GET变量。

定义了sanitise方法,试图尽可能地清理用户输入,但我试图减少测试POST和GET变量存在的代码以及用于定义默认变量的代码值,如果它们不存在。

这是我想出来的,但它在我和其他开发人员口中留下了不好的味道,因为我们都觉得错误抑制操作符被滥用:

$Page      = sanitise(@$_GET["page"], "Unspecified");
$Timestamp = sanitise(@$_POST["time"], time());

请你能否批评一下这段代码?这并不理想我会同意,但它确实减少了很多代码,并且比我们的代码更具可读性。

我尝试在一行中实现以下目标:

  1. 测试变量的存在。
  2. 如果存在,请清理输入并分配给变量。
  3. 如果它不存在,请创建一个变量,但使用默认值。
  4. 您怎么看?


    这是我在这里要求的延续:
    Passing unset variables to functions

6 个答案:

答案 0 :(得分:5)

事实上,使用@运算符通常被认为是不好的做法。


在您的情况下,可以通过以下几个步骤分割事物来避免:

  • 使用isset()
  • 设置测试变量
  • 工作 - 或不:
    • 如果设置,清理它
    • 其他,使用默认值。

由于可以避免@运算符,所以......好吧,我会避免它。


注意:

  • 掩盖错误通常不是一个好主意(在这种情况下,它不应该伤害太多......但是,仍然)
  • 并且@运算符有成本,说到性能 1
  • 单线不是一个人应该拥有的目标; - )


1。 但有些人会说这并不重要 - 他们可能是对的

答案 1 :(得分:4)

保存自己的一些编码并创建一个带有几个静态函数的“Input”类,如下所示:

class Input {

      public static function get($key, $default = null)
      {
            return (array_key_exists($key, $_GET)) ? $_GET[$key] : $default;
      }

      // same thing for $_POST...

}

然后你可以像这样调用你的消毒功能......

sanitize(Input::get('page', 'Unspecified'));

答案 2 :(得分:1)

您可以使用terany运算符来测试是否存在,避免使用错误抑制运算符:

$Page = (!empty($_POST['test'])) ? $_POST['test'] : 'default';

通常使用抑制算子被认为是一种不好的做法,所以使用这样的terany算子可以避免出现错误,并避免产生预期的效果。

答案 3 :(得分:0)

@运算符不会避免错误,它会使它完全消失。但如果你检查错误,你将有一个。这就是为什么这是一个不好的做法。但也因为隐藏错误通常会带来麻烦。

这是一个好方法:

$Page = (isset($_GET['page'])) ? $_GET['page'] : 'default';
$Page = sanitise($Page, "Unspecified");

但是因为你有一个sanitize()函数,你可以升级它并为你做这个检查。

function sanitise($value, $default, $fromRequest=false)  {
 if ($fromRequest) $value = (isset($_REQUEST[$value])) ? $_REQUEST$value] : $default;
  ..
}

$ _ REQUEST是代表$ _GET + $ _POST + $ _COOKIE的全局变量,但您可以缩减我的版本。

答案 4 :(得分:0)

一般来说,其他答案都是正确的。使用@假装错误不存在时会出现问题。

那就是说,在这个的情况下,我会用你的方法。它清晰易懂,简洁明了 - 在这个小小的场景中 - 只是完成工作。我很难想到这里潜在的错误。

答案 5 :(得分:-1)

为了避免使用isset的货物编程语法,我在输入数组周围使用对象包装器。它特意在幕后进行检查,因此我可以避免使用愚蠢的 @。

对于你的例子,我会写$_GET->int->default("time", time())
$_GET->sanitize["page"]以及所有规则是否仅使用自动过滤预定义为$_GET["whatever"]

否则我仍然会使用@ $ _ GET,因为我不相信外观编码。