2017-09-05 14 views
0

サーバ側(PHP)では、json_encodeを使用してajaxリクエスト(javascript - extjs)で送信されたデータをエンコードします。json_encodeエラー処理PHP OOP

可能であれば、PHP OOPで可能なjson_encodeエラーを処理したいと思います。

これまでのところ、私は次のコードを持っていますが、私はいくつかの困難(私はPHPのOOPでの経験不足だ)抱えている:

クラス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

staticを削除してみてくださいpublic static function validaJson(){

validaJsonをstaticとして定義すると、動作するインスタンスがvalidaJson($ this)になりません。

validaJsonの中にも変数$decodedがその関数のどこにも存在しないため、is_null($decoded)が機能しません。

は参照してください:私はここで、配列 のjson_encodeを取得しようとするとき、「不正なUTF-8文字は、おそらく間違ってエンコードされた」この問題を取得http://php.net/manual/en/language.oop5.static.php

+0

おかげAknosisためのソリューションです。私はあなたの提案に従った。なんらかの理由で、$ valida_json-> validateJson()の後のクエリでは、私が$ errorsJson = $ valida_json-> outJsonError()を挿入した場合;それに続いてecho $ errorsJson; exit;、エラーメッセージではなく配列文字列を取得するだけです。addJsonErrorMsg関数に何か問題がありますか?私のクエリコードはエコーで編集されました。 – josei

+0

addJsonErrorMsgはうまく見えますが、配列を返します。 echoを介して配列を出力すると、 "Notice:Array to string conversion"という通知が出されます。 'echo'の代わりに' var_dump($ errorsJson) 'を使ってみてください。 – Aknosis

+0

これを解決するための提案はありますか?エラーメッセージをクライアントに送信する必要があります。 jsonエラーのケースを見ると、一度に複数のチェックを行う可能性は小さいようです。いずれにしても、コードをprivate $ errors = ''に変更して配列を削除した場合、 $ this-> errors = $ error_messageです。私はエラーメッセージを正しく取得します(しかし、この方法では、単一のエラーメッセージを得ることができます)。 – josei

2

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