Varias cosas pueden estar ocurriendo:
Que accion_table
no tenga datos. Para cubrir esa posibilidad deberías verificar la cantidad de filas encontradas con num_rows
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.