【发布时间】: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