[ad_1]
なぜこのエラーが出るのでしょうか
MC]公開実効ユーザー設定からの読み取り。 エラー: データをブログにデコードできませんでした: dataCorrupted(Swift.DecodingError.Context(codingPath: []、debugDescription: “指定されたデータは有効な JSON ではありませんでした。”、ownedError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 “最後にガベージがあります。” UserInfo={NSDebugDescription=最後にガベージがあります。})))
私はこのJSONを持っています
{"Response":"false","Info":[{"Estatus":"Sin Conexion"}]}
これはSwiftでの私のJSONの構造です
struct Blog: Decodable { let Response: String let articles: [Article] enum CodingKeys : String, CodingKey { case Response case articles = "Info" } } struct Article: Decodable { let Estatus: String }
これはすべて私のコードです
let id1 = UserDefaults.standard.string(forKey: "id1conductor") let id1pa = UserDefaults.standard.string(forKey: "idUser") if adondevaxd.text == "" || adondevaxd.text == " " || adondevaxd.text == "123" || adondevaxd.text == "abc" || adondevaxd.text == "." { self.displayAlert(title: "Usuario", message: "Debe elegir un destino") } let myURL = URL(string: "hehe") var request = URLRequest(url: myURL!) request.httpMethod = "POST" let posString = "ID_Conductor=\(id1!)&Destino=\(adondevaxd.text!)&ID_Pasajero=\(id1pa!)" request.httpBody = posString.data(using: .utf8) let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("error=\(error)") return } guard let data = data else { print("Something wrong") return } **// THIS SHOULD BE a valid JSON but is not i have the same in another PHP and it works** struct Blog: Decodable { let Response: String let articles: [Article] enum CodingKeys : String, CodingKey { case Response case articles = "Info" } } struct Article: Decodable { let Estatus: String } do { let blog = try JSONDecoder().decode(Blog.self, from: data) DispatchQueue.main.async { if blog.Response == "true" { //para ver como actua el json // print(blog) for article in blog.articles { let tipoResponse = article.Estatus if tipoResponse == "Solicitado" { self.displayAlert(title: "Usuario", message: "El conductor será notificado, espera la respuesta") self.buttonOulet.isHidden = true self.adondevaxd.isHidden = true self.adondevaxd.text = "" self.adondequiereirxd.isHidden = true self.enviarDestino4.isHidden = true self.enviarDestino3.isHidden = true self.enviarDestino2.isHidden = true self.enviarDestino1.isHidden = true self.credencial1.isHidden = true self.Credencial2.isHidden = true self.Credencial3.isHidden = true self.Credencial4.isHidden = true } else if tipoResponse == "Ocupado" { self.displayAlert(title: "Usuario", message: "El conductor ya se encuentra ocupado, selecciona otro") self.map.isHidden = false self.buttonOulet.isHidden = false self.adondevaxd.isHidden = true self.adondevaxd.text = "" self.adondequiereirxd.isHidden = true self.enviarDestino4.isHidden = true self.enviarDestino3.isHidden = true self.enviarDestino2.isHidden = true self.enviarDestino1.isHidden = true self.credencial1.isHidden = true self.Credencial2.isHidden = true self.Credencial3.isHidden = true self.Credencial4.isHidden = true } else if tipoResponse == "Solicitado" { self.displayAlert(title: "Usuario", message: "Se envio tu solicitud al conductor, porfavor ten paciencia") self.adondequiereirxd.isHidden = true self.adondevaxd.isHidden = true self.adondequiereirxd.isHidden = true } break } } else if blog.Response == "false" { self.displayAlert(title: "Usuario", message: "No hay conexion") self.map.isHidden = false self.buttonOulet.isHidden = false self.adondevaxd.isHidden = true self.adondequiereirxd.isHidden = true self.adondevaxd.text = "" self.enviarDestino4.isHidden = true self.enviarDestino3.isHidden = true self.enviarDestino2.isHidden = true self.enviarDestino1.isHidden = true self.credencial1.isHidden = true self.Credencial2.isHidden = true self.Credencial3.isHidden = true self.Credencial4.isHidden = true } } } catch { print("Error: Couldn't decode data into Blog:", error) return } } task.resume() }
私のPHPが間違っているのでしょうか?
何かヒントはありますか? :S
<?php require_once '../data/d.php'; error_reporting(0); if(isset($_POST['ID_Pasajero'])){ $Comparacion = "SELECT * FROM Solicitudes where ID_Conductor = '".$_POST['ID_Conductor']."' and Estado != '2'"; $R = $conexion->query($Comparacion); $Count = mysqli_num_rows($R); if ($Count > 0) { $Comparacion = "SELECT * FROM Solicitudes where ID_Pasajero = '".$_POST['ID_Pasajero']."' and Estado != '2'"; $R = $conexion->query($Comparacion); $Count = mysqli_num_rows($R); if ($Count > 0) { $Resultado = '{"Response":"true","Info":[{"Estatus":"Pendiente"}]}'; }else{ $Resultado = '{"Response":"true","Info":[{"Estatus":"Ocupado"}]}'; } }else{ $Comparacion = "SELECT * FROM Solicitudes where ID_Pasajero = '".$_POST['ID_Pasajero']."' and Estado != '2'"; $R = $conexion->query($Comparacion); $Count = mysqli_num_rows($R); if ($Count > 0) { $Resultado = '{"Response":"true","Info":[{"Estatus":"Pendiente"}]}'; }else{ $sql = "INSERT INTO Solicitudes(ID_Pasajero, ID_Conductor, Destino, Estado, Estado_Calificacion) VALUES ('$_POST[ID_Pasajero]', '$_POST[ID_Conductor]', '$_POST[Destino]', '0', '0')"; $Resultado = '{"Response":"true","Info":[{"Estatus":"Solicitado"}]}'; } } } if ($conexion->query($Comparacion) === TRUE) { if ($conexion->query($sql) === TRUE) { echo $Resultado; } else { echo $Resultado; } } else { if ($conexion->query($sql) === TRUE) { echo $Resultado; } echo '{"Response":"false","Info":[{"Estatus":"Sin Conexion"}]}'; } $conexion->close(); ?>
私が試したこと:
すべてのコードをさまざまな方法に変更する
解決策 3
Richard と Bryian が言ったように、処理している実際のデータを確認する必要があります。デバッガを使用するか、処理後の検査のためにデータをファイルに記録します。 それがなければ、ただ推測するだけで、何が起こっているのかを確信することはできません。
しかし、さらに大きな問題があります。文字列を連結して SQL コマンドを作成しないでください。 偶発的または意図的な SQL インジェクション攻撃にさらされ、データベース全体が破壊される可能性があります。 代わりに常にパラメータ化されたクエリを使用してください。
文字列を連結すると、SQL が次のようなコマンドを受け取るため、問題が発生します。
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
SQL に関する限り、ユーザーが追加した引用符によって文字列が終了するため、問題が発生します。 しかし、さらに悪化する可能性もあります。 代わりに「x’;DROP TABLE MyTable;–」と入力すると、SQL はまったく異なるコマンドを受け取ります。
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
SQL では、次の 3 つの個別のコマンドとして認識されます。
SELECT * FROM MyTable WHERE StreetAddress = 'x';
完全に有効な SELECT
DROP TABLE MyTable;
完全に有効な「テーブルの削除」コマンド
--'
それ以外はすべてコメントです。
つまり、一致する行を選択し、DB からテーブルを削除し、それ以外は無視します。
したがって、常にパラメータ化されたクエリを使用してください。 または、DB をバックアップから頻繁に復元できるように準備してください。 バックアップは定期的に取っていますよね?
[ad_2]
コメント