1

Lo siguiente me funciona perfecto en mi computador local, donde tengo instalado Xampp:

Mi archivo de conexión:

connect.php

<?php
$servername = "localhost";
$dbname = "xxxxx";
$username = "xxxxx";
$password = "xxxxx";

try{
$db = new PDO("mysql:host=$servername;dbname=$dbname",$username,$password);
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo "Conección a la base de datos falló: " . $e->getMessage();
}
?>

Mi archivo que trae información pero en este hosting no muestra nada:

get_catImgs.php

<?php
require_once "../connection/connect.php";
$limit = 12;
$trae=$db->prepare("SELECT id, imagen as img FROM items_categorias WHERE in_index IS NOT NULL ORDER BY in_index ASC LIMIT $limit");
$trae->execute();
echo json_encode($trae->fetchAll(PDO::FETCH_ASSOC));
?>

Antes que todo ya comprobé que el archivo de conexión está bien.

El archivo get_catImgs.php arroja todos los resultados esperados en mi computador local, pero en un hosting web que acabo de contratar no me arroja ni siquiera un error.

Algo extraño es que si reemplazamos la última línea con lo siguiente:

echo json_encode($trae->rowCount());

Se muestra el número 12, que es la cantidad de resultados extraídos, lo que comprueba que la conexión está bien. Pero lo encuentro ilógico, es como si tuviesen algún problema con el ->fetchAll(PDO::FETCH_ASSOC) lo cual me parece sin sentido.

Por favor quisiera saber qué pudiese estar mal de mi parte, o qué pudiese estar mal de parte del hosting web.

Bicho
  • 1,653
  • 4
  • 7
  • 15
  • `json_encode` devuelve `false` cuando los datos a codificar no estan en `utf8`. Proba agregar esta configuración `PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"` al crear la conexión con `PDO` – Marcos Aug 14 '20 at 14:23
  • @Marcos Lo añadí de esta forma después del setAttribute que ya tengo: $db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'"); Pero no me ha dado resultados. Por favor indícame donde y/o cómo ubicarlo si es que está mal. – Roberto Sepúlveda Bravo Aug 14 '20 at 14:33
  • Si dices que trae los datos, pero el JSON no se produce correctamente, entonces es evidente que **tienes un problema con la codificación**. Pero hay varios niveles en los que tienes que hacer tu codificación coherente: en el cliente (HTML), en el servidor (PHP), en la conexión (PDO), en la BD (tabla) ... y también en el origen de los datos si fuera el caso (un ejemplo típico es cuando se insertan datos directamente desde archivos mal codificados). Revisa [esta respuesta](https://es.stackoverflow.com/a/59510/29967) donde se aborda el problema de una forma global. – A. Cedano Aug 14 '20 at 14:59
  • @RobertoSepúlvedaBravo, la forma más fácil de validar si `json_encode` devuelve `false` es hacer `var_export(json_encode($trae->fetchAll(PDO::FETCH_ASSOC)))`. Te recomiendo revisar [esta respuesta](https://es.stackoverflow.com/a/59510/16597) – Marcos Aug 14 '20 at 15:00
  • @Marcos y @A. Cedano efectivamente el var_export me está mostrando un `false` en el navegador, pero qué mas puedo hacer? Estoy leyendo el material que me dejaron. – Roberto Sepúlveda Bravo Aug 14 '20 at 15:24
  • @RobertoSepúlvedaBravo, otra cosa fácil que podes intentar es establecer la codificación que utiliza `PHP`, por ejemplo, así `ini_set("default_charset", "UTF-8");` – Marcos Aug 14 '20 at 15:38
  • @Marcos acabo de probar poniendo esa línea en mi archivo connect.php, sin resultados. Una diferencia que encontré entre la base de datos del hosting y la de mi equipo, es que la codificación del hosting estaba en latin y la de mi equipo en utf8mb4_general_ci. Ante esto lo cambié a esa codificación pero aun no tengo resultados :( – Roberto Sepúlveda Bravo Aug 14 '20 at 15:44
  • @RobertoSepúlvedaBravo, ¿validates en el IDE la codificación en la que estas guardando el archivo? ¿Probaste ejecutar la configuración de codificación de MySQL como consulta? es decir, `$db->query("SET NAMES 'utf8'")` – Marcos Aug 14 '20 at 15:46
  • @Marcos gracias, hace muy poco me funcionó eso. Anteriormente te pregunté cómo ubicarlo correctamente y lo encontré en la respuesta de Jim W. Aquí: https://stackoverflow.com/questions/279170/utf-8-all-the-way-through – Roberto Sepúlveda Bravo Aug 14 '20 at 16:06
  • @Marcos sé que esto es algo a parte, pero me acabo de dar cuenta que todos los nombres de imágenes que subí al web hosting, quedaron con un signo de pregunta dentro de un rombo. Esto pasó en cada parte donde había una Ñ o una tilde. Cómo puedo solucionar eso? – Roberto Sepúlveda Bravo Aug 14 '20 at 16:10

1 Answers1

0

Finalmente encontré la solución aquí, el objeto PDO debe iniciarse así:

$db = new PDO("mysql:host=$servername;dbname=$dbname",$username,$password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

Espero a otros le ayude.

  • Estaba explicado en el punto 3 de [la respuesta](https://es.stackoverflow.com/a/59510/29967) que te referí en mi comentario. – A. Cedano Aug 14 '20 at 19:52