Les données fournies n’étaient pas des déchets JSON valides à la fin

la programmation


pourquoi cette erreur apparaît-elle

MC]Lecture à partir des paramètres utilisateur effectifs publics. Erreur : Impossible de décoder les données dans le blog : dataCorrupted(Swift.DecodingError.Context(codingPath : []debugDescription : « Les données fournies n’étaient pas un JSON valide. »

j’ai ce JSON

{"Response":"false","Info":[{"Estatus":"Sin Conexion"}]}

voici la structure de mon json dans Swift

struct Blog: Decodable {
                let Response: String
                let articles: [Article]

                enum CodingKeys : String, CodingKey {
                    case Response

                    case articles = "Info"
                }
            }

            struct Article: Decodable {
                let Estatus: String

            }

et c’est tout mon code

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()

}

mon PHP est-il faux ?

des indices ? :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();
?>

Ce que j’ai essayé :

changer tout le code de différentes manières

Solution 3

Comme Richard et Bryian l’ont dit, vous devez examiner les données réelles que vous traitez : soit utilisez le débogueur, soit enregistrez-les dans un fichier pour un examen post-traitement. Sans cela, vous ne faites que deviner et ne pouvez pas être sûr de ce qui se passe.

Mais vous avez un problème plus important : ne concaténez jamais de chaînes pour créer une commande SQL. Cela vous laisse grand ouvert aux attaques accidentelles ou délibérées par injection SQL qui peuvent détruire l’intégralité de votre base de données. Utilisez toujours des requêtes paramétrées à la place.

Lorsque vous concaténez des chaînes, vous posez des problèmes car SQL reçoit des commandes telles que :

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

La citation ajoutée par l’utilisateur termine la chaîne en ce qui concerne SQL et vous rencontrez des problèmes. Mais cela pourrait être pire. Si j’arrive et tape ceci à la place : “x’;DROP TABLE MyTable;–” Alors SQL reçoit une commande très différente :

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

Ce que SQL considère comme trois commandes distinctes :

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

Un SELECT parfaitement valide

SQL
DROP TABLE MyTable;

Une commande “supprimer la table” parfaitement valide

SQL
--'

Et tout le reste n’est qu’un commentaire.
C’est ce qui se passe : sélectionne toutes les lignes correspondantes, supprime la table de la base de données et ignore tout le reste.

Utilisez donc TOUJOURS des requêtes paramétrées ! Ou soyez prêt à restaurer fréquemment votre base de données à partir d’une sauvegarde. Vous effectuez régulièrement des sauvegardes, n’est-ce pas ?

コメント

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