البيانات المقدمة لم تكن صالحة JSON المهملة في النهاية

برمجة


لماذا يظهر هذا الخطأ

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 يتلقى أوامر مثل:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'

يؤدي الاقتباس الذي أضافه المستخدم إلى إنهاء السلسلة فيما يتعلق بـ SQL وستواجه مشاكل. ولكن يمكن أن يكون أسوأ. إذا أتيت وكتبت هذا بدلاً من ذلك: “x’;DROP TABLE MyTable;–” فسيتلقى SQL أمرًا مختلفًا تمامًا:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'

التي ترى SQL أنها ثلاثة أوامر منفصلة:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';

اختيار صالح تمامًا

SQL
DROP TABLE MyTable;

أمر “حذف الجدول” صالح تمامًا

SQL
--'

وكل شيء آخر هو تعليق.
وهكذا يحدث ذلك: تحديد أي صفوف متطابقة، وحذف الجدول من قاعدة البيانات، وتجاهل أي شيء آخر.

لذلك استخدم دائمًا الاستعلامات ذات المعلمات! أو كن مستعدًا لاستعادة قاعدة بياناتك من النسخة الاحتياطية بشكل متكرر. أنت تقوم بأخذ نسخ احتياطية بانتظام، أليس كذلك؟

コメント

タイトルとURLをコピーしました