【问题标题】:Ajax POST inside a PHP foreach loopPHP foreach 循环中的 Ajax POST
【发布时间】:2013-01-01 12:38:56
【问题描述】:

我正在使用 $.post 在 php foreach 循环内发布一些数据,例如变量、公司名称到控制器方法。在控制器中,我回显了一个使用传递的数据绘制的条形图。 现在在 foreach 循环中,我动态生成了一个 id,该 id 将传递给某个 '' 元素,我需要绘制这个在该 div 内传回的条形图。 我现在使用的代码贴在下面:

    <?php
        $id=0;
        foreach($customer_companies as $data) {
            $company_name=$data->CompanyName;
            echo '<tr>
                  <script>function show_graph()
            {
                $.post("'.$base.'reports/single_bargraph/'.$company_name.'",      {},function(result){
                       $("#'.$id.'").html(result);
                });
             }                                  
        </script> 
        <td class="tablecntntgry" id="'.$id.'" height="45"> 
            <script type="text/javascript"> show_graph();   </script>                            
        </td>
      </tr>';
?>

假设,我为获取数据 $customer_companies 实现了分页,并且一次在页面中显示 3 个。现在我面临的问题是图形没有绘制在指定的 id 中。:( 有时,它会绘制在正确的 3 个 td 生成但有时 2/3 会绘制在同一个 td 重叠另一个:( 有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你的方法是不可接受的——你不应该这样写内联 JS。然后你重新定义并立即调用 show_graph() 函数 - 没办法。
  • js 函数 show_graph() 处于循环中,因此无法工作
  • mvc 在地球上有视图是有原因的。为什么要在控制器方法中解析 js / html 的数据?只需推送该数据以查看并在那里解析它。改变使用这种模式的方法。

标签: php ajax loops foreach .post


【解决方案1】:

通常 AJAX 请求需要时间才能得到响应。但是当响应到达客户端机器时,您已经覆盖了该函数!

我建议您将脚本标记放在 PHP foreach 循环之前的某个位置,并更改函数以接受两个参数。

  1. 公司名称
  2. 结果 div ID

【讨论】:

    【解决方案2】:

    您确实需要在这里重新考虑您的方法,您正在滥用 javascript 的灵活性。您正在多次定义showGraph() 函数,那么您希望javascript 触发哪个版本的方法?应该是第一个吧。将你的 js 与你的 php 分开。

    <?php
            $id=0;
            foreach($customer_companies as $data) {
                $company_name=$data->CompanyName;
                echo '<tr id="'.$data['CompanyName'].'" class="companies"></tr>';
    ?>
    
    $(function(){
       $('.companies').each(function(){
          $.post("'.$base.'reports/single_bargraph/'.$company_name.'",      {},function(result){
                           $(this).append('<td class="tablecntntgry">'+result+'</td>');
                    });
       });
    });
    

    【讨论】:

    • 如果我们谈论好的做法,这不是好的做法。如果公司名称中有空格怎么办?
    • 我不是在为他编写他的全部代码...我用一个起点为他指明了正确的方向。 ID 中的空格比函数的多个声明更易于管理。
    【解决方案3】:
    1. $id 在您的样本中始终为零。
    2. 你需要单独的函数show_graph'.$i.'()(说实话你根本不需要函数,把你的$.post放在表格后面)

    编辑:您的脚本应如下所示:

    <?php
    
    echo "<table>";
    foreach ($customer_companies as $id => $data) {    
        echo '<tr><td class="tablecntntgry" id="row' . $id . '" height="45"></td></tr>';
    }
    echo "</table>";
    
    // NOTE i open <script> tag after </table> closing tag
    
    echo '<script>';
    foreach ($customer_companies as $id => $data) {
        $company_name = $data->CompanyName;
        echo '
        $.post("' . $base . 'reports/single_bargraph/' . $company_name . '", {},function(result){
            $("#row' . $id . '").html(result);
        });                                  
        ';
    }
    echo '</script>';
    

    【讨论】:

    • OOPS.. 有一个 if 循环,其中 foreach 被包装,我在那里增加 $i 的值..
    • @AnuVenugopal 删除函数,将 $.post 放在表格后面(这可能需要第二个循环)
    • 但是如果我将 $.post 放在表格之后,那么每次在 foreach 循环中生成公司名称时,怎么可能传递公司名称呢?我还需要为每个值绘制的图表。
    • 正如@EXQStudio 所建议的,您将需要多一个foreach 循环。由于您在 $customer_companies 变量中拥有所有数据,因此再次遍历记录并不难
    • 根据您的建议,我已经更改了代码,因此现在没有函数调用,并且在 table 标记结束后还有另一个 foreach 循环,其中给出了 $.post 脚本和公司姓名被张贴。但是这些图表仍然被绘制在同一列中,而不是他们尊重的 id 的..:(
    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 2016-09-26
    • 2012-07-19
    • 1970-01-01
    • 2021-10-05
    • 2017-05-28
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多