2017-09-05 137 views
0

在服務器端(PHP),我使用json_encode對使用ajax請求(javascript - extjs)發送的數據進行編碼。json_encode錯誤處理PHP OOP

我想處理可能的json_encode錯誤,如果可能的話使用PHP OOP。

到目前爲止,我有下面的代碼,但我有一些困難(我在PHP的面向對象編程經驗的):

類ValidateJson

<?php 

class ValidateJson { 

    private $errors = array(); 

    // public static function validaJson(){ 

    public function validaJson(){ 

     //Get the last JSON error. 
     $jsonError = json_last_error(); 

     //If this happen. 
     //if(is_null($decoded) && $jsonError == JSON_ERROR_NONE){ 
     // $this->addJsonErrorMsg('Could not decode JSON!'); 
     //} 


     switch ($jsonError) { 
      case JSON_ERROR_DEPTH: 
        $this->addJsonErrorMsg('Maximum stack depth exceeded'); 
       break; 
      case JSON_ERROR_STATE_MISMATCH: 
       $this->addJsonErrorMsg('Underflow or the modes mismatch'); 
       break; 
      case JSON_ERROR_CTRL_CHAR: 
       $this->addJsonErrorMsg('Unexpected control character found'); 
       break; 
      case JSON_ERROR_SYNTAX: 
       $this->addJsonErrorMsg('Syntax error, malformed JSON'); 
       break; 
      case JSON_ERROR_UTF8: 
       $this->addJsonErrorMsg('Malformed UTF-8 characters, possibly incorrectly encoded'); 
       break; 
      default: 
       $this->addJsonErrorMsg(' Unknown error'); 
       break; 
     } 
    } 

    private function addJsonErrorMsg($error_message){ 
     $this->errors[] = $error_message; 
    } 

    public function outJsonError(){ 
     return $this->errors; 
    } 

    // ????? 
    //  if($jsonError != 0){ 
    //   throw "JSON Parse Error: " + untyped __call__("json_last_error_msg"); 
    // 
    // } 
} 

?> 

查詢和輸出:

<?php 

require('conect.php'); 
$action = $_REQUEST['action']; 

switch($action){ 

    case "create":{ 

    $records = $_POST['records']; 
    $data = json_decode(stripslashes($records)); 

    require_once('validate_json.php'); 
    $valida_json = new ValidateJson(); 
    $valida_json->validaJson(); 

    // $errosJson = $valida_json->outJsonError(); 
    // echo $errors; exit; //return string 'Array' 

    if(json_last_error() == JSON_ERROR_NONE){ 

     $cars = $data->{'cars'}; 

     if ($_SERVER["REQUEST_METHOD"] == "POST") { 

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

      echo json_encode(array(
       "success" => $sucess, 
       'errors'=> $erro 
      )); 

      $statement->close(); 
      $conexao->close(); 

      break; 
     } 

    }else{ 

     $errorsJson = $valida_json->outJsonError(); 
     $success = false; 

     echo json_encode(array(
       "success" => $sucess, 
       'errorsjson'=> $errorsJson 
     )); 
    } 
} 
?> 

回答

1

嘗試從中刪除。

通過將validaJson定義爲靜態,您沒有工作實例validaJson($ this)可以使用。

同樣在validaJson裏面,你有is_null($decoded)這將不起作用,因爲變量$decoded不在任何地方。

參見:http://php.net/manual/en/language.oop5.static.php

+0

感謝Aknosis解決方案。我遵循你的建議。出於某種原因,在查詢中,$ valida_json-> validateJson();如果我插入$ errorsJson = $ valida_json-> outJsonError();其次是echo $ errorsJson;退出;,只是獲取數組字符串,而不是錯誤消息,addJsonErrorMsg函數中是否有錯誤?我的查詢代碼是用回描描述編輯的。 – josei

+0

addJsonErrorMsg看起來不錯,但它返回一個數組。通過echo輸出數組發出通知「注意:數組到字符串轉換」。嘗試使用'var_dump($ errorsJson)'而不是'echo'。 – Aknosis

+0

你有什麼建議可以解決這個問題嗎?我需要將錯誤消息發送給客戶端。看看json錯誤的情況,一次檢查多個錯誤的可能性似乎很小。在任何情況下,如果我通過將代碼更改爲private $ errors =''來刪除數組,和$ this-> errors = $ error_message;我正確地得到錯誤信息(但是以這種方式,它只能得到一個錯誤信息)。 – josei

2

我得到這個問題,試圖獲得一個數組 的json_encode和這裏的時候,「畸形的UTF-8字符,可能是編碼不正確」,是因爲它

function latin1_to_utf8($dat) 
    { 
    if (is_string($dat)) 
     return utf8_encode($dat); 
    if (!is_array($dat)) 
     return $dat; 
    $ret = array(); 
    foreach ($dat as $i => $d) 
     $ret[$i] = array_utf8_encode($d); 
    return $ret; 
    } 
    function array_utf8_encode($dat) 
    { 
     if (is_string($dat)) 
      return utf8_encode($dat); 
     if (!is_array($dat)) 
      return $dat; 
     $ret = array(); 
     foreach ($dat as $i => $d) 
      $ret[$i] = array_utf8_encode($d); 
     return $ret; 
    } 
+0

謝謝bouguima – josei