我正在使用数据库驱动的站点,该站点使用的是普通数据库方法而不是预处理语句。因此,我必须在传递给表单操作PHP脚本时清理POST和GET变量。
定义了sanitise
方法,试图尽可能地清理用户输入,但我试图减少测试POST和GET变量存在的代码以及用于定义默认变量的代码值,如果它们不存在。
这是我想出来的,但它在我和其他开发人员口中留下了不好的味道,因为我们都觉得错误抑制操作符被滥用:
$Page = sanitise(@$_GET["page"], "Unspecified");
$Timestamp = sanitise(@$_POST["time"], time());
请你能否批评一下这段代码?这并不理想我会同意,但它确实减少了很多代码,并且比我们的代码更具可读性。
我尝试在一行中实现以下目标:
您怎么看?
这是我在这里要求的延续:
Passing unset variables to functions
答案 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,因为我不相信外观编码。