ajax请求不返回值

时间:2014-01-26 21:28:03

标签: php ajax json

我有一个获取json字符串的ajax请求但由于某种原因它已经开始返回“undefined”,json字符串确实返回了有效的JSON,但它只是不起作用!

Ajax请求:

 if (editSeq) {
        $.ajax({
            url: './json/admin/getData.php',
            type: 'POST',
            async: false,
            data: { SEQ: editSeq },
            dataType: 'json',
            success: function (data) {
                var HTML = data.HTML;
                $('#blankform').append(HTML);
                alert(HTML);
            }
        });

JSON:

<?php
include("../../includes/db.php");
$SEQ = $_POST["SEQ"];
$sth = sqlsrv_query($conn,"SELECT HTML from TBL_DATA WHERE Sequence = " . $SEQ);
$rows = array();
while($r = sqlsrv_fetch_array($sth,SQLSRV_FETCH_ASSOC)) {
    $rows[] = $r;
}
if( $sth === false)
{
     echo "Error in query preparation/execution.\n";
     die( print_r( sqlsrv_errors(), true));
}
print json_encode($rows);
?>

这是我的JSON回复:

   [
     {
    "HTML": "  \n\n<div id=\"div_143\" style=\"width: 300px; white-space: nowrap; padding-right: 50px; left: 60px; top: 48px;\" class=\"ui-resizable ui-draggable ui-resizable-disabled ui-state-disabled\" aria-disabled=\"true\"><label> Incident #&nbsp;<input type=\"text\" style=\"width:100%;\" id=\"input_143\" role=\"textbox\" aria-autocomplete=\"both\" aria-disabled=\"false\" aria-readonly=\"false\" aria-multiline=\"false\" class=\"jqx-widget-content jqx-widget-content-web jqx-input jqx-input-web jqx-widget jqx-widget-web jqx-rc-all jqx-rc-all-web\" placeholder=\"\" disabled=\"disabled\"><\\/label><div class=\"ui-resizable-handle ui-resizable-e\" style=\"z-index: 90;\"><\\/div><div class=\"ui-resizable-handle ui-resizable-w\" style=\"z-index: 90;\"><\\/div><div class=\"ui-resizable-handle ui-resizable-sw\" style=\"z-index: 90;\"><\\/div><div class=\"ui-resizable-handle ui-resizable-ne\" style=\"z-index: 90;\"><\\/div><div class=\"ui-resizable-handle ui-resizable-nw\" style=\"z-index: 90;\"><\\/div><div class=\"ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se\" style=\"z-index: 90;\"><\\/div><\\/div>"
     }
   ]

2 个答案:

答案 0 :(得分:1)

首先,在AJAX脚本中,总是在回显输出后终止脚本。 比方说,如果你在脚本上有更多的东西,就像其他的IF一样,如果你已经显示了JSON输出,则不需要运行它们,否则额外的输出会弄乱你的JSON,一切都将停止工作。

所以,始终执行:

print json_encode($rows);
exit;

其次,在您的情况下,您可能会遇到一些SQL问题,所有问题都是您没有看到错误消息。它可能会说“查询准备/执行错误”,但您无法看到它!或者你可以有任何其他PHP致命错误,你看不到,因为它弄乱了JSON和Javascript无法显示.HTML部分。

您的解决方案是测试它,暂时将Javascript更改为:

$.ajax({
     url: './json/admin/getData.php',
     type: 'POST',
     async: false,
     data: { SEQ: editSeq },
     // dataType: 'json', // temporarily comment it out to receive plain messages
     success: function (data) 
     {
       alert(data); return; // temporary line. Remove after debuging.
       var HTML = data.HTML;
       $('#blankform').append(HTML);
       alert(HTML);
     }
});

第三,(在添加了JSON输出之后),如果它以[{"HTML":

开头,你似乎有一个数组是JSON的最顶层元素

要使用数组,您应该将JavaScript更改为:

var HTML = data[0].HTML;

甚至,如果可能有很多行:

var HTML = '';
for(i=0;i<data.length;i++) HTML += data[i].HTML;\

答案 1 :(得分:0)

使用var HTML = data.HTML;,您试图从php返回的数据对象中获取属性“HTML”。但是你返回一个数组数组(mysql行)。所以:data.HTML未定义。

尝试:

 if (editSeq) {
         $.ajax({
             url: './json/admin/getData.php',
             type: 'POST',
             async: false,
             data: { SEQ: editSeq },
             dataType: 'json',
             success: function (data) {

                 $('#blankform').append(data);
                 alert(data);
             }
         });

实际上,将原始数据发布到div左右没有多大意义,但在这种情况下,您将看到您的数据并可以继续编程来处理它们。

为了从data中获取行(如果我的假设是正确的),你应该迭代它们:

 for ( var n = 0; n = data.length; n++ )  // rows
 {
      alert(data[n]); // show one single row
 }

根据你的json,这可以改变:

 if (editSeq) {
         $.ajax({
             url: './json/admin/getData.php',
             type: 'POST',
             async: false,
             data: { SEQ: editSeq },
             dataType: 'json',
             success: function (data) {

                 $('#blankform').append(data[0].HTML);
                 alert(data[0].HTML);
             }
         });