在我的應用程序中,表單域在客戶端用javascript(EXTJS)進行驗證。PHP和JavaScript(EXTJS) - 驗證服務器端OOP方式中的表單域
雖然我沒有在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爲對象而不是關聯數組做,我已經改變了代碼,使其與已取得的解碼兼容,增加$值addValidationRule()
EDITED
代碼與正確的解決方案
感謝亞歷山大 – josei
我編輯的代碼進行一些修改,並按照亞歷山大的建議。在類Validator中使用print_r()時,我收到錯誤消息,但在調用outAllValidationErrors()函數時,我無法在json中發送數據。 $ allErrors爲null。 – josei
您返回if子句中的值;你是否檢查過if子句的結果爲「true」?如果該條款評估爲假,應該發生什麼? – Alexander