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

Gar*_*hby 2 php error-handling post sanitization get

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

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

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

$Page      = sanitise(@$_GET["page"], "Unspecified");
$Timestamp = sanitise(@$_POST["time"], time());
Run Code Online (Sandbox Code Playgroud)

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

我尝试在一行中实现以下功能:

  1. 测试变量的存在.
  2. 如果存在,请清理输入并分配给变量.
  3. 如果它不存在,请创建变量但使用默认值.

你怎么看?


这是我在这里要求的延续:将未
设置的变量传递给函数

Pas*_*TIN 5

@实际上,使用运营商通常被认为是不好的做法.


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

  • 测试变量是设置的 - 用 isset()
  • 正在努力 - 或不:
    • 如果设置,消毒它
    • 否则,使用默认值.

由于@操作员可以避免,这里......好吧,我会避免它.


备注:

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


1. 但有些人会说没关系那么多-他们可能是正确的


Tay*_*ell 5

为自己节省一些编码并使用几个静态函数创建一个“输入”类,如下所示:

class Input {

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

      // same thing for $_POST...

}
Run Code Online (Sandbox Code Playgroud)

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

sanitize(Input::get('page', 'Unspecified'));
Run Code Online (Sandbox Code Playgroud)