【问题标题】:How to receive a PHP Table on AJAX, and display it inside a DIV?如何在 AJAX 上接收 PHP 表,并将其显示在 DIV 中?
【发布时间】:2018-02-26 14:05:08
【问题描述】:

我开始使用 AJAX,但我正在为接下来的几件事而苦苦挣扎。 我在 Wordpress 中使用自定义表格。 顺便说一句,这就是全局 $wpdb 存在的原因。

首先,我有一个 Select,当您选择一个选项时,ID 值将存储在 jQuery 中的一个变量中。这是由

onchange="selectRequest(this)"


global $wpdb;
$Estado = $wpdb->get_results("SELECT * FROM cor_estado;");
?>
<p>Busqueda por Estado</p>
<select class="select" id="estado" name="estado" value="" type="text" onchange="selectRequest(this);">
    <option value="" disabled selected>Seleccione un estado...</option>
    <?php 
    foreach ($Estado as $Estados ) {
        echo "<option value='".$Estados->estado_id."' type='text'>".$Estados->nombre_estado."</option>";
    }
    ?>
    </select>

Select 将填写值和名称上的 id。

这是我的 jQuery,但我在这里遇到了问题,如果我将所有内容都留在 jQuery(document).ready(){CODE HERE} 上,则函数 selectRequest(id) 将根本不起作用,我不知道这是否与我从选择中获取 id 的方式有关。

这里发生了变化,现在我正在尝试接收 HTML,我在“table.php”上创建了完整的表格,现在我正在尝试取回它

<script type="text/javascript">
 function selectRequest(id){ // id of select
    var selectVal = jQuery(id).val(); // currently selected 
    selectVal = selectVal.toString();
    alert(selectVal);
    jQuery.ajax({
        type:"POST",  
        url:"<?php echo get_template_directory_uri(); ?>/table.php",   
        dataType: "html",  
        data:{selectVal:selectVal},
         success:function(resultHtml){ 
            jQuery("#resultado").html(resultHtml);
        },
        error:function(resultHtml){   
            alert("What follows is blank: " + data);
        }  
       });  
    }
</script>

我的 PHP 目前是这样的,一个很大的变化是在 WHERE 中,因为我使用的是 INNER JOIN,我需要指定“estado_id”将在哪个表上,因为 Wordpress 使用表前缀,这个地方也需要加进去。

就像我之前说的,我决定在这里建表,并通过回显将其发送到 AJAX,我创建了 $table,每次在表中创建某些内容时,我都使用“.=”添加它。

在没有“If(isset($_post['selectVal']))”的情况下在 table.php 中进行测试,并且在 table.php 文档上使用静态 ID,但如果我回显 $table,我在 AJAX 上什么也得不到,它显示为空白。

    <?php  
 //table.php  
 global $wpdb;
 if(isset($_POST["selectVal"])){ 
    $Estado_id = $_POST["selectVal"];
     $Estado = $wpdb->get_results("SELECT * FROM cor_municipio INNER JOIN cor_estado ON cor_municipio.estado_id = cor_estado.estado_id WHERE cor_estado.estado_id = $Estado_id;");
       $table = "<table>";
        $table .="<thead>";
            $table .="<tr>";
                $table .="<th>Municipio</th>";
                $table .="<th>Estado</th>";
            $table .="</tr>";
        $table .="</thead>";
       $table .="<tbody>";
    foreach ($Estado as $row) {
        $table .="<tr>";
        $table .="<td>".$row->nombre_municipio."</td>";
        $table .="<td>".$row->nombre_estado."</td>";
        $table .="</tr>";
    }
        $table .="</tbody>";
    $table .="</table>";
    echo $table;
}
 ?>  

这是我想要显示 echo $table 内容的 HTML div。目前,如果我选择一个选项,唯一发生的事情就是 P 元素消失了。

    <div id="resultado">
      <p>Estado Seleccionado</p>
    </div>

新问题是接收这个 echo $table 并在 AJAX 接收它的地方显示它。

【问题讨论】:

    标签: php jquery mysql ajax wordpress


    【解决方案1】:

    所以,这里的基本问题是我按照步骤使用 Wordpress 环境之外的工具(JS、PHP、HTML 和 CSS)执行此操作,这就是问题所在。我仍在解决我的 AJAX 请求的某些方面,我会尽快更新这个答案。

    In this Wordpress Codex entry, they explain it in detail.

    基本上,Wordpress 有它自己的 AJAX 使用方式,所以无论这对我来说“看起来”是否正确,Wordpress 网站都不会显示它的任何内容。

    这是我用来解决问题的解决方案。

    <!-- language: lang-js -->
    UPDATED CODE
    jQuery(document).ready(function() {
        jQuery('#estado').change(function() {
        var selectVal = jQuery('option:selected').val();
        selectVal = selectVal.toString();
        jQuery.ajax({
            url:"/cors/wp-admin/admin-ajax.php",   
            type:"POST", 
            data:{action:'my_action', selectVal: selectVal},
            success:function(data){
                jQuery("#municipio_result").hide(500);
                jQuery("#municipio_result").removeData();
                jQuery("#municipio_result").html(data);
                jQuery("#municipio_result").show(500);
                },
           });  
        });
    });
    

    步骤 #1

    /wp-admin/admin-ajax.php //将是您所有自定义 AJAX 请求的 URL。

    这是绝对必要的,因为本文档验证了 AJAX 'actions',并将它们指向您的 functions.php

    步骤 #2

    数据:{action:'your_action_name', val1: 1, val2: 2 ...}

    您必须发送的第一个变量始终是操作,其值可以是您想要的任何值。

    正如我之前所说,admin-ajax.php 在收到来自任何文件的 AJAX 请求时会查找变量 action,它会查找 action,一旦找到,它会将其重定向到位于的 functions.php 文件在 your_theme 文件夹中。

    步骤 #3

    在你的functions.php文件中,你将把PHP代码添加为一个函数,像这样:

    <!-- language: lang-sql -->
    
     function selectEstado(){
     global $wpdb;
     if(isset($_POST["selectVal"])){ 
        $Estado_id = $_POST["selectVal"];
         $Estado = $wpdb->get_results("SELECT * FROM cor_municipio INNER JOIN cor_estado ON cor_municipio.estado_id = cor_estado.estado_id WHERE cor_estado.estado_id = $Estado_id;");
           $table = "<table>";
            $table .="<thead>";
                $table .="<tr>";
                    $table .="<th>Municipio</th>";
                    $table .="<th>Estado</th>";
                $table .="</tr>";
            $table .="</thead>";
           $table .="<tbody>";
        foreach ($Estado as $row) {
            $table .="<tr>";
            $table .="<td>".$row->nombre_municipio."</td>";
            $table .="<td>".$row->nombre_estado."</td>";
            $table .="</tr>";
        }
            $table .="</tbody>";
            $table .="</table>";
            echo $table;
            wp_die(); 
        }
    }
    add_action('wp_ajax_my_action', 'selectEstado');
    add_action('wp_ajax_nopriv_my_action', 'selectEstado'); 
    

    第 4 步

    在您的functions.php 文件中,您将创建一个函数,可以任意调用,例如'your_function_name'。

    为了方便地访问数据库,Wordpress 使用了变量 $wpdb,通过包含像这样的行 global $wpdb;现在您可以使用它毫无问题地访问数据库了。

    现在您必须检查操作后的值是否到达那里, if(isset($_POST)) 会处理它。要检查数据库,请使用 $wpdb->get_result("");

    基本上,我对 INNER JOIN 所做的是检查列名,检查两个表的匹配位置,然后提取表上元素在“cor_municipio”和“cor_estado”中的其余列.

    (在这段代码中我使用了JOINS,如果您想了解更多关于它们的信息,我会在下面留下一个链接)

    Here they explain JOINS with Venn diagrams

    然后我创建了一个变量,每次创建表的一部分时,都会将其添加到其中。

    你回显你的数据,不要忘记“wp_die();”

    第 5 步

    这是让您的 AJAX 请求在 Wordpress 上运行的最后一部分。

    接下来的两行对于它的工作非常重要,这是 admin-ajax.php 正在寻找的操作,它在这里引用它的值,对于您需要的每个新 AJAX 请求,这些行看起来像这样制作:

    add_action('wp_ajax_', '');
    add_action('wp_ajax_nopriv_', '');
    

    这是行的“默认”编写方式,但您需要通过两件事来完成它们。

    • 您在 AJAX 请求中使用的操作值,在我的例子中是“my_action”,或者在本例中是“your_action_name”。
    • 第二个值是在您的 functions.php 文件中创建的函数的名称。

    对我来说最终会是这样的:

    add_action('wp_ajax_my_action', 'selectEstado');
    add_action('wp_ajax_nopriv_my_action', 'selectEstado');
    

    使用 'your_action_name' 和 'your_function_name' 的值:

    add_action('wp_ajax_your_action_name', 'your_function_name');
    add_action('wp_ajax_nopriv_your_action_name', 'your_function_name');
    

    第一行是登录用户,第二行是访问者,如果你想为登录用户和访问者显示不同的东西,你需要为他们每个人创建一个函数,并且只使用一个属性。

    add_action('wp_ajax_your_action_name', 'your_function_name1'); // for registered users
    add_action('wp_ajax_nopriv_your_action_name', 'your_function_name2'); // for visitors
    

    同样,这是用 admin-ajax.php 编写的 PHP 代码,如果您想深入了解的话。

    当我第一次使用发送数据时,我已经发现了我的问题:

    data:{action:'my_action', selectVal: 'selectVal'},
    

    基本上我在 selectVal 上发送给 Wordpress 的是字符串

    selectVal
    

    所以当我的函数尝试根据接收数据查找 id 时,它什么也找不到,因为它是一个带有这些字母的字符串。

    解决方案

    jQuery(document).ready(function() {
        jQuery('#estado').change(function() {
        var selectVal = jQuery('option:selected').val();
        selectVal = selectVal.toString();
        jQuery.ajax({
            url:"/cors/wp-admin/admin-ajax.php",   
            type:"POST", 
            data:{action:'my_action', selectVal: selectVal}, // The right way to send it
            success:function(data){
                jQuery("#municipio_result").hide(500);
                jQuery("#municipio_result").removeData();
                jQuery("#municipio_result").html(data);
                jQuery("#municipio_result").show(500);
                },
           });  
        });
    });
    

    我现在发送的是值,现在我的 AJAX 成功:函数,接收完整的表,我还更改了 jQuery 代码,因为在第一个示例中,添加“.hide() 或 .show() ",它发送了多个错误。

    要按用户角色添加条件,您可以编辑 admin-ajax.php 以简化所有 AJAX 请求。

    我知道这太长了,但如果您遇到问题,我想解释所有使用的不同元素,以便更容易理解 Wordpress 中的 AJAX 发生了什么。

    【讨论】:

      【解决方案2】:

      没有固定的规则...有时在 php 中创建 html 并将其返回格式化以便您可以直接显示它会更快,有时最好返回原始数据并在 javascript/jquery 中处理它。

      如果您从 ajax 请求中获得的数据只是为了显示,并且您不需要修改任何依赖于当前视图中其他元素的内容,我将直接在 php.ini 中格式化 html 响应。如果您需要更改某些内容,那么也许我会使用 JSON。

      在您的 ajax 请求中,您将 JSON 设置为数据格式,因此您的 PHP 中的响应必须是 JSON。你几乎拥有它。取消注释 foreach 而不是自变量 ($info1, $info2) 创建一个包含响应所需字段的数组,并设置键名。比如……

      $response = array();
      
      foreach ($Estado as $row) {
          $response['municipio'] = $row->nombre_municipio;
          $response['estado'] = $row->nombre_estado;
          .....
      }
      

      创建数组后,将其转换为 JSON 并返回...

      print_r(json_encode($response));

      然后,在您的 jquery ajax 成功函数中,您可以使用...访问每个字段。

      data.municipio or data['municipio']
      data.estado or data['estado']
      ...
      

      希望对你有帮助

      【讨论】:

      • 嗨!,非常感谢,这确实帮助我了解发生了什么,但现在我面临一个新问题。我决定在 php 文件上构建表,因为该数组对我不起作用,但是,现在我无法显示响应,并且 AJAX 为空。
      • @JuanOMtz 嗯...奇怪...让我们检查一些东西... 1. 在ajax,并检查路线是否正确。 2. 所以,只是为了确认一下,当您直接在浏览器中访问 table.php 文件(调整 if 和 post...)时,您会得到正确的 ,对吗?所以,有了这个,我们确定查询和表创建过程是好的。 3.看起来你得到了一个成功的答案,因为你的div是写的。可以肯定的是,在成功的内部做一个 alert(resultHtml) 来检查。
      • @JuanOMtz 4. 您可以访问网络服务器日志吗?如果是这样,请检查他是否收到了对正确文件的 ajax 调用,或者它是否显示了一些错误。 5. 您是否在浏览器 javascript 控制台中遇到错误?哦!也许 selectVal 名称重复会弄乱 jQuery... 为数据对象中的 Ajax 变量和本地变量使用不同的名称。
      • 我想通了。事实证明这是正确的,但是当我在 Wordpress 环境中执行此 AJAX 功能时,我需要使用 Wordpress 在系统中构建的 admin-ajax.php 文件。 codex.wordpress.org/Plugin_API/Action_Reference/… 在此链接中解释了如何使用它并将其连接到您的 WP AJAX 请求。
      • Wordpress 再次来袭!! Jajaja(我从未使用过它)。你的最后一个描述对我来说看起来不错,所以这是一个 Wordpress 的东西是有道理的。很高兴你在这里解决它!如果您不介意,请将解决方案放在帖子中或作为答案,以便每个人都可以从中学习。祝你有美好的一天,愉快的编码!
      【解决方案3】:

      不要接收 JSON 格式的数据,而是使用 HTML 格式的数据并直接在表格中替换您的数据。使用它您的基本问题“每个选择选项中的信息量将不同”将得到解决。

      【讨论】:

      • 嗨!,我已经尝试过你告诉我的,这很有意义,基于这个问题,但我不知道如何接收我在我的 PHP 文件上创建的表,但是你的解决问题的方法帮助我更好地理解了它是如何工作的。
      猜你喜欢
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      相关资源
      最近更新 更多