【问题标题】:jQuery - Need to access PHP array values received after a successful ajax POST operationjQuery - 需要访问成功 ajax POST 操作后收到的 PHP 数组值
【发布时间】:2010-01-09 13:49:52
【问题描述】:

平台:

jQuery、PHP、mySQL

我有什么:

我正在使用 jQuery 处理来自表单的信息并将所有 POST 数据发送到一个 php 文件,该文件执行多个操作并返回一个数据数组以及其他必要的数据。其中一个数组是数组的数组。我需要以可以将每个嵌套数组值附加到表的方式访问这个数组值数组。

我需要什么:

我一直在努力使用 jquery 代码来让它工作很长时间,但它不起作用。因此,如果有人可以帮助我解决 jquery 代码,我将不胜感激。提前致谢。

表格结构

fname   lname    city
Ed        Al      SA
Bob       B       MN
Chris     V       KJ

PHP 代码

//Content of my PHP file that return json encoded data
$success = 1;

$new_rows_data['fname'] = array();
$new_rows_data['lname'] = array();
$new_rows_data['city'] = array();

$result = mysql_query("SELECT fname, lname, city FROM table LIMIT 3");
while( $row = mysql_fetch_array($result) ) 
{
    $new_rows_data['fname'][] = $row['fname'];
    $new_rows_data['lname'][] = $row['lname'];
    $new_rows_data['city'][]  = $row['city']
}

print json_encode(array('success' => $success, 'new_rows_data' => $new_rows_data)); 

jQuery 代码:

$('#button_delete').click(function() {  

  $.ajax({
   type: 'POST',  
   cache: false,
   url: 'test.php',
   data: $('#form1').serialize(), 
   dataType: 'json',
   success: function(data) {            

      if(data.success == '1')
      {
             jQuery.each(data.new_rows_data, function(i, val) 
            {
                 $('#table').append('<tr>'+

                          '<td>'+val.fname+'</td>'+           
                          '<td>'+val.lname+'</td>'+           
                          '<td>'+val.city+'</td>'+           

                  '</tr>');   

            });
      }//END if
     }       
   }) //END ajax

  return false;
});

我正在尝试将这些新数据附加到具有 id # 表的现有表中,以便我看起来像以下 DESIRED OUTPUT

First Name   Last Name  City
  Orko           C      OI    ---> (Existing row of data)
  Gordon        Flash   KS    ---> (Existing row of data)
  Ed             Al      SA    ---> New row of data that just got appended
  Bob            B       MN    ---> New row of data that just got appended
 Chris           V       KJ    ---> New row of data that just got appended 

【问题讨论】:

  • “它不起作用”是什么意思?它是否从服务器接收数据?它是否正确循环数据?有很多地方可能会出错......有什么症状?
  • 删除了我的答案,因为它不再相关...您尝试过@cballou 的建议吗?究竟是什么不工作?是否调用了成功函数?如果你添加一个错误处理函数,这会触发吗?
  • @Brandon @jammus 我已经尝试过@cballou 的建议。正在调用成功函数。附加到表格部分不起作用。以下代码不会产生将新行添加到表末尾的预期效果: jQuery.each(data.new_rows_data, function(i, val) { $('#table').append(' '+ ''+val.fname+''+ ''+val.lname+''+ ''+val.city+''+ ''); });希望我说得通。谢谢。
  • @Brandon 是的,它正在接收来自服务器的响应。它似乎在 PHP 文件中正确循环,并且它正确地向我发送了其他响应,例如 data.success 值为 1。我尝试添加错误处理程序,但它没有触发。如果我发出警报(data.success);在成功事件中,它提醒我:1,这是正确的。我认为是 jQuery.each 循环停止工作/不起作用(我的意思是它不会将 'new_rows_data' 中包含的数据添加到表的末尾。这就是我失去的功能。希望这会有所帮助。谢谢你。
  • @Devner Brandon 的问题仍然存在。发生了什么而不是预期的行为?您是否收到 JavaScript 错误?行附加代码是否根本没有效果?您是否已验证您的 $('#table') 选择器与您认为的匹配? data.new_rows_data 中返回的数据结构是你所期望的吗?

标签: arrays jquery


【解决方案1】:

当我开始在其中组合文本和对象时,Append 对我来说从来都不是很友好。试试这个:

$.each(data.new_rows_data, function(i, val) {
   var tr = $('<tr></tr>');

   $.each(val, function(i, newVal){
      var td = $('<td></td>').text(newVal);
      tr.append(td);
   });

   $('#table').append(tr);
});

应该完成工作。

更改为 3 列的多行:

最好将您的 PHP 数组构建更改为:

$result = mysql_query("SELECT fname, lname, city FROM table LIMIT 3");
$i = 0;
while( $row = mysql_fetch_array($result) ) 
{
    $new_rows_data[$i]['fname'] = $row['fname'];
    $new_rows_data[$i]['lname'] = $row['lname'];
    $new_rows_data[$i]['city']  = $row['city'];
    $i++;
}

【讨论】:

  • 哇!我想我们终于到了某个地方。它目前确实将数据附加到表中,但以不同于预期的方式。这就是它与您给我的代码一起工作的方式。假设返回的记录数量为 5,则不是创建 5 行,其中包含 3 列数据,而是创建 5 个 COLUMNS,其中包含 3 行数据。我认为行与列交换,反之亦然。我认为改变会做到这一点。我尝试更改代码,但无论我做什么,它都会破坏它。所以我想如果你知道解决这个问题的快速方法。非常感谢。
  • 我认为更改 PHP 构建数组的方式会更容易。请参阅更新的答案。 :)
  • 太棒了!这将是当天的答案!你的伎俩奏效了!太感谢了!它附加了所有检索到的列。只是想知道我是否必须添加一个带有复选框的静态列并用记录 id 填充它,以便我可以选择行/记录并删除它,我应该在 jquery 代码中的哪里修改它?
  • 几个选项。我建议将列中您想要的任何内容添加到$new_rows_data[$i]['something_new'] 数组中,并在 jquery 中将text() 更改为html()。另一个,如果它是完全静态的,则在循环之前或之后执行$('&lt;td&gt;&lt;/td&gt;').html('&lt;input type="checkbox" /&gt;').appendTo(tr) 之类的操作。
  • +1 再一次,太棒了!我实现了它并且它有效!感谢您的所有帮助。
【解决方案2】:

我刚从搜索中发现这个,想指出你的代码在哪里:

$new_rows_data['fname'][] = $row['fname'];
$new_rows_data['lname'][] = $row['lname'];
$new_rows_data['city'][]  = $row['city'];

这里发生的是您正在构建多个并行数组。在 javascript 中,单个值将可见,例如data.new_rows_data.fname[0] 为第一行的 fname。当您对此执行 $.each(...) 时,您的函数应该看到 i=="fname" 和 val 的参数等于一个 3 元素的名字数组。

munch 的答案通过显式索引完成了同样的事情,但对于您的具体情况,我会这样编码:

$new_rows_data[] = $row;

或者对于计算值不是那么简单的情况:

$new_rows_data[] = array(
    'foo' => get_foo($row),
    'bar' => $row['bar']
);

在任何一种情况下,new_rows_data 都会变成一个对象数组,其属性与您的 PHP 数组键匹配,可以在 javascript 中以 data.new_rows_data[1].fname 访问。您的 $.each(...) 循环现在会将 i 视为整数,将 val 视为具有您期望的属性的对象。

【讨论】:

    【解决方案3】:

    我看到的第一个问题是打字松散:

    if(data.success === 1)
    

    应该是

    if(data.success == '1')
    

    因为就javascript而言,所有从AJAX返回的数据都是一个字符串。我刚刚从@Jammus 注意到,您的 PHP 代码还应该将您的 $success 变量切换为具有 01 的值。

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 2015-08-23
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2014-03-17
      • 2011-04-04
      • 2012-06-17
      • 1970-01-01
      相关资源
      最近更新 更多