サーバ側(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
));
}
}
?>
おかげAknosisためのソリューションです。私はあなたの提案に従った。なんらかの理由で、$ valida_json-> validateJson()の後のクエリでは、私が$ errorsJson = $ valida_json-> outJsonError()を挿入した場合;それに続いてecho $ errorsJson; exit;、エラーメッセージではなく配列文字列を取得するだけです。addJsonErrorMsg関数に何か問題がありますか?私のクエリコードはエコーで編集されました。 – josei
addJsonErrorMsgはうまく見えますが、配列を返します。 echoを介して配列を出力すると、 "Notice:Array to string conversion"という通知が出されます。 'echo'の代わりに' var_dump($ errorsJson) 'を使ってみてください。 – Aknosis
これを解決するための提案はありますか?エラーメッセージをクライアントに送信する必要があります。 jsonエラーのケースを見ると、一度に複数のチェックを行う可能性は小さいようです。いずれにしても、コードをprivate $ errors = ''に変更して配列を削除した場合、 $ this-> errors = $ error_messageです。私はエラーメッセージを正しく取得します(しかし、この方法では、単一のエラーメッセージを得ることができます)。 – josei