2011-12-27 12 views
6

Aquí está mi código PHP llamada durante la llamada AJAX jQuery:Devolviendo un objeto JSON de PHP en una llamada AJAX?

<?php 
    include '../code_files/conn.php'; 
    $conn = new Connection(); 
    $query = 'SELECT Address_1, Address_2, City, State, OfficePhone1, OfficePhone2, Fax1, Fax2, Email_1, Email_2 
       FROM clients WHERE ID = ?'; 
    $conn->mysqli->stmt_init(); 
    $stmt = $conn->mysqli->prepare($query); 
    $stmt->bind_param('s', $_POST['ID']); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    $row = $result->fetch_assoc(); 
    echo json_encode($row); 
?> 

Y el código de cliente es:

$.post(url, {ID:$('#ddlClients').val()}, 
     function(Result){ 
      // Result 
     } 
    ); 

La llamada AJAX se ha completado con éxito. Consigo el valor de Resultado como

"{"Address_1":"Divisional Office 1","Address_2":"The XYZ Road",.....and so on

Lo que quiero es ser capaz de utilizar los valores devueltos como Result.Address_1, Result.Address_2 y así sucesivamente. Pero no puedo hacerlo usando el código anterior. Intenté usar $row = $result->fetch_object() y $row = $result->fetch_array(), pero no uso.

Y sé que esto se puede hacer con este código en el lado del servidor:

$row = $result->fetch_assoc(); 
$retVal = array("Address_1"=>$row['Address_1'], "Address_2"=>$row['Address_2'].......); 
echo json_encode($retVal); 

o

$row = $result->fetch_object(); 
$retVal = array("Address_1"=>$row->Address_1, "Address_2"=>$row->Address_2.......); 
echo json_encode($retVal); 

¿Hay una manera de enviar el $row directamente al lado del cliente JavaScript y listo para ser utilizado como objeto JSON, sin crear manualmente una matriz primero?

+1

no sé si puede hacerlo, pero esto podría serle útil. http://stackoverflow.com/questions/383631/json-encode-mysql-results – insomiac

Respuesta

16

La respuesta que recibe de su script PHP es en texto plano. Sin embargo, puede analizar dicha cadena en un objeto utilizando $.parseJSON en su función de devolución de llamada:

$.ajax({ 
    url  : url,//note that this is setting the `url` property to the value of the `url` variable 
    data  : {ID:$('#ddlClients').val()}, 
    type  : 'post', 
    success : function(Result){ 
      var myObj = $.parseJSON(Result); 
      //you can now access data like this: 
      //myObj.Address_1 
     } 
    } 
); 

Puede dejar jQuery hacer esto para usted estableciendo la propiedad dataType de su llamada AJAX para json:

$.ajax({ 
    url  : url//note that this is setting the `url` property to the value of the `url` variable 
    data  : {ID:$('#ddlClients').val()}, 
    dataType : 'json', 
    type  : 'post', 
    success : function(Result){ 
      //you can now access data like this: 
      //Result.Address_1 
     } 
    } 
); 

Los ejemplos anteriores esperan que la respuesta del servidor sea en este formato (de su pregunta):

"{"Address_1":"Divisional Office 1","Address_2":"The XYZ Road"} 
+0

Gracias. Tu técnica también funcionó. –

+0

Sí. El formato de respuesta es como lo mencionaste. Pero no estaba analizando. –

4

En su llamada $.post, el último argumento podría ser el tipo de datos: json:

$.post(url, {ID:$('#ddlClients').val()}, 
    function(Result){ 
     alert(Result.Address_1); 
    },'json' 
); 

todo debería funcionar entonces, ya que parece que se está haciendo todo bien.

+0

Gracias. Eso funciono. Supuse que $ .post() convertirá automáticamente la respuesta proveniente del servidor. –

2

json_encode acepta objetos, por lo que no hay necesidad de hacer eso automática de creación de gama .:

$row = $result->fetch_object(); 
echo json_encode($row); 

Es tan simple como eso!

+0

Puedes ver mi pregunta. Ya lo hice. Lo que me faltaba era que no especificaba el tipo 'json' mientras hacía una llamada AJAX. –

+0

No, usted creó la matriz manualmente, entonces respondí la pregunta "¿Hay alguna manera de enviar la fila $ directamente al lado del cliente JavaScript y listo para ser utilizado como objeto JSON, _sin crear una matriz primero? _" –

+0

Lo siento , pero mira el primer bloque de código en mi pregunta. Probé lo que mencionaste también. De ambas maneras, tuve que analizar la respuesta en jQuery. Gracias de todos modos. –

Cuestiones relacionadas