2017-08-29 64 views
0

在我的應用程序中,表單域在客戶端用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

代碼與正確的解決方案

回答

1

編輯如果您使用的功能封裝behav你不應該嘗試使用全局變量來存儲它們的輸出。它們的副作用應該是最小的,並且如果需要的話,它們只應該操縱它們自己的對象的屬性。

您的$allErrors變量被聲明爲無處,特別是不作爲全局變量。所以當你在函數內部填充它時,你會得到一個局部範圍的變量,一旦函數完成,它將被拋棄。

你可能希望從你的函數返回他們

return $allErrors; 

,然後從函數調用得到的值:

$allErrors = $validator->outAllValidationError() 
+0

感謝亞歷山大 – josei

+0

我編輯的代碼進行一些修改,並按照亞歷山大的建議。在類Validator中使用print_r()時,我收到錯誤消息,但在調用outAllValidationErrors()函數時,我無法在json中發送數據。 $ allErrors爲null。 – josei

+0

您返回if子句中的值;你是否檢查過if子句的結果爲「true」?如果該條款評估爲假,應該發生什麼? – Alexander