【问题标题】:PHP and javascript (EXTJS) - validate form fields in server side OOP wayPHP 和 javascript (EXTJS) - 以服务器端 OOP 方式验证表单字段
【发布时间】:2017-08-29 14:26:10
【问题描述】:

在我的应用中,表单字段在客户端使用 javascript (EXTJS) 进行验证。

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

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

我正在关注这个例子:https://www.youtube.com/watch?v=MlJJyva75t8#t=38.9063742

类验证器

<?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;
    }
?>

y 问题是使用 json 编码将验证错误数组导出到客户端。

如果在 outValidacionError() 函数中我取消注释 print_r ($ allErrors) 并提交表单,其中汽车字段为空,它会在控制台上打印错误。

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

感谢有关改进代码或其他解决方案的建议。

已编辑:

由于我的 json_decode 是针对对象而不是关联数组完成的,因此我更改了代码以使其与所做的解码兼容,将 $value 添加到 addValidationRule()

已编辑

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

【问题讨论】:

    标签: javascript php validation oop extjs


    【解决方案1】:

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

    您的$allErrors 变量在任何地方都没有声明,尤其是没有作为全局变量声明。所以当你在函数中填充它时,你会得到一个局部范围的变量,一旦函数完成,它就会被丢弃。

    你可能想从你的函数中返回它们

    return $allErrors;
    

    然后从函数调用中获取值:

    $allErrors = $validator->outAllValidationError()
    

    【讨论】:

    • 我根据 Alexander 的建议对代码进行了一些修改。使用类 Validator 中的 print_r () 时,我会收到错误消息,但是当我调用 outAllValidationErrors () 函数时,我无法以 json 格式发送数据。 $allErrors 为空。
    • 您在 if 子句中返回值;您是否检查过 if 子句的计算结果为 true?如果该子句的计算结果为 false,会发生什么?
    • 再次感谢亚历山大。如果在 foreach 循环之后 return $this->allErrors 在 outAllValidationErrors() 函数中,则效果很好。
    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 2011-09-14
    • 2012-10-05
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2016-10-16
    相关资源
    最近更新 更多