Los datos proporcionados no eran basura JSON válida al final.

programación


¿Por qué aparece este error?

MC]Lectura de configuraciones de usuario públicas efectivas. Error: No se pudieron decodificar datos en el Blog: dataCorrupted(Swift.DecodingError.Context(codingPath: []debugDescription: “Los datos proporcionados no eran JSON válidos.”, subyacenteError: Opcional (Error Domain=NSCocoaErrorDomain Code=3840 “Basura al final”. UserInfo={NSDebugDescription=Basura al final.})))

tengo este JSON

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

esta es la estructura de mi json en 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

            }

y este es todo mi código

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

}

¿Mi PHP está mal?

¿Alguna pista? :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();
?>

Lo que he probado:

cambiando todo el código de muchas maneras diferentes

Solución 3

Como han dicho Richard y Bryian, debe observar los datos reales que está procesando: use el depurador o regístrelos en un archivo para su examen posterior al procesamiento. Sin eso, sólo estás adivinando y no puedes estar seguro de lo que está pasando.

Pero tiene un problema mayor: nunca concatene cadenas para crear un comando SQL. Lo deja completamente expuesto a ataques de inyección SQL accidentales o deliberados que pueden destruir toda su base de datos. Utilice siempre consultas parametrizadas en su lugar.

Cuando concatenas cadenas, causas problemas porque SQL recibe comandos como:

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

La cita que agregó el usuario termina la cadena en lo que respecta a SQL y surgen problemas. Pero podría ser peor. Si en su lugar escribo esto: “x’;DROP TABLE MyTable;–” Entonces SQL recibe un comando muy diferente:

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

Que SQL ve como tres comandos separados:

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

Un SELECT perfectamente válido

SQL
DROP TABLE MyTable;

Un comando perfectamente válido para “eliminar la tabla”

SQL
--'

Y todo lo demás es un comentario.
Así lo hace: selecciona las filas coincidentes, elimina la tabla de la base de datos e ignora todo lo demás.

¡Así que SIEMPRE utilice consultas parametrizadas! O prepárese para restaurar su base de datos desde la copia de seguridad con frecuencia. Realizas copias de seguridad con regularidad, ¿no?

コメント

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