PHP和javascript(EXTJS)-以服务器端OOP方式验证表单字段
在我的应用程序中,表单字段在客户端通过javascript(EXTJS)进行验证 虽然我没有PHP OOP方面的经验,但我也想用PHP 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
<?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,则该函数运行良好。