[ad_1]
¿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:
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:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Que SQL ve como tres comandos separados:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Un SELECT perfectamente válido
DROP TABLE MyTable;
Un comando perfectamente válido para “eliminar la tabla”
--'
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?
[ad_2]
コメント