2

Intento obtener los datos de una consulta eh imprimirlos en pantalla pero no muestra nada.

$pdo=new PDO("mysql:dbname=usuario;host=localhost","root","root");
$statement=$pdo->prepare("SELECT * FROM usuario WHERE estado = 1 ORDER BY idusuario desc;");
$statement->execute();

if (!$statement){
    echo 'Error al ejecutar la consulta';
}{
    echo 'intentando obtener registros <br>';
    while ($results = $statement->fetchAll(PDO::FETCH_ASSOC)){
        $arreglo['data'][]= $results;
    }
    echo json_encode($arreglo);
}

Investigando encontre que puede ser por la codificación de caracteres entonces supuestamente agregando array_map $arreglo['data'][] = array_map("utf8_encode", $results); el problema se solucionaría, luego de añadir array_map por lo menos muestra algo .. muestra valores nulos aparece esto :

{"data":[[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]]}
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
jeancarlos733
  • 762
  • 3
  • 13
  • 36

2 Answers2

3

Mostraré cómo hacerlo tanto en PDO como en MySQLi.

1. Usando PDO

Si tú usas el método fetchAll en PDO. Ya no necesitas leer los datos dentro de un bucle, dado que este método:

Devuelve un array que contiene todas las filas del conjunto de resultados.

Fuente: fetchAll en el Manual de PHP

Por lo tanto, el código podría quedar así:

$pdo=new PDO("mysql:dbname=usuario;host=localhost","root","root");
$statement=$pdo->prepare("SELECT * FROM usuario WHERE estado = 1 ORDER BY idusuario desc;");
$statement->execute();

if (!$statement){
    echo 'Error al ejecutar la consulta';
}else{
    echo 'intentando obtener registros <br>';
    $results = $statement->fetchAll(PDO::FETCH_ASSOC);
    echo json_encode($results);
}

Tal y como dice el Manual, el código almacenará en la variable $results todos los resultados al usar fetchAll. Además, los almacenará en un array asociativo que, en el json corresponderá a un conjunto de datos clave/valor.


2. Usando MySQLi

MySQLi tiene un método fetch_all, pero éste sólo está disponible si tienes instalado el driver mysqlnd. Como no estamos seguros de ello, y como no sabemos si tu código en un futuro podría ser ejecutado en un equipo que no tenga ese driver, mejor usaremos un código que sea válido para cualquier sistema.

Recuperaremos los datos con el método fetch_assoc, luego los leeremos dentro de un bucle para crear el array con todas las filas.

$mysqli = new mysqli($host_name, $user_name, $pass_word, $database_name, $port); //tu conexion

//Consulta
$sql = "SELECT * FROM usuario WHERE estado = 1 ORDER BY idusuario desc";    

//Se envía la consulta y se almacena en la variable  $resultado
$resultado = $mysqli->query($sql);

//Se  verifica si  hay resultados y se  crea un array asociativo usando  ->fetch_assoc()

if ($resultado)
{

    for ($arrDatos = array (); $row = $resultado->fetch_assoc(); $arrDatos[] = $row);
    echo json_encode($arrDatos);

    /* liberar el conjunto de resultados */
    $resultado->free();

}else{

    print_r("No se encontraron datos, verifique su consulta SQL o la conexión a la BD");  
}

/* cerrar la conexión si es preciso */
$mysqli->close();  

3. Sobre el juego de caracteres

En ocasiones trabajar con JSON da errores debido a que los datos están viniendo mal codificados debido a que al momento de crear la conexión no se estableció un juego de caracteres adecuados.

Para establecer el juego de caracteres en PDO

Si quieres hacerlo después de haber creado el objeto de conexión, puedes hacer esto:

$pdo->exec("set names utf8");

Si quieres hacerlo en el constructor, se lo pasas en un array, al final del constructor (ver enlace al final de esta sección).

Para establecer el juego de caracteres en MySQLi

También puedes hacerlo una vez creado el objeto:

$mysqli->set_charset("utf8")

O indicarlo en el constructor.

Para más detalles sobre el problema de la codificación, puedes consultar la respuesta a esta pregunta: ¿Por que el Carácter inspector (�) aparece en algunos datos obtenidos de la Base de Datos?

A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • Listo amigo ya funciono muchas gracias, encontré un ejemplo que lo hacen con mysqli entonces mi objetivo era intentarlo con pdo, pero el ejemplo que encontré con mysqli si funciona con el while, es decir que en el caso de mysqli si es necesario utilizar el boocle ? por que intente quitarlo y no muestra nada `while( $data = mysqli_fetch_assoc($resultado)){ $arreglo ['data'][] = array_map("utf8_encode", $data); }` un saludo. – jeancarlos733 Mar 02 '17 at 02:56
  • 1
    Funciona con los dos. Yo particularmente prefiero usar PDO, porque es orientado a objetos y para mi es más claro. Cómo te decía lo del WHILE no es necesario porque tanto PDO como MySqli tienen formas para obtener el resultado en forma de array, en el WHILE reinventas la rueda, o sea, haces manualmente algo que ya PHP puede hacer :) Sobre PDO: http://php.net/manual/es/ref.pdo-mysql.php – A. Cedano Mar 02 '17 at 09:54
  • 1
    He editado la respuesta, mostrando un ejemplo del código que funciona tanto con PDO como con Mysqli, como verás en ninguno de los dos es necesario usar el bucle, para eso está el método fetch_assoc que crea él mismo el array. – A. Cedano Mar 02 '17 at 15:38
  • muchas gracias amigo, justamente estuve intentando hacerlo con mysqli, gracias por su tiempo. – jeancarlos733 Mar 02 '17 at 15:54
2

El error es porque json_encode() no puede procesar ciertos caracteres, prueba ejecutando el siguiente query antes de la consulta de tus datos:

$conex->query("SET NAMES 'UTF8'");

Tu codigo quedaria asi,

$pdo=new PDO("mysql:dbname=usuario;host=localhost","root","root");
$pdo->query("SET NAMES 'UTF8' ");
$statement=$pdo->prepare("SELECT * FROM usuario WHERE estado = 1 ORDER BY idusuario desc;");
$statement->execute();

if (!$statement){
    echo 'Error al ejecutar la consulta';
}else{
    $arreglo['data'][]= $statement->fetchAll();
}
echo json_encode($arreglo);
}
Mariano
  • 23,777
  • 20
  • 70
  • 102
Edward
  • 21
  • 1