Php 方法属性输入验证
我应该如何处理方法的输入验证?Php 方法属性输入验证,php,oop,design-patterns,Php,Oop,Design Patterns,我应该如何处理方法的输入验证? 在这两种方法中,哪一种更正确?或者有更好的方法 此方法由构造函数调用,$prodID可以是用户输入,也可以来自数据库 private function fill_data1($prodID) { //Way 1 filter_var($prodID, FILTER_VALIDATE_INT, array('options'=>array('min_range'=>1, 'max_range'=>1000000))); if
在这两种方法中,哪一种更正确?或者有更好的方法
此方法由构造函数调用,$prodID可以是用户输入,也可以来自数据库
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']);
}
验证输入时,您不应使用
die()
。您的用户应该会看到一条正确的错误消息以及关于如何提供正确输入的提示 因此,我建议您使用第一种方法。
根据您的体系结构,抛出异常而不是返回false可能更有意义。选项3:使用异常并使ID验证尽可能接近数据
public function getArtData($id) {
if (!is_int($id) || $id <= 0) {
throw new InvalidIdentifierException(
"Article ID $id must be a valid, positive integer.");
}
...
}
调用
die()。单元测试更加困难,它迫使您将错误显示代码置于故障点。当您想使用web服务中的代码时会发生什么情况?是的,die有点苛刻,但如果输入无效,用户肯定会选择消息(这将是页面上唯一的内容)。执行必须立即停止,下一步可能是db写入..我讨厌这个注释框,按enter自动提交。。。在这里使用异常的正确方法是什么?
function displayProductAction(...) {
$prodID = $request->getParam('prod');
$form = ...
try {
$form->fill_data($prodID)
$view->form = $form;
}
catch (InvalidIdentifierException $e) {
$view->error = $e->getMessage();
}
$view->render();
}