[ad_1]
لماذا يظهر هذا الخطأ
MC]القراءة من إعدادات المستخدم الفعالة العامة. خطأ: تعذر فك تشفير البيانات في المدونة: dataCorrupted(Swift.DecodingError.Context(codingPath: []، debugDescription: “البيانات المقدمة لم تكن صالحة JSON.”، الخطأ الأساسي: اختياري (Error Domain=NSCocoaErrorDomain Code=3840 “Garbage at end.” UserInfo={NSDebugDescription=Garbage at end.}))))
لدي هذا JSON
{"Response":"false","Info":[{"Estatus":"Sin Conexion"}]}
هذا هو هيكل 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 الخاص بي خاطئ؟
أي تلميحات؟ :س
<?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
كما قال ريتشارد وبريان، أنت بحاجة إلى إلقاء نظرة على البيانات الفعلية التي تقوم بمعالجتها: إما استخدام مصحح الأخطاء، أو تسجيلها في ملف لفحصها بعد المعالجة. وبدون ذلك، أنت مجرد تخمين ولا يمكنك التأكد مما يحدث.
ولكن لديك مشكلة أكبر: لا تقم أبدًا بتسلسل السلاسل لإنشاء أمر 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 أنها ثلاثة أوامر منفصلة:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
اختيار صالح تمامًا
DROP TABLE MyTable;
أمر “حذف الجدول” صالح تمامًا
--'
وكل شيء آخر هو تعليق.
وهكذا يحدث ذلك: تحديد أي صفوف متطابقة، وحذف الجدول من قاعدة البيانات، وتجاهل أي شيء آخر.
لذلك استخدم دائمًا الاستعلامات ذات المعلمات! أو كن مستعدًا لاستعادة قاعدة بياناتك من النسخة الاحتياطية بشكل متكرر. أنت تقوم بأخذ نسخ احتياطية بانتظام، أليس كذلك؟
[ad_2]
コメント