PHP和javascript(EXTJS)-以服务器端OOP方式验证表单字段

PHP和javascript(EXTJS)-以服务器端OOP方式验证表单字段,javascript,php,validation,oop,extjs,Javascript,Php,Validation,Oop,Extjs,在我的应用程序中,表单字段在客户端通过javascript(EXTJS)进行验证 虽然我没有PHP OOP方面的经验,但我也想用PHP OOP的方式在服务器端验证它们 为此,在研究各种验证可能性之后,我使用以下代码: 我遵循这个例子: 类验证程序 <?php class Validator { private $fields = array(); private $field_errors = array(); private $form_is_valid = true; priva

在我的应用程序中,表单字段在客户端通过javascript(EXTJS)进行验证

虽然我没有PHP OOP方面的经验,但我也想用PHP OOP的方式在服务器端验证它们

为此,在研究各种验证可能性之后,我使用以下代码:

我遵循这个例子:

类验证程序

<?php

class Validator {

private $fields = array();
private $field_errors = array();
private $form_is_valid = true;

private $allErrors = array(); //added » edited


public function addField($field_name){
    $this->fields[] = $field_name;
    $this->field_errors[$field_name] = array();
}

public function addValidationRule($field_name, $field_rule, $value){
    $rule_name = $field_rule[0];

    switch($rule_name){

        case 'empty':
            if(strlen($value) == 0){
                $this->addValidationError($field_name, ucwords($field_name). " error msg empty");
            }
        break;

        case 'min_lenght':
            if(strlen($value) < $field_rule[1]){
                $this->addValidationError($field_name, ucwords($field_name). " error msg min_lenght");
            }
        break;

    }
}

private function addValidationError($field_name, $error_message){
    $this->form_is_valid = false;
    $this->field_errors[$field_name][] = $error_message;
}

public function formValid(){
    return $this->form_is_valid;
}

public function outValidationError($field_name){
     if(isset($this->field_errors[$field_name])){
         foreach($this->field_errors[$field_name] as $field_error){
             //$allErrors[] = $field_error;
             $this->allErrors[] = $field_error;//added » edited
         }
     }
 }

public function outAllValidationError(){
     foreach($this->fields as $field){
         $this->outValidationError($field);
     }
     return $this->allErrors; //added » edited » works ok
 }

}

?>

使用准备好的语句进行查询

<?php

require('conect.php');
$action = $_REQUEST['action'];

switch($action){

  case "create":{

    $records = $_POST['records'];
    $data = json_decode(stripslashes($records));

    $cars = $data->{'cars'};


    if ($_SERVER["REQUEST_METHOD"] == "POST") {

        require_once('validator.php');
        $validator = new Validator();

        $validator->addField('cars');
        $validator->addValidationRule('cars', array('min_lenght', 4), $cars);
        $validator->addValidationRule('cars', array('empty'), $cars);

        if($validator->formValid()){

                $sqlQuery = "INSERT INTO the_cars (cars)
                            VALUES (?)";

                if($statement = $con->prepare($sqlQuery)){
                    $statement->bind_param("s", $cars);
                    $statement->execute();
                    $success= true;
                }else{
                    $erro = $con->error;
                    $success = false;
                }
        }else{
            $allErrors = $validator->outAllValidationError(); 
            $success = false;

        }

        echo json_encode(array(
            "success" => $sucess,
            'errors'=> $erro,
            'errorsValidation'=> $allErrors 
        ));

        $statement->close();
        $conexao->close();

        break;
    }
?>

问题是使用json encode将验证错误数组导出到客户端

如果在outValidacionError()函数中,我取消注释print\r($allErrors)并使表单提交时cars字段为空,它将在控制台上打印错误

但是,我无法将这些错误发送到客户端。少了什么

我很欣赏改进代码或其他解决方案的建议

编辑:

由于我的json_解码是针对对象而不是关联数组进行的,因此我更改了代码,使其与所进行的解码兼容,并向addValidationRule()添加$value

已编辑


使用正确的解决方案编辑的代码

如果使用函数封装行为,则不应尝试使用全局变量存储其输出。它们的副作用应该是最小的,如果需要,它们应该只操纵自己对象的属性

您的
$allErrors
变量在任何地方都没有声明,特别是没有声明为全局变量。因此,当您在函数内部填充它时,会得到一个局部作用域变量,该变量将在函数完成后被丢弃

您可能希望从函数中返回它们

return $allErrors;
然后从函数调用中获取值:

$allErrors = $validator->outAllValidationError()

我根据Alexander的建议对代码进行了一些修改。在类验证器中使用print_r()时,我会收到错误消息,但在调用outAllValidationErrors()函数时,我无法以json格式发送数据$allErrors为空。返回if子句中的值;您是否检查过if子句的计算结果是否为
true
?如果该子句的计算结果为false,该怎么办?再次感谢Alexander。如果foreach循环后的outAllValidationErrors()函数中包含return$this->allErrors,则该函数运行良好。