devolviendo JSON y HTML desde script PHP

Hola busqué las preguntas aquí, pero no pude encontrar nada. Soy nuevo al escribir PHP y jQuery, así que tengan paciencia conmigo.

Lo que estoy tratando de hacer es enviar una solicitud ajax usando jQuery a mi script que ejecuta una consulta mysql en datos de mi base de datos y la serializa en el formato JSON utilizando el json_encode de php. La respuesta se analiza con el script json2.js disponible. Todo esto funciona bien, pero también me gustaría devolver más datos que no sean solo JSON de este script.

principalmente, me gustaría repetir también la siguiente línea antes del json_encode:

echo "

$num_rows Comments for $mysql_table

";

sin embargo, mi jQuery está evaluando la respuesta completa durante el éxito de Ajax, haciendo que la función json.parse falle debido a que el retorno del script está en un formato no válido.

  success: function(data) { //retrieve comments to display on page by parsing them to a JSON object var obj = JSON.parse(data); //loop through all items in the JSON array for (var x = 0; x < obj.length; x++) { //Create a container for the new element var div = $("
").addClass("bubble").appendTo("#comments"); //Add author name and comment to container var blockquote = $("
").appendTo(div); $("

").text(obj[x].comment).appendTo(blockquote); var cite = $("").appendTo(div); $("").text(obj[x].name).appendTo(cite); $("").text(obj[x].datetime).appendTo(cite); } $("#db").attr("value", '' + initialComments + ''); }

¿Alguien sabe cómo puedo devolver la línea html así como el json_encode para usar este script para algo más que json population?

Gracias, este sitio web ha sido maravilloso al responder mis preguntas de novato.

mi php: `

  for ($x = 0, $numrows = mysql_num_rows($result); $x  stripslashes($row["name"]), "comment" => stripslashes($row["comment"]), "datetime" => date("m/d/Y g:i A", strtotime($comment['datetime']))); } //echo "

$num_rows Comments for $mysql_table

"; $response = json_encode($comments); echo $response;`

No haga echo la línea, guárdela en una variable. Construya una matriz simple $response = array( 'html' => $the_line_you_wanted_to_echo, 'jsobject' => $the_object_you_were_going_to_send_back ); y enviarlo de vuelta (a través de json_encode ) en su lugar.

Además, no necesita json2.js, jQuery tiene un excelente analizador JSON.

puede cargar como $.get( 'your/url', { params : here }, success, 'JSON' );

Modificado para que coincida con su iteración recién introducida.

 for ($x = 0, $num_rows = mysql_num_rows($result); $x < $num_rows; $x++) { $row = mysql_fetch_assoc($result); $comments[$x] = array( "name" => stripslashes($row["name"]), "comment" => stripslashes($row["comment"]), "datetime" => date("m/d/Y g:i A", strtotime($comment['datetime'])) ); } $html = "

$num_rows Comments for $mysql_table

"; echo json_encode(array( 'comments' => $comments, 'html' => $html ));

entonces, en tu javascript, tienes

 function success( parsedObject ){ parsedObject.html; // "

Como se dijo anteriormente, simplemente coloque todos los datos que desea recuperar en una matriz y codifíquelos.

 < ?php echo json_encode(array( 'html' => $html, 'foo' => $bar, 'bar' => $baz )); ?> 

También como se dijo, no necesitas json2.js. Puede analizar datos JSON con cualquiera de las funciones ajax de jQuery especificando el tipo de datos como json.

 $.ajax({ type: 'POST', url: 'path/to/php/script.php', dataType: 'json', data: 'foo=bar&baz=whatever', success: function($data) { var html = $data.html; var foo = $data.foo; var bar = $data.bar; // Do whatever. } }); 

EDITAR Más o menos lo que dijo Horia. La única otra variación que podría ver es si querías todo en la misma matriz.

Por ejemplo:

PHP:

 < ?php // You have your comment array sent up as you want as $comments // Then just prepend the HTML string onto the beginning of your comments array. // So now $comments[0] is your HTML string and everything past that is your comments. $comments = array_unshift($comments, $your_html_string); echo json_encode($comments); ?> 

jQuery:

 $.ajax({ type: 'POST', url: 'path/to/php/script.php', dataType: 'json', data: 'foo=bar&baz=whatever', success: function($comments) { // Here's your html string. var html = $comments[0]; // Make sure to start at 1 or you're going to get your HTML string twice. // You could also skip storing it above, start at 0, and add a bit to the for loop: // if x == 0 then print the HTML string else print comments. for (var x = 1; x < $comments.length; x++) { // Do what you want with your comments. // Accessed like so: var name = $comments[x].name; var comment = $comments[x].comment; var datetime = $comments[x].datetime; } } }); 

Es posible que le interese jLinq , una biblioteca de Javascript que le permite consultar objetos Javascript. Una consulta de muestra sería:

 var results = jLinq.from(data.users) .startsWith("first", "a") .orEndsWith("y") .orderBy("admin", "age") .select(); 

jLinq admite consultar objetos nesteds y realizar uniones. Por ejemplo:

 var results = jLinq.from(data.users) .join(data.locations, //the source array "location", //the alias to use (when joined) "locationId", // the location id for the user "id" // the id for the location ) .select(function(r) { return { fullname:r.first + " " + r.last, city:r.location.city, state:r.location.state }; });