我应该如何处理方法的输入验证?
在这两个中,哪一种更正确?或者有更好的方式
构造函数调用此方法,$ prodID可以是用户输入,也可以来自db。
private function fill_data1($prodID)
{
//Way 1
filter_var($prodID, FILTER_VALIDATE_INT, array('options'=>array('min_range'=>1, 'max_range'=>1000000)));
if (is_null($prodID)) {
return FALSE;
} elseif ($prodID === FALSE) {
return FALSE;
}
$prod = getArtData($prodID);
$this->set_id($prod['artID']);
$this->set_name($prod['artName']);
$this->set_price($prod['precio']);
}
private function fill_data(2$prodID)
{
//Way 2
filter_var($prodID, FILTER_VALIDATE_INT, array('options'=>array('min_range'=>1, 'max_range'=>1000000)));
if (is_null($prodID) || $prodID === FALSE)
{
die('invalid input for prodID (' . $prodID . '). It has to be an integer > 0');
}
$prod = getArtData($prodID);
$this->set_id($prod['artID']);
$this->set_name($prod['artName']);
$this->set_price($prod['precio']);
}
答案 0 :(得分:1)
选项3:使用例外并将ID验证尽可能接近数据。
public function getArtData($id) {
if (!is_int($id) || $id <= 0) {
throw new InvalidIdentifierException(
"Article ID $id must be a valid, positive integer.");
}
...
}
返回false
的问题是您必须检查返回值以处理并跳过它。如果您处理它(表示层)的位置是从它验证的位置(数据层)中删除了几个函数调用,则必须在每个级别检查false
。异常将传播到捕获它的第一个函数,绕过每个函数中的剩余代码。
function displayProductAction(...) {
$prodID = $request->getParam('prod');
$form = ...
try {
$form->fill_data($prodID)
$view->form = $form;
}
catch (InvalidIdentifierException $e) {
$view->error = $e->getMessage();
}
$view->render();
}
致电die()
会导致自己遇到困难。单元测试更难,它会强制您将错误显示代码置于故障点。当您想要使用来自网络服务的代码时会发生什么?
答案 1 :(得分:0)
验证输入时,不应使用die()
您的用户应该看到正确的错误消息并提示如何提供正确的输入。
因此我建议您使用第一种方式 根据您的体系结构,抛出异常而不是返回false可能更有意义。