【问题标题】:why the ajax call runs and create duplicates为什么 ajax 调用运行并创建重复项
【发布时间】:2018-10-09 21:08:12
【问题描述】:

我添加了一个 ajax 按钮来将一些数据发送到 wordpress 数据库中的自定义表。

这就是我所拥有的。

jQuery(document).ready(function(){

    jQuery("#holiday-submit").click(function(event){
        event.preventDefault();
        //var name = jQuery("#dname").val();
        var date = jQuery("#holiday").val();
       var reason =jQuery("#holiday-reason").val();
        jQuery.ajax({
            type: 'POST',
            url: MyAjax.ajaxurl,
            data: {"action": "add_holiday", "holiday":date, "reason" :reason},
            success:function(data){
                jQuery("#holiday-status").addClass("success");
                jQuery("#holiday-status").html( "New Holiday added " + date +" " + reason);
                }
        });
    });
});

然后在函数文件中,我有以下内容

function add_holiday(){
    $holiday = $_POST['holiday'];
    $reason = $_POST['reason'];
    global $wpdb;

    $table1= $wpdb->prefix.'holidays';
    $results = $wpdb->get_results("select * from $table1 where holiday=$holiday");
        if($wpdb->num_rows == 0 ){
            $wpdb->insert(
                    $table1,
                array(
                    'holiday' => $holiday,
                    'reason'  => $reason
                ),
                array(
                    '%s'
                )
            );
            die();

            return true;
        }
        else{
            die();
            return false;
        }
    }

add_action('wp_ajax_add_holiday', 'add_holiday');
add_action('wp_ajax_nopriv_add_holiday', 'add_holiday');

ajax调用和相关回调函数都工作正常,一旦使用以下表单提交数据,它就会发送到数据库并保存。

但是,我不想将重复的日期添加到数据库中。

这就是为什么我添加了一个条件来检查数据库表中是否已经存在日期。理想情况下,如果日期已添加到数据库中,我需要显示错误。然而,ajax 调用在不考虑上述条件的情况下运行。

解决此问题的最佳方法是什么。

这是我的表单和输出区域。

<form action="" method="post">

            <input type="date" id="holiday" name="holiday">
            <input type="text" id="holiday-reason" placeholder="Holiday reason">
            <!--<input type="submit" id="holiday-submit">-->
            <input type="button" id="holiday-submit" value="submit" class="btn btn-primary">
        </form>
<div id="holiday-status">

</div>

        <div id="current-holidays">
            <table id="declared-holidays" class="table table-success">
                <thead>
                <tr>
                    <th>Date</th>
                    <th>Reason</th>
                </tr>
                </thead>
                <tbody>
                <?php
                $table = $wpdb->prefix.'hr_holidays';

$result = $wpdb->get_results("select * from $table");

foreach ($result as $holiday_item){?>
<tr>
    <td><?php echo $holiday_item->holiday ;?></td>
    <td><?php echo $holiday_item->reason ;?></td>
</tr>
    <?php
}
?>
                </tbody>
            </table>

【问题讨论】:

  • 尝试返回选择查询的响应,看看它包含什么
  • 你可能需要使用:where holiday='$holiday'
  • @Gerard 是正确的,但这仍然会使您的代码容易受到 sql 注入的影响
  • @Gerard 我已经尝试过了,但是,ajax 仍然显示成功消息。我的意思是,它仍然显示添加成功消息的消息。我应该怎么做才能显示错误?会寻求帮助
  • var_dump($results) 然后在浏览器中按 f12,查看网络选项卡,看看 ajax 请求中显示了什么问题

标签: jquery mysql ajax wordpress


【解决方案1】:

要调试您的 sql 查询,请使用浏览器开发人员控制台中的网络选项卡并按 xhr 过滤,如上图所示

使用准备好的语句来处理你的 sql 注入漏洞

$results = $wpdb->get_results(
    $wpdb->prepare("select * from $table1 where holiday=%s",$holiday)
);
var_dump($results); // this will show in the xhr request as shown above

还要注意 xss 漏洞,永远不要相信用户输入!

<td><?php echo esc_html($holiday_item->holiday) ;?></td>
<td><?php echo esc_html($holiday_item->reason) ;?></td>

【讨论】:

  • 我按照上面的方法进行了更改,但我仍然没有在网络选项卡中看到任何错误。代码仍然像 ajax 调用一样给出成功函数。
【解决方案2】:

如果我正确理解了您的问题,那么您似乎不会将任何内容发送回 ajax 成功函数中的 data 参数。

尝试从你的函数文件中回显一些内容:

  ....
  echo 'success';
  return true;
} else {
  die();
  echo 'duplicate';
  return false;
}

比在成功函数中使用条件语句:

success: function(data) {
  if (data === 'success') {
    jQuery("#holiday-status").addClass("success");
    jQuery("#holiday-status").html( "New Holiday added " + date +" " + reason);
  }
}

【讨论】:

  • 你是对的,我确实尝试提醒发回的数据,但它是空的。然后在注释掉die(); 后添加echo 'success' ;。这样,数据将保存到数据库中,但页面上不会显示错误或成功通知。有什么建议吗?
  • 您是否尝试过控制台记录数据以查看返回的内容?如果不出意外,有时always() 方法有助于调试。 $.ajax(...).always(function(data) { console.log(data); })
  • 我做到了,结果是空的。这是输出代码。 &lt;pre class='xdebug-var-dump' dir='ltr'&gt; &lt;small&gt;E:\wamp64\www\wp-content\plugins\pluginname\includes\functions.php:722:&lt;/small&gt; &lt;b&gt;array&lt;/b&gt; &lt;i&gt;(size=0)&lt;/i&gt; &lt;i&gt;&lt;font color='#888a85'&gt;empty&lt;/font&gt;&lt;/i&gt; &lt;/pre&gt;success0 有什么线索吗?
  • 返回给$.ajax() 的数据是php回显的任何东西。无论是您明确回显的内容还是 php 回显的内容,例如警告或错误。我假设success 最后是您要发回的内容,因此您的代码中较早的部分与其余内容相呼应。我很难找到记录在哪里,但在这里提到:stackoverflow.com/questions/2410773/…
猜你喜欢
  • 2019-08-25
  • 2015-09-17
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多