Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] fetch_object() sólo me devuelve ID

Estas en el tema de fetch_object() sólo me devuelve ID en el foro de PHP en Foros del Web. Hola! Pues bien, el código que sigue, funciona OK. En pantalla se muestran todos los datos obtenidos de la consulta: Código PHP: $mysqli     = new  mysqli ...
  #1 (permalink)  
Antiguo 20/05/2015, 22:22
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta fetch_object() sólo me devuelve ID

Hola!

Pues bien, el código que sigue, funciona OK. En pantalla se muestran todos los datos obtenidos de la consulta:
Código PHP:
$mysqli    = new mysqli("localhost""root""""claves_foraneas");
$query "
    SELECT a.id,
           a.nombre,
           a.ciudad,
           b.id,
           b.codigo
    FROM cliente a, compra b
    WHERE a.id = b.id
"
;

$resultado $mysqli->query($query);

if (
$resultado->num_rows 0) {
    while (
$row $resultado->fetch_object()) {
        echo 
"ID:".$row->id."<br>NOMBRE: ".$row->nombre."<br>CIUDAD: ".$row->ciudad."<br>C&Oacute;DIGO: ".$row->codigo;
    }

Ahora bien, estoy entrenando con AJAX de jQuery, y hago uso casi exactamente de este mismo código. La única diferencia es que en aquél hago echo a un jSON. Pero no funciona bien. Sólo funciona si imprimo la propiedad ID de $row: $row->id, y nada más.

Si quiero imprimir $row->nombre, sale error tipo parsererror. Como si en la query no hubiera declarado: a.nombre

¿Alguna idea de a qué se debe esto? Estoy en el limbo, no puedo moverme.

Chrome no ayuda mucho: This request has no response data available.

Saludos!
  #2 (permalink)  
Antiguo 20/05/2015, 22:31
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: fetch_object() sólo me devuelve ID

La única forma de saber exactamente los valores que obtienes debes hacer lo siguiente:
Código PHP:
Ver original
  1. var_dump($row);

¿Qué te muestra con eso?

Cita:
Chrome no ayuda mucho: This request has no response data available.
Eso es obvio, ¿pero qué sucedería si ves la respuesta de la petición en lugar del mensaje de la consola?

Vamos, que también hay que saber mirar en el lugar correcto.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 21/05/2015, 05:32
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Respuesta: fetch_object() sólo me devuelve ID

Cita:
Iniciado por pateketrueke Ver Mensaje
La única forma de saber exactamente los valores que obtienes debes hacer lo siguiente...
Es cierto, maestro pateketrueke, var_dump(), discúlpame . Este es el resultado:


Bueno, ahora veo que se recuperan todos los datos: ID, NOMBRE, etc. Entonces, ¿a qué crees que se deba que no se impriman en pantalla? El sig script es el que tengo en el PHP llamado por AJAX, y que no funciona:

Código PHP:
Ver original
  1. if ( $resultado = $conexion->query($query) ) {
  2.     if ($resultado->num_rows > 0) {
  3.         while ($row = $resultado->fetch_object()) {
  4.             $filaHTML .= "<tr> <td>".$row->id."</td> <td>".$row->nombre."</td> <td>".$row->ciudad."</td> <td>".$row->codigo."</td> </tr>";
  5.         }
  6.         $arrayRespuestas = array(
  7.             'filaHTML' => $filaHTML,
  8.             'statusResponse' => 'Respuesta AJAX OK'
  9.         );
  10.         echo json_encode($arrayRespuestas);
  11.     }
  12.     else echo "No hay registros en la base de datos";
  13. }


Cita:
Iniciado por pateketrueke Ver Mensaje
Eso es obvio, ¿pero qué sucedería si ves la respuesta de la petición en lugar del mensaje de la consola?...
Esto: This request has no response data available se mostraba en la pestaña RESPONSE de Chrome. Y si en esta pestaña no se ve la respuesta de la petición, ¿dónde?

Saludos!

Última edición por berkeleyPunk; 21/05/2015 a las 05:43
  #4 (permalink)  
Antiguo 21/05/2015, 06:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: fetch_object() sólo me devuelve ID

El var_dump() de $row también debería mostrarte las claves, ¿pues cómo lo has usado?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 21/05/2015, 13:23
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Sonrisa Respuesta: fetch_object() sólo me devuelve ID

Cita:
Iniciado por pateketrueke Ver Mensaje
El var_dump() de $row también debería mostrarte las claves, ¿pues cómo lo has usado?
Así:
Código PHP:
$filaHTML .= "<tr> <td>".var_dump($row->id)."</td> <td>".var_dump($row->nombre)."</td> <td>".$var_dump($row->ciudad)."</td> <td>".var_dump($row->codigo)."</td> </tr>"
Y no imprime en pantalla.
  #6 (permalink)  
Antiguo 21/05/2015, 14:51
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: fetch_object() sólo me devuelve ID

¿Por qué no hiciste como te sugerí?

Código PHP:
Ver original
  1. var_dump($row);

Por favor aprender a leer bien.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 21/05/2015, 20:15
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Respuesta: fetch_object() sólo me devuelve ID

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Por qué no hiciste como te sugerí?...
Ok, ok. Para tu satisfacción, hice más pruebas, incluyendo la que propones.

1) Cambié la variable $filaHTML así: $filaHTML .= "<tr> <td>".var_dump($row)."</td> <td> ... </td> <td> ... </td> <td> ... </td> </tr>";. Obtuve esto:


2) También cambié, en otro ejemplo, el $arrayRespuestas así: 'filaHTML' => var_dump($filaHTML),. Obtuve esto:


Como se ve en las dos pruebas, la consulta es satisfactoria. Y lo que veo en la 2da prueba, es que la variable $filaHTML (que tiene celdas de una tabla), se llena correctamente con los datos de la consulta; pero, y esto es lo raro , una vez que asignamos esta variable como valor en el array, devuelve NULL!

Creo que el problema no está en el array, sino en que el json_encode() no es capaz de formar completamente el json con $filaHTML como valor.


Nota: A $filaHTML la declráré inicialmente como tipo cadena: $filaHTML = "";

Última edición por berkeleyPunk; 22/05/2015 a las 06:17
  #8 (permalink)  
Antiguo 22/05/2015, 11:28
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: fetch_object() sólo me devuelve ID

No, no te equivoques, no es "para mi satisfacción" es para entender mejor el problema, ¿o de qué otra manera podemos conocer los datos que tienes si no los examinas primero?

Ahora, lo siguiente:
Cita:
una vez que asignamos esta variable como valor en el array, devuelve NULL!
Sería bueno que muestras cómo es tu código actual, de otra forma hay que seguir adivinando.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 22/05/2015, 14:16
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Sonrisa Respuesta: fetch_object() sólo me devuelve ID

Cita:
Iniciado por pateketrueke Ver Mensaje
...Sería bueno que muestras cómo es tu código actual...
De acuerdo .
Esto está en el documento que hace la petición:
Código HTML:
Ver original
  1. <form id="formularioComprar">
  2.     <h3>Comprar</h3>
  3.     <select id="cliente" name="cliente">
  4.         <option value="NULL">:: Elige tu nombre ::</option>
  5.     </select>
  6.     <select id="articulo" name="articulo">
  7.         <option value="NULL">:: Elige un artículo ::</option>
  8.     </select>
  9.     <input type="hidden" name="forma" value="formularioComprar">
  10.     <input type="submit" value="Comprar">
  11. </form>
  12.  
  13. <table id="tablaResultado"></table>
  14.  
  15. <div id="mensaje"></div>
  16.  
  17. <script type="text/javascript">
  18.  
  19.     $(document).ready(function() {
  20.         $(function() {
  21.             $.ajaxSetup({
  22.                 error: function(jqXHR, exception) {
  23.                    if (jqXHR.status === 0) {
  24.                        alert('Sin conexión: Verificar Red');
  25.                    } else if (jqXHR.status == 404) {
  26.                        alert('Página no encontrada. Error 404');
  27.                    } else if (jqXHR.status == 500) {
  28.                        alert('Error del servidor. Error 500');
  29.                    } else if (exception === 'parsererror') {
  30.                        alert('Fallo en la petición JSON');
  31.                    } else if (exception === 'timeout') {
  32.                        alert('Tiempo límite excedido');
  33.                    } else if (exception === 'abort') {
  34.                        alert('Se abortó la petición AJAX');
  35.                    } else {
  36.                        alert('Uncaught Error: ' + jqXHR.responseText);
  37.                    }
  38.                 }
  39.             });
  40.         });
  41.         $("#formularioComprar").on("submit", function(e) {
  42.             e.preventDefault();
  43.             var datos = $("#formularioComprar").serializeArray();
  44.             $.ajax({
  45.                 type: "POST",
  46.                 dataType: "json",
  47.                 url: "process.php",
  48.                 data: datos,
  49.                 success: function(response) {
  50.                     $("#tablaResultado").append( response.filaHTML );
  51.                     $("#mensaje").text( response.statusResponse );
  52.                 },
  53.                 complete: function(jqXHR, estado) {
  54.                     if (estado == "parsererror") {
  55.                         $("#mensaje").text( estado );
  56.                     }
  57.                 }
  58.             });
  59.         });
  60.     });


Esto está en el documento solicitado por la petición AJAX:
Código PHP:
Ver original
  1. <?php
  2.  
  3. if(isset($_POST["forma"])){$forma=$_POST["forma"];}
  4. if(isset($_POST["cliente"])){$cliente=$_POST["cliente"];}
  5. if(isset($_POST["articulo"])){$articulo=$_POST["articulo"];}
  6.  
  7. $filaHTML = "";
  8.  
  9. if($forma) {
  10.     if ($forma == "formularioComprar") {
  11.         $conexion = new mysqli("localhost", "root", "", "claves_foraneas");
  12.         $query2   = "
  13.             SELECT a.id,
  14.                    a.nombre,
  15.                    a.ciudad,
  16.                    b.id,
  17.                    b.codigo
  18.             FROM cliente a, compra b
  19.             WHERE a.id = b.id
  20.         ";
  21.  
  22.         if ( ($cliente != "NULL") && ($articulo != "NULL") ) {
  23.             if ( $resultado = $conexion->query($query2) ) {
  24.                 if ($resultado->num_rows > 0) {
  25.                     while ($row = $resultado->fetch_object()) {
  26.                         $filaHTML .= "<tr> <td> </td> <td>".$row->nombre."</td> <td> </td> <td> </td> </tr>";
  27.                     }
  28.                     $arrayRespuestas = array(
  29.                         'filaHTML' => $filaHTML,
  30.                         'statusResponse' => 'Respuesta AJAX OK'
  31.                     );
  32.                     echo json_encode($arrayRespuestas);
  33.                    
  34.                     switch(json_last_error()) {
  35.                         case JSON_ERROR_NONE:
  36.                             echo ' - Sin errores';
  37.                         break;
  38.                         case JSON_ERROR_DEPTH:
  39.                             echo ' - Excedido tamaño máximo de la pila';
  40.                         break;
  41.                         case JSON_ERROR_STATE_MISMATCH:
  42.                             echo ' - Desbordamiento de buffer o los modos no coinciden';
  43.                         break;
  44.                         case JSON_ERROR_CTRL_CHAR:
  45.                             echo ' - Encontrado carácter de control no esperado';
  46.                         break;
  47.                         case JSON_ERROR_SYNTAX:
  48.                             echo ' - Error de sintaxis, JSON mal formado';
  49.                         break;
  50.                         case JSON_ERROR_UTF8:
  51.                             echo ' - Caracteres UTF-8 malformados, posiblemente están mal codificados';
  52.                         break;
  53.                         default:
  54.                             echo ' - Error desconocido';
  55.                         break;
  56.                     }
  57.                     echo PHP_EOL;
  58.                 }
  59.             }
  60.         }
  61.     }
  62. }

Te actualizo. Hice una prueba más, pero ahora con la función json_last_error(), que informa si está mal construido el JSON. En efecto, esta función me devuelve: Caracteres UTF-8 malformados, posiblemente están mal codificados.

Saludos!
  #10 (permalink)  
Antiguo 23/05/2015, 11:01
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Respuesta: fetch_object() sólo me devuelve ID

Solucioné el problema!
La función json_last_error() informa si un JSON está mal construido. Como comenté anteriormente, esa función me devolvía: Caracteres UTF-8 malformados, posiblemente están mal codificados. Para no hacer más largo el cuento, la cosa se solucionó así:
Código PHP:
while ($row $resultado->fetch_object()) {
    
$id     utf8_encode($row->id);
    
$nombre utf8_encode($row->nombre);
    
$ciudad utf8_encode($row->ciudad);
    
$codigo utf8_encode($row->codigo);
    
$filaHTML .= "<tr> <td>".$id."</td> <td>".$nombre."</td> <td>".$ciudad."</td> <td>".$codigo."</td> </tr>";
}
$arrayRespuestas = array(
    
'filaHTML' => $filaHTML,
    
'statusResponse' => 'Respuesta AJAX OK'
);
echo 
json_encode($arrayRespuestas); 
Ahora bien, yo lo arreglé así. Pero en vista que este post ya se hizo bastante grande, imagino que tú, pateketrueke, normalmente no tienes ese problema. Así que: ¿qué haces para que no te surja este embrollo? Mi BD tiene cotejamiento UF8_general_ci, con lo cual, entiendo, el problema no debería estar ahí.

Bueno, creo que es todo, muchas gracias maestro, y hasta pronto.

Saludos!

Última edición por berkeleyPunk; 23/05/2015 a las 21:54

Etiquetas: ajax-php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:10.