0

Tengo un pequeño problema que no he podido resolver y no tengo mucha idea de cómo hacerlo.

Cuando hago una consulta con PHP (Código abajo) para obtener información de la base de datos. Puedo sacar la información sin problema, sin embargo, si tengo datos con la letra Ñ o si tengo tildes en las palabras no retorna nada.

La información la observo consultando al localhost: http://localhost/applaguicidas/obtenerCultivos.php ya que estoy utilizando XAMP, eso me despliega una página web.

Nota: El JSON obtenido lo utilizo en Java para mostrarlo, sin embargo, me aparece también vacío.

Código de la consulta:

<?php
require "DataBase.php";
$db = new DataBase();

if ($db->dbConnect()) {
    
    $data;
    $sql = "select * from cultivo";
    $result = mysqli_query($db->connect, $sql);
    
    while($res = mysqli_fetch_assoc($result)){
        $data[]=$res;
    }
    print json_encode($data);


} else echo "Error: Database connection";

?>

Por ejemplo

En la base de datos tengo la siguiente información:

idCultivo Nombre
3   Arroz
2   Banano
7   papa
6   papaya
10  Zanahoria

Cuando hago la consulta me retorna el siguiente JSON

[{"idCultivo":"3","nombre":"Arroz"},{"idCultivo":"2","nombre":"Banano"},{"idCultivo":"7","nombre":"papa"},{"idCultivo":"6","nombre":"papaya"},{"idCultivo":"10","nombre":"Zanahoria"}]

Hasta ahí todo bien, pero si agrego un nuevo valor, por ejemplo:

idCultivo Nombre
11  Piña

En ese caso, ya no me devuelve ningún JSON, ni siquiera con la información que no tiene esos caracteres.

Alguna idea de qué puede estar pasando y de cómo solucionarlo? Ya que soy bastante nuevo utilizando PHP. Agradezco cualquier consejo para solucionar esto.

Rodrigo Ramírez
  • 5,822
  • 4
  • 11
  • 32
  • Lo más probable es que la codificación de tu base de datos no sea UTF8, que es el juego de caracteres requerido por [json_encode()](https://www.php.net/manual/es/function.json-encode.php). Si aún no tienes muchos datos en las tablas, seguramente te servirá la respuesta de @HammerffallBK, de lo contrario, revisa [esta otra](https://es.stackoverflow.com/a/134148/54039) – Triby Feb 26 '21 at 17:40
  • Podrias utiliza utf8_encode(), a mi me funciona mostrando caracteres especiales. @Jorge Viquez. – Nor Feb 26 '21 at 23:12

4 Answers4

3

Puedes verificar que tengas la codificación en utf8.

Te conectas a tu servidor de mysql, y ejecutas lo siguiente.

SELECT @@character_set_database, @@collation_database;

+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8                     | utf8_general_ci      |
+--------------------------+----------------------+

De esta forma aseguras que la base de datos puede aceptar tildes y otros caracteres.

Si la respuesta de tu consulta no es esa, puedes cambiar la codificiación con lo siguiente, tomando en cuenta que mi base de datos se llama homestead

mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| latin1                   | latin1_swedish_ci    |
+--------------------------+----------------------+
1 row in set (0.00 sec)

mysql> ALTER DATABASE homestead CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.01 sec)

mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8                     | utf8_general_ci      |
+--------------------------+----------------------+
1 row in set (0.00 sec)
Hammerffall BK
  • 1,629
  • 1
  • 6
  • 13
  • Hola @Hammerffall BK Estaba revisando la base de datos y efectivamente tenía la codificación en Latin-1, hice el cambio a UTF-8 pero sigo teniendo el mismo error de que a la hora de hacer el print del JSON_encode en PHP no me despliega ninguna información si hay algún dato con tilde o ñ. Con esto, me atrevería a decir que la codificación de la base de datos no es la que está afectando el obtener e imprimir la información del PHP. Esto lo digo por dos motivos: 1) El Latin-1 también me aceptaba esos caracteres. 2) Hice el cambio y sigo teniendo el error. Alguna idea? Gracias! – Jorge Víquez Feb 26 '21 at 21:04
0

¿Has revisado que el formato de codificación de la base de datos sea utf-8?

cooper
  • 2,198
  • 1
  • 8
  • 16
  • 3
    Por favor no uses la zona de respuestas para exponer dudas o comentarios, lee [answer] – BetaM Feb 26 '21 at 03:59
  • @BetaM se puede migrar esta respuesta como comentario? Ya que en si es util – Juan Rivera Feb 26 '21 at 12:36
  • Hola! @ Leonel Gabriel Wetzel. Revisé la base de datos y la codificación estaba en Latin-1. Lo cambié a UTF-8 pero sigo teniendo el mismo error de que no imprime nada a la hora de sacar la información con PHP. Pienso que el error no está en la codificación de la base de datos porque con Latin-1 sí me desplegaba la información correctamente al hacer las consultas en PhpMyAdmin. Alguna otra idea de qué esté pasando? – Jorge Víquez Feb 26 '21 at 21:11
  • @JorgeVíquez Me tome el tiempo de recrear tu area de trabajo y logré encotrar que a pesar de todo a mi si me devolvia un valor, texto deformado pero valor al fin, asi que lo solucione agregandole a la parte donde pones print json_encode($data, JSON_UNESCAPED_UNICODE); De esa manera deberia funcionarte correctamente – Leonel Gabriel Wetzel Feb 26 '21 at 23:31
0

*** Solución encontrada ***

Investigando logré encontrar la solución, y es básicamente agregar la codificación que uno necesita (en este caso utf-8) a la variable donde se crea la conexión.

A continuación la función que utilizo para hacer la conexión:

<?php
...

function dbConnect()
    {
        $this->connect = mysqli_connect($this->servername, $this->username, $this->password, $this->databasename);
        $this->connect->set_charset("utf8");
        return $this->connect;
    }

...
?>

La clave de esto está justo en esta línea de código:

$this->connect->set_charset("utf8");

En donde connect es la variable donde realizo la conexión y le defino la codificación mediante

set_charset("utf8");

Y con esto, ya puedo usar tildes y ñ sin ningún problema.

Espero esta solución les ayude!

0

Puedes usar mysqli para que acepte acentos y ñ, algo asi.

$server = 'localhost';

$user = 'root';

$password = '';

$database = 'database';

$db = mysqli_connect($server, $user, $password, $database);

mysqli_query($db, "SET NAMES 'utf8'");