Sql query triggered twice

时间:2019-03-21 作者:zgnky

我正在尝试从搜索框中收集数据。条件如果该值存在,请根据搜索次数更新计数器字段。

问题:在表单中搜索重复值时,计数器值会增加2而不是1。因此,如果其当前值为5,并且已再次搜索该术语,则数据库中的值将更新为7,而不是6。知道原因吗?

function content_filter( $where, $wp_query ){

    global $wpdb;
    if ( $search_term = $wp_query->get( \'search_prod_content\' ) ) {
        $where .= \' AND \' . $wpdb->posts . \'.post_content LIKE \\\'%\' . esc_sql(  $search_term  ) . \'%\\\'\';        

    }


    // first check if data exists with select query

    $datum = $wpdb->get_results("SELECT * FROM search_product WHERE TERM = \'".$search_term."\'");
    if($wpdb->num_rows > 0) {


    $sql = $wpdb->prepare(
    "UPDATE search_product SET COUNTER = COUNTER + 1  WHERE TERM = \'".$search_term."\'");

    $wpdb->query($sql);


    }
    // if not exist in the database then insert it
    else{

        $now = new DateTime();
        $datesent=$now->format(\'Y-m-d H:i:s\');  
        $sql = $wpdb->prepare(
         "INSERT INTO `search_product` (`TERM`,`DATE`) values (%s,%s)", 
          $search_term, $datesent);

        $wpdb->query($sql);
      }



    return $where;
}

3 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

尝试应用这些更改,将此条件添加到// first check if data exists with select query:

// Do nothing else if the search term is empty.
if ( empty( $search_term ) ) {
    return $where;
}
更新:您可能还想检查它是否是主查询,如果不是,请退出函数:

if ( empty( $search_term ) ||        // missing search term
    ! $wp_query->is_main_query() ) { // or not the main query
    return $where;
}
我不想这样做SELECT * (全选)记录使用$wpdb->get_results() 只是检查数据库中是否存在搜索项的现有条目。其次,你应该使用$wpdb->prepare() 而不是TERM = \'".$search_term."\'. 所以我要替换这个:

$datum = $wpdb->get_results("SELECT * FROM search_product WHERE TERM = \'".$search_term."\'");
if($wpdb->num_rows > 0) {
使用此选项:

$sql = $wpdb->prepare( "SELECT TERM FROM search_product WHERE TERM = %s LIMIT 1", $search_term );
if ( $wpdb->get_var( $sql ) ) {
在这段代码中,您应该没有使用TERM = \'".$search_term."\'. 所以我要替换这个:

$sql = $wpdb->prepare(
"UPDATE search_product SET COUNTER = COUNTER + 1  WHERE TERM = \'".$search_term."\'");
使用此选项:

$sql = $wpdb->prepare( "UPDATE search_product SET COUNTER = COUNTER + 1 WHERE TERM = %s", $search_term );
以及// if not exist in the database then insert it 可以重写为:

else {
    $wpdb->insert( \'search_product\', [
        \'TERM\'    => $search_term,
        \'DATE\'    => current_time( \'mysql\' ),
    //  \'COUNTER\' => 1, // <- uncomment if the default value of the column is not 1
    ] );
}

SO网友:Uranbold

您应该检查在您的网站中插入两次的搜索表单。这个答案可能很愚蠢,但你应该先检查一下。

SO网友:zgnky

问题已解决。非常感谢您在这方面的帮助。

附言:我发现另一篇关于这个主题的文章与预回迁有关。基本上,为了避免查询在页面上运行两次,人们提到要向函数中添加以下代码。php文件。

function remove_dns_prefetch($hints, $relation_type)
{
    if (\'dns-prefetch\' === $relation_type) {
        return array_diff(wp_dependencies_unique_hosts(), $hints);
    }
    return $hints;
}
另一个提示:当我在同一个浏览器上搜索同一个词时,计数器不会增加。然而,如果我隐姓埋名或使用其他浏览器搜索同一个词,那么计数器就会增加。

相关推荐

AJAX$wpdb不返回表数据

我正在使用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\