0

La idea es que al presionar el boton actualizar en PHP se ejecute la sentencia en MYSQL y esos datos regresarlos a JS y por medio de un success solo mostrar los titulos de una columna.

//JS
    'use stric'
    $(document).ready(function(){
        $("#actualizar").on('click',function(){
            var id="";
            $.ajax({
                type:'POST',
                url:'php/Spend.php',
                data:{'id':id},
                success:function(data){
                    console.log(typeof data);
                    $("#request").text(data.titulo_solicitud);
                }
            });
        });
    });

Hasta aqui en la consola me muestra todo el codigo de php (data) y es de tipo string el data.

En PHP no tengo problemas con la conexion a la BD incluso al ejecutar un print_r o var_dump a la variable $json_array muestra todos los datos. el problema esta en el json_enconde que no muestra nada y por lo mismo no puedo acceder a ellos desde el success de Js

<!DOCTYPE html>
<html>
<head>
    <title>MySQLToJson</title>
</head>
<body>
<?php 

    try{
        require_once('conexion_BD.php');
        $sql="SELECT `titulo_solicitud` FROM solicitudes"; //Aqui va la consulta
        $resultado=$conn->query($sql); //recoge los valores de la consulta
    }catch (\Exception $e){
        echo $e->getMessage();  
    }

        $json_array= array();

 while ($row=mysqli_fetch_assoc($resultado)) {      
        $json_array[]=$row;

 }

echo json_encode($json_array);

    $conn->close();?>
</body>
</html>

En este punto necesitaria que los datos del array lo convierta en objeto para poder acceder a ellos en el success de ajax e imprimirlos en un div.

sí comento el json_encode y solo dejo el var_dump o print_r ($json_array) el success de JS me mustra en el div todo el array y solo necesito lo que hay en [titulo_solicitud]. Esto es lo que recibo en el Div si coloco en php var_dump o print_r.

<!DOCTYPE html> <html> <head> <title>MySQLToJson</title> </head> <body> <!DOCTYPE html> <html> <head> <title>conexion</title> </head> <body> </body> </html>Array ( [0] => Array ( [titulo_solicitud] => No puedo acceder a IDSE ) [1] => Array ( [titulo_solicitud] => Atenci�n a t�cnico de telmex ) [2] => Array ( [titulo_solicitud] => No puedo acceder a la BD Access ) [3] => Array ( [titulo_solicitud] => No puedo acceder a la BD Access ) [4] => Array ( [titulo_solicitud] => No hay conexi�n a la BD desde la bodega. ) [5] => Array ( [titulo_solicitud] => ) [6] => Array ( [titulo_solicitud] => Tu cola ) [7] => Array ( [titulo_solicitud] => Tu cola ) [8] => Array ( [titulo_solicitud] => Sin acceso a BD ) ) </body> </html>

No hay errores en la consola de desarrollador, solo se queda en blanco al usar echo json_encode($json_array);

ivaN
  • 21
  • 1
  • 4
  • por que recorres el resultado ` while ($row=mysqli_fetch_assoc($resultado))` y lo entregas a un array y no simplemente devuelves el array `mysqli_fetch_assoc($resultado)`? – jolsalazar Mar 26 '19 at 18:12
  • Por que solo me muesta el primer titulo de la solicitud y requiero todos, para poder tenerlos a la vista. – ivaN Mar 26 '19 at 18:15
  • ¿Podrías compartir lo que sale en `console.log(data);` para ver cómo están estructurados los datos que devuelve el servidor? – A. Cedano Mar 26 '19 at 18:16
  • Si utilizo un print_r o un var_dump me muestra los datos de la columna en un array pero si utilizo el json_encode no muestra ningun dato – ivaN Mar 27 '19 at 15:25

1 Answers1

2

Te sugiero algunas cosas:

  1. Que pongas el dataType a la solicitud de Ajax
  2. Que en coherencia con esto, pongas un header en el servidor
  3. Es mejor que el bloque while esté dentro del bloque try...
  4. Para mostrar todos los datos, tienes que recorrer el JSON en el success. Aquí los guardamos en txtOutput y actualizamos el contenedor una sola vez.
  5. Una cosa muy importante, para tus peticiones Ajax tu archivo php/Spend.php no debería tener etiquetas HTML ni nada que salga por pantalla, solamente los datos que Ajax necesite. Los archivos que se usan para pedir los datos son archivos auxiliares, no están destinados a mostrar nada por pantalla al cliente desde el archivo mismo. Nótese que en caso de error pondremos una clave error en el array y en el success es lo primero que vamos a verificar.

El código sería entonces así:

JS

'use stric'
$(document).ready(function(){
    $("#actualizar").on('click',function(){
        var id="";
        $.ajax({
            type:'POST',
            url:'php/Spend.php',
            data:{'id':id},
            dataType: 'json',
            success:function(data){
                console.log(data);
                var txtOutput="";
                if (data.error){
                    txtOutput=data.error;
                } else {
                    $.each(data, function(i, value) {
                        txtOutput += value.titulo_solicitud;
                    });
                }
                $("#request").text(txtOutput);
            }
        });
    });
});

PHP

<?php 
    $json_array= array();
    
    try{
        require_once('conexion_BD.php');
        $sql="SELECT `titulo_solicitud` FROM solicitudes"; //Aqui va la consulta
        $resultado=$conn->query($sql); //recoge los valores de la consulta
        while ($row=mysqli_fetch_assoc($resultado)) {      
            $json_array[]=$row;
        }
        $conn->close();
    }catch (\Exception $e){
        $json_array ['error']=$e->getMessage();
    }   
    
    header("Content-type: application/json; charset=utf-8");
    echo json_encode($json_array);
?>
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • Lo intente como me indicaste pero obtuve este error en el response del navegador "SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data" – ivaN Mar 27 '19 at 15:15
  • @ivaN en el archivo `Spend.php` no puedes tener cosas como estas: ` MySQLToJson ` porque todo eso se meterá en la respuesta y no estarás recibiendo un JSON válido. Debe ser un archivo PHP limpio, sin contenido HTML ninguno ni ningún `echo, print`, etc, fuera del JSON. ¿Corregiste eso? – A. Cedano Mar 29 '19 at 23:15
  • Hola!! Ya lo resolví, el problema esta en la BD tenía acentos en algunos registros, aunque esta configurado con UTF-8 que tengo entendido que acepta acentos, genera algunos errores en el json_encode(); Amigo muchas gracias por tu tiempo y apoyo el ejemplo que me pusiste si me funciono al final. – ivaN Mar 30 '19 at 04:05
  • @ivaN con la base de datos conviene indicar al objeto de conexión que quieres que trabaje con `utf-8`. Esto se hace de varios modos, según uses PDO o mysqli. Con eso y los header no deberías tener problemas de codificación, [revisa esta respuesta (sobre todo lo que se dice del **nivel 3**)](https://es.stackoverflow.com/a/59510/29967) cuando te sea posible. Saludos. – A. Cedano Mar 30 '19 at 04:09
  • Lo mismo pense estos 3 días que me encontré con este problema pero en fin, por el momento adelantare lo atrasado e iré buscando más información con los acentos ya que seguro los necesitare más adelante. – ivaN Mar 30 '19 at 04:15
  • @ivaN Me alegro de que la respuesta te haya ayudado a resolver el problema. Por favor, cuando sea posible l◔_◔: [¿Qué debo hacer cuando alguien contesta mi pregunta?](https://es.stackoverflow.com/help/someone-answers) en el Centro de Ayuda. – A. Cedano Mar 30 '19 at 10:17