2014-01-26 97 views
0

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

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>" 
    } 
    ] 
+1

首先,使用PHP中的参数化查询! http:// stackoverflow。com/questions/60174/how-can-i-prevent-sql -injection-in-php http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give -me-death.html – CenterOrbit

+0

json在php方面看起来如何? –

+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输出之后)你似乎有一个数组JSON最上方的元素,如果它[{"HTML":

开始与阵列工作,你应该更改JavaScript来:

var HTML = data[0].HTML; 

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

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

谢谢奥列格,这解决了我的问题!我还考虑了其​​他一些建议。感谢大家 – realtek

0

随着var HTML = data.HTML;您尝试GETT从属性 “HTML”数据对象由你的php返回。但是你返回一个数组数组(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); 
      } 
     }); 
+0

对不起。是的,我最近改变了这个来测试它。我使用的是数据(“HTML”)而不是data.HTML。我可以确认“数据”返回一个对象,但使用数据(“HTML”)似乎不起作用。 – realtek

+0

'data(“HTML”)'将使用该对象作为函数的字符串参数,这也会产生一个未定义的。 –