2011-04-06 63 views
2

我正在使用正常的数据库方法而不是预准备语句的数据库驱动的网站。因此,我必须在传递给表单动作PHP脚本时清理POST和GET变量。错误抑制运算符是否使用错误练习?

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

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

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

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

我试图达到如下一行:

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

您怎么看?


这有点被问什么我这里延续:
Passing unset variables to functions

回答

3

保存自己的一些编码,并“输入”类的几个静态函数,就像这样:

class Input { 

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

     // same thing for $_POST... 

} 

然后,你可以打电话给你的sanitize函数是这样的...

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

现在,我喜欢! – 2011-04-06 22:17:09

+0

这是相当冗长的,考虑到它做同样的事情。 – 2011-04-06 22:25:16

+0

@Tomalak - 确实,它需要更多的代码行,但它封装了逻辑,使得所有事情都变得更具表现力,IMO。 – TaylorOtwell 2011-04-06 22:30:09

5

使用@算,确实,通常被认为是不好的做法。


在你的情况下,它可能是可以避免的,由分裂的事情在几个步骤:

  • 测试变量被设置 - 与isset()
  • 工作 - 或者不是:
    • 如果设置,则使用默认值对其进行消毒
    • 其他。

由于@操作可避免,在这里...好,我会避免。


注:

  • 掩盖错误通常是没有这样一个好主意(在这种情况下,不应该伤害了......不过,还是)
  • @运营商有一个成本,说到性能。
  • 单行不是目的,应该一定;-)


1.但有些人会说,这不管那么多了 - 他们可能是正确的

+0

我同意你的意见,但我试图避免所有额外的步骤。我非常喜欢TaylorOtwell提出的静态输入类的概念,请参阅您的想法。 – 2011-04-06 22:19:35

1

您可以使用terany运营商要测试存在,使用错误suprression操作避免:

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

通常使用抑制运算符被认为是一种不好的做法,所以使用像这样的terany运算符将避免抑制错误以及给你想要的效果。

+0

再加上所有额外的大括号...... $ page =!empty($ foo)? $ xyz:'default'; – dogmatic69 2011-04-06 22:31:57

+0

你错过了?我不能编辑它因为网站是跛脚,'必须改变超过6个字符' – dogmatic69 2011-04-06 22:40:32

-1

要用isset避免货物崇拜编程语法我在输入数组周围使用了对象包装。它专门在幕后进行检查,所以我可以避免愚蠢的遗漏 @。

为了您的例子,我会写$_GET->int->default("time", time())
$_GET->sanitize["page"],如果所有的规则都只是$_GET["whatever"]自动过滤预定义。

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

+0

所以你滥用OO只是为了避免被视为一只羊。有趣! – 2011-04-06 22:22:41

+0

如果通过滥用OO你意味着一个紧凑的API和更少的努力,是的。 – mario 2011-04-06 22:23:58

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是全局变量,表示_POST $ _GET + $ + $ _COOKIE,但你可能cutomize我的版本。

0

一般而言,其他答案是正确的。有一些问题使用@来假装错误不存在。

也就是说,在这个的情况下,我会用你的方法。它很清晰,简洁,在这个小场景中— — 只是做的工作。我很难在这里想到潜在的错误。