【问题标题】:Trouble with input error-checking system PHP输入错误检查系统PHP的问题
【发布时间】:2012-12-13 07:13:36
【问题描述】:

我正在尝试使用 PHP 实现错误检查系统(字符太少、输入空白等...)。

现在,如果我留下空白标题,则会捕获错误,但不会显示消息。这是实际检查输入的第一部分(仅显示事件标题)

Class check_errors{

function create_event_errors($event_title){
    global $submit_error;
    if($event_title == ""){
        $field = "event_title";
        $submit_error->setError($field,"Title cannot be blank");
    }
    elseif(strlen($event_title) < 5){
        $field = "event_title";
        $submit_error->setError($field,"Title must be longer than 5 characters");
    }
    elseif(strlen($event_title) > 75){
        $field = "title";
        $submit_error->generalError($field,"Title must be less than 40 characters");
    }
}

所以,在同一页面上,这是 display_errors 类

Class display_errors{
var $values = array();  //Holds submitted form field values
var $errors = array();  //Holds submitted form error messages

function setValue($field, $value){
     $this->values[$field] = $value;
  }

function setError($field, $errmsg){
    $this->errors[$field] = $errmsg; //if I echo this, the error message displays
    $this->num_errors = count($this->errors); //if I echo this, the # of errors displays
}

function value($field){
  if(array_key_exists($field,$this->values)){
     return htmlspecialchars(stripslashes($this->values[$field]));
  }else{
     return "";
  }
}   

 function error($field){    
     if(array_key_exists($field,$this->errors)){
        return $this->errors[$field];
     }else{
       return "";
     }
  }
}

现在讨论这个问题。当我尝试检查是否检测到错误时,它什么也没找到

$check_errors->create_event_errors($event_title); //submit the input to be checked

echo $display_errors->num_errors; //this does not display the # of errors. It does when I echo from within the function in the class though

if($display_errors->num_errors == 0){
   //submit event
}

【问题讨论】:

  • 变量$displa_errorsglobal $submit_error指向同一个对象?
  • 不,我只是把那个 echo 语句放在那里看看我是否可以访问错误并且什么都没有出现。这只是为了检查那个实例。
  • 两个对象应该相同
  • 哪些对象?我有一个对象可以访问 error_checking 类,另一个对象可以访问 display_errors 类。它们不可能相同。
  • 您可能希望避免使用“global”关键字。并查找 PHP 函数 filter_var(),因为如果你正确使用它,它可以为你节省很多工作。

标签: php object


【解决方案1】:

不要使用var,不要使用global并定义所有属性。还要考虑@harke 的指针以获得更好的代码设计。

class check_errors
{
    protected $errors;

    function __construct(display_errors $errors) {
        $this->errors = $errors;
    }

    function create_event_errors($event_title){
        if($event_title == ""){
            $field = "event_title";
            $this->errors->setError($field,"Title cannot be blank");
        }
        elseif(strlen($event_title) < 5){
            $field = "event_title";
            $this->errors->setError($field,"Title must be longer than 5 characters");
        }
        elseif(strlen($event_title) > 75){
            $field = "title";
            $this->errors->generalError($field,"Title must be less than 40 characters");
        }
    }
}

class display_errors
{
    protected $values = array();  //Holds submitted form field values
    protected $errors = array();  //Holds submitted form error messages
    public $num_errors = 0;

    function setValue($field, $value){
        $this->values[$field] = $value;
    }

    function setError($field, $errmsg){
        $this->errors[$field] = $errmsg; //if I echo this, the error message displays
        $this->num_errors = count($this->errors); //if I echo this, the # of errors displays
    }

    function value($field){
        if(array_key_exists($field,$this->values)){
            return htmlspecialchars(stripslashes($this->values[$field]));
        }else{
            return "";
        }
    }   

    function error($field){    
        if(array_key_exists($field,$this->errors)){
            return $this->errors[$field];
        }else{
            return "";
        }
    }
}

运行代码

$display_errors = new display_errors();
$check_errors = new check_errors($display_errors);

$check_errors->create_event_errors($event_title); //submit the input to be checked

echo $display_errors->num_errors;

if($display_errors->num_errors == 0){
    //submit event
}

【讨论】:

  • 效果很好,非常感谢!只是好奇,你能简单解释一下这个结构吗?它几乎显示为类似继承的功能,判断您如何使用 $this 来调用该函数。我以前见过它们,但从未使用过它们。我读了这篇文章,它清理了一点,但我仍然希望参考你的例子stackoverflow.com/questions/3032808/purpose-of-php-constructors
  • $this 表示当前对象。如果要在 check_errors 对象中使用 display_errors 对象,则需要传递它。一种常见的方法是通过构造函数。
  • 注意它调用的是$this->errors->setError(),也就是$this->errors的setError方法,也就是display_errors对象。
  • 对不起,我在质疑构造函数的使用,我指的不是 $this。感谢您清理它!
【解决方案2】:

不知道这是否会给您带来任何麻烦:

$field == "title";

这句话和写作一样有用;

true or false;

你的意思可能是:

$field = "title";

(单等号)


只是给你一些指点:

  • 创建验证器类(参见:Interfaces Docs)。
  • 为错误集合创建一个类。
  • 为验证和错误消息的复杂定义创建一个类。
  • 允许堆叠多个最后一个,以便能够将多个验证的集合视为一个(请参阅:Composite Pattern)。

完成后,您可以独立验证并决定如何处理结果。编写代码也更容易,因为你不能引入这么多错误,即使你这样做了,也更容易修复。

同时保持具体的字段名独立于验证。

【讨论】:

  • 我会进一步调查。您是否看到我当前的设置不起作用的任何原因?我可以从内部显示错误的数量,但是当我尝试从外部访问同一个变量时,它不会显示任何内容。
  • 不知道,你的代码看起来很间接,所以我没有仔细看。也许是使用等号(编辑了答案,看看我放在上面的内容)。此外,您应该真正创建自己的验证器类。
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 2016-10-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2012-09-08
相关资源
最近更新 更多