2

No consigo recibir el JSON desde el php porque los datos tienen acento dejo el código: PHP:

 <?php  
$pdo=new PDO("mysql:dbname=salas;host=127.0.0.1","root","");
$statement=$pdo->prepare("SELECT * FROM departamentos");
$statement->execute();
if (!$statement){
    echo 'Error al ejecutar la consulta';
}else{
    $results = $statement->fetchAll(PDO::FETCH_ASSOC);


}
echo  json_encode($results, JSON_UNESCAPED_UNICODE);
?>

Código Javascript

var departamentos = [];
tablerosR();
function tablerosR() {
    tableros = [];
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
            var tab = JSON.parse(this.responseText);
            for (let i = 0; i < tab.length; i++) {
                departamentos.push(tab[i]);
            }
            btn_trello();
        }
    };
    xmlhttp.open("GET", "php/departamentos.php?_=" + new Date().getTime(), true);// new Date().getTime() lo usamos porque en explorer estaba cacheando la consulta y 
                                                                                //así modificamos la url consiguiendo que sea otra consulta
    xmlhttp.send();
}
  • 1
    Si un `print_r($results);` te muestra caracteres extraños, entonces vas a necesitar indicar una codificación adecuada a la conexión, haciendo: `$pdo=new PDO("mysql:dbname=salas;host=127.0.0.1;charset=UTF8","root","");` – A. Cedano Jun 01 '18 at 22:53
  • @A.Cedano Muchísimas gracias, no pensé que se podía hacer eso. Toda la vida bro! (K)(L) =) – Yasiel Hernández Jun 04 '18 at 13:03
  • De nada, estamos para ayudar en este espacio colaborativo. Por favor dime si con eso bastó para resolver el problema. Generalmente, cuando tienes la codificación controlada en los diferentes niveles ([ver esta respuesta](https://es.stackoverflow.com/a/59510/29967)), luego, en la salida no tienes que preocuparte por nada, de forma que un simple: `json_encode($results);` debería bastar cuando no hay problemas o conflictos de codificación. – A. Cedano Jun 04 '18 at 13:14
  • Fue suficiente si, gracias a eso ya la llamada no me daba error y los datos en el array aparecían con caracteres extraños sin problema, también lo usé en un insert y fue maravillosamente bien, antes me introducía cosas como Informática y ahora perfectamente Informática – Yasiel Hernández Jun 04 '18 at 13:25
  • 1
    Posible duplicado de [¿Por que el Carácter inspector (�) aparece en algunos datos obtenidos de la Base de Datos?](https://es.stackoverflow.com/questions/59489/por-que-el-car%c3%a1cter-inspector-aparece-en-algunos-datos-obtenidos-de-la-base) –  Jun 04 '18 at 14:05

1 Answers1

4

El problema de los carácteres extraños debe ser resuelto atacando el problema de raíz, por niveles.

En este caso, convendría que indiques un juego de caracteres adecuado cuando creas el objeto conexión haciendo lo siguiente:

$pdo=new PDO("mysql:dbname=salas;host=127.0.0.1;charset=UTF8","root","");

Siempre que vayas a usar objetos de conexión, conviene indicarle de forma explícita que quieres tus datos en UTF8. Así te evitarás problemas de caracteres extraños y objetos JSON inválidos debido a ese mismo problema.

De ese modo, podrás obtener tu JSON de forma correcta haciendo simplemente:

echo  json_encode($results);

Así, resolviste el problema de raíz, sin tener que recurrir a manipulaciones de los datos a medio camino.

Para más detalles sobre esto puedes consultar esta pregunta:

A. Cedano
  • 86,578
  • 19
  • 122
  • 221