1

Estoy haciendo una consulta a la base de datos pero no me devuelve absolutamente nada, ni error, ni null

mi código es este

<?php
$mysqli = new mysqli('localhost','root','','Prueba');
if ($result = $mysqli->query("SELECT * FROM accion_table")) {

        while($row = $result->fetch_array(MYSQLI_ASSOC)) {
                $myArray[] = $row;
        }
        echo json_encode($myArray);

}else {
                    echo "Error: " . mysqli_error($mysqli);
                }

$result->close();
$mysqli->close();

?>

mi tabla contiene 2 campos, e inserte 6 filas pero no devuelve ninguno, probé con una tabla vacía y devuelve null y utilizando el mismo codigo con otra tabla con datos si me devuelve los valores

¿Porque puedo ver los datos de la user_table pero no puedo ver los de accion_table?

comparacion

Ange1D
  • 47
  • 5
  • Varias cosas pueden estar ocurriendo: 1. Que `accion_table` no tenga datos. Puedes hacer una prueba poniendo esto inmediatamente después del `if` y fuera del `while` en tu código: **`echo "Filas encontradas: ". $result->num_rows;`** ahí sabrás si trae filas realmente. 2. Si trae filas, puede que el json sea inválido por problemas de codificación de los datos, entonces haz un test de los datos en sí con: `var_dump($myArray);` **fuera del bloque `while`**. – A. Cedano Feb 17 '20 at 00:32
  • @A.Cedano Gracias, ahora muestra Filas encontradas: 6 array(6) { [0]=> array(2) { ["idAccion"]=> string(1) "0" ["nombre"]=> string(14) "Ninguna" } [1]=> array(2) { ["idAccion"]=> string(1) "1" ["nombre"]=> string(8) "Acci�n 1" } Supongo que los acentos son la causa de que no mostrara ningún dato, debo quitar los acentos en la base de datos? – Ange1D Feb 17 '20 at 00:43
  • Efectivamente los acentos están siendo cambiados por el carácter inspector y eso está produciendo un JSON inválido. Debes aplicar soluciones de codifación adecuadas. Para ello debes revisar si es que los datos están así en la BD o si es el entorno el que está mal (conexion, PHP, HTML). Puedes consultar [esta respuesta](https://es.stackoverflow.com/a/59510/29967) donde se aborda este problema ampliamente, según el nivel en que esté el problema deberas establecer la codificación `utf8` que es la más idónea. Si tienes alguna duda te ayudaremos por aquí. – A. Cedano Feb 17 '20 at 01:00
  • Te recomiendo tres cosas, primera observa que en tu tabla no tengas datos con caracteres que al parsear JSON den algún error, a veces suele pasar, prueba en cambiar o borrar todos los caracteres como ñ o tildes. La otra es que hagas un print_r($row) dentro del while para que te muestre en crudo lo que te devuelve la consulta. Y lo último, podes ver los registros los del servidor donde ejecutaste la llamada para ver si te muestra un error interno – Sebastian Feb 17 '20 at 01:19
  • @Sebastian no puedes recomendar que borre los acentos y las ñ en la tabla (base de datos), es algo totalmente absurdo. Si en la tabla tienen que ir datos en español lo que hay que hacer es una codificación adecuada en todos los niveles, no modificar los datos o forzarlos a un formato inglés sin necesidad. – A. Cedano Feb 17 '20 at 01:25
  • @A.Cedano Gracias, lo solucione con ayuda de la [respuesta](https://es.stackoverflow.com/questions/59489/por-que-el-car%c3%a1cter-inspector-aparece-en-algunos-datos-obtenidos-de-la-base/59510#59510) , el conjunto de caracteres estaba en latin1, utilice `!$mysqli->set_charset("utf8")` y dentro del while `$myArray[] = array_map('htmlentities', $row);` – Ange1D Feb 17 '20 at 01:40
  • @A.Cedano Yo solo le di la recomendación para que viera si era ese el problema, he echo millones de veces las codificaciones del cortejamiento de las tablas y me han modificado los caracteres de forma incorrecta. Es obvio que forzar a ingles nadie lo menciono, solo era para que probara si era ese el problema, dudo que tenga millones de registros que modificar, sino este problema le salta mucho antes. – Sebastian Feb 17 '20 at 02:27
  • Se debe haber mal interpretado mi comentario, cuando dije que no tenga esos datos, era solamente para pruebas. – Sebastian Feb 17 '20 at 02:29
  • @Sebastian es que se entendía como que le pedías que quitara los acentos en los datos. Perdona si te entendí mal, quizá el comentario no era claro en ese sentido. – A. Cedano Feb 17 '20 at 17:44
  • Ange1D si configuras bien el entorno no es necesario hacer esto en la lectura de datos `$myArray[] = array_map('htmlentities', $row);`. Un acento o una `ñ` son caracteres válidos para JSON, el problema es cuando esos valores vienen convertidos en caracteres extraños y eso se resuelve configurando bien la codificación en todos los niveles. Revisa la respuesta dada aquí mismo. – A. Cedano Feb 17 '20 at 17:46

1 Answers1

0

Varias cosas pueden estar ocurriendo:

  1. Que accion_table no tenga datos. Para cubrir esa posibilidad deberías verificar la cantidad de filas encontradas con num_rows

  2. Si trae filas, puede que el json sea inválido por problemas de codificación de los datos, entonces haz un test de los datos en sí con: var_dump($myArray); fuera del bloque while. Así podrás ver si hay datos con carácteres que harían inválido al JSON.

Hay otra prácticas que conviene evitar en tu código, como por ejemplo la mezcla de estilos aquí: echo "Error: " . mysqli_error($mysqli);lo cual se considera una mala práctica. También no conviene mostrar al usuario errores internos del sistema. Es mejor mostrar un mensaje de error personalizado, aunque, cuando estés en etapa de depuración pueda ser útil mostrar los mensajes internos.

El código se puede escribir así:

<?php
    $mysqli = new mysqli('localhost','root','','Prueba');
    $myArray=array();
    if ($result = $mysqli->query("SELECT * FROM accion_table")) {
        if ($result->num_rows > 0) {
            while($row = $result->fetch_array(MYSQLI_ASSOC)) {
                    $myArray[] = $row;
            }
            #Este es el bloque de $result válido, cerramos aquí
            $result->close();
        } else {
            $myArray["error"]="No se encontraron filas";
        }
    
    }else {
        #En producción cambiar $mysqli->error por un mensaje personalizado
        $myArray["error"]="Hubo un error en la consulta: {$mysqli->error}";
    }
    $mysqli->close();
    echo json_encode($myArray);    
?>

Observa que siempre el código responderá algo. En los casos de error, dentro del json habrá una clave error que describe el tipo de error que ha ocurrido. Esto es útil para consumir la respuesta en el destino, allí podrías verificar primero si dicha clave existe para actuar en consecuencia, porque de lo contrario podrías pasar a leer un objeto creyendo que trae datos y no trae nada. Esto es particularmente delicado en contextos como aplicaciones móviles, donde la App podría hacer crack sin explicación, provocando desinstalaciones masivas y pérdida de usuarios. Esto es solo un aspecto para entender la importancia que tiene un código bien controlado y coherente en la petición y en el destino.

El problema de la codificación

El hecho de que tengas contenido con caracteres especiales o acentos no es motivo para que se produzca un json inválido, a condición de que todos los niveles tengan un codificación coherente, tal y como se explica en esta respuesta.

Si tu tabla estará destinada a guardar datos en español, podrías darle esta configuración CHARSET=utf8 COLLATE=utf8_spanish_ci (considera hacer una copia de seguridad antes de cambiar cualquier cosa en una tabla en producción). Luego, cuando te conectes, establece el mismo charset a la conexión con set_charset("utf8"), pon el mismo charset en tu HTML y en tu entorno de servidor y listo. Haciendo eso, no necesitarás aplicar cosas del tipo $myArray[] = array_map('htmlentities', $row); en la lectura de los datos. Eso es también parte de las soluciones a medias tratadas en la respuesta referida.

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