AJAX$wpdb不返回表数据

时间:2018-12-30 作者:colapsnux

我正在使用WordPress 5.0.2带WooCommerce 3.5.3 我在checkoutpage上有两个选择下拉字段。我想从billing\\u region下拉列表中检索所选region\\u代码值,然后根据该值填充billing\\u province select下拉列表,但ajax请求不返回任何内容(400)

吼叫我的代码

HTML :

<div class="delivery-form-row">
   <label for="billing_region">Region :</label>
   <select id="billing_region" name="billing_region">
      <option value="" selected="" disabled="">- Select your region -</option>
      <option value="01">REGION I </option>
      <option value="02">REGION II </option>
      <option value="03">REGION III </option>
   </select>
</div>
<div class="delivery-form-row">
   <label for="billing_province">Province :</label>
   <select id="billing_province" name="billing_province">
      <option value="" selected="">- Select your region first -</option>
   </select>
</div>

functions.php

add_action( \'wp_enqueue_scripts\', \'enqueue_js_script\', 30);
function enqueue_js_script() {
  wp_enqueue_script( \'custom-js\', get_stylesheet_directory_uri() . \'/js/custom.js\', array(\'jquery\'), \'1.0.0\', true );
  wp_localize_script( \'custom-js\', \'postdata\', array( \'ajax_url\' => admin_url( \'admin-ajax.php\' ) ) );
}


add_action (\'wp_ajax_call_wc_get_phprpcb_data\', \'wc_get_phprpcb_data\') ;
add_action (\'wp_ajax_nopriv_call_wc_get_phprpcb_data\', \'wc_get_phprpcb_data\') ;
function wc_get_phprpcb_data() {
  global $wpdb;

  if(isset($_POST[\'regcode\'])) {

    $stmt = $wpdb->query( $wpdb->prepare("SELECT * FROM skjdbt_sphilippine_provinces WHERE region_code = " . $_POST[\'regcode\'] . " ORDER BY province_description ASC") ); 
    $stmt->execute();
    $provinces = $stmt->fetchAll(PDO::FETCH_ASSOC);
    echo wp_send_json_success($provinces);
    wp_die();
  }
}
custom.js :

  $("#billing_region").change(function(){
    var $this = $(this),
        regcode = $this.val(),
        $billingProvince = $("#billing_province");
        console.log(regcode)

    $.ajax({
      method: \'post\',
      url: postdata.ajax_url,
      dataType: \'JSON\',
      data: {
        action: \'wc_get_phprpcb_data\',
        regcode: regcode,
      },
      success: function(provinces) {

        $billingProvince
        .empty()
        .append(\'<option value="" selected="" disabled="">Please choose your province</option>\');

        provinces = JSON.parse(provinces);
        provinces.forEach(function(province){
          $billingProvince.append(\'<option value="\' + province.province_code + \'">\' + province.province_description +\'</option>\');
        });
      },
    });
  });
省表截图:

enter image description here

任何帮助都将不胜感激

[EDIT] @Krzysiek Dróżdż]

谢谢你的帮助,伙计。下面是工作代码。

add_action (\'wp_ajax_wc_get_phprpcb_data\', \'wc_get_phprpcb_data\') ;
add_action (\'wp_ajax_nopriv_wc_get_phprpcb_data\', \'wc_get_phprpcb_data\') ;
function wc_get_phprpcb_data() {
  global $wpdb;

  if(isset($_POST[\'regcode\'])) {

    $regcode = $_POST[\'regcode\'];
    $sql = "SELECT * FROM {$wpdb->prefix}philippine_provinces WHERE region_code = " . $regcode . " ORDER BY province_description ASC";
    $result = $wpdb->get_results($wpdb->prepare($sql, $regcode));

    echo json_encode($result);

    die();
    exit;
  }
}

1 个回复
SO网友:Krzysiek Dróżdż

我在代码中看到的主要问题是query 方法wpdb 并假设它是PDO语句对象。。。

但事实并非如此。

看看wpdb Codex:https://codex.wordpress.org/Class_Reference/wpdb

query 方法用于在DB上运行自定义查询—仅此而已。

您想要使用的是get_results.

顺便说一句,说真的,永远不要将用户输入与SQL语句连接起来。此类数据应始终正确转义,否则会创建SQL注入漏洞。您可以使用prepare 方法在WP中创建安全查询。

我也不认为你应该回应wp_send_json_success - 我很确定这个函数已经回显了值。。。

还有一件事。。。你的钩子错了。您发送操作wc_get_..., 然后用钩子wp_ajax_call_wc_get... (因此您的php代码假定操作是call_wc_get....