AJAX无法正确使用WordPress数据库

时间:2015-10-14 作者:user80946

我创建了一个简单的like系统,用户可以单击like按钮,like计数将增加一。如果他已经喜欢这个按钮,并且他再次喜欢这个按钮,那么它将减少like计数。就像脸书一样。

下面是一个添加或删除like计数的函数。(此代码将从wordpress ajax系统调用)

function like_process(){
    global $wpdb;

    verify_nonce($_POST[\'nonce\'],"like_system");
    $id = intval( $_POST[\'Post_ID\'] );
    $like_the_post = intval( $_POST[\'like_the_post\'] );

    $userid=get_current_user_id();

    $like_count = $wpdb ->get_row( "SELECT likes FROM {$wpdb->prefix}likes_counter WHERE post_id = \'$id\'" , ARRAY_N );

    $like_count=do_if_like_is_less_than_0($like_count);

    if( $like_count == null ) :
        $wpdb ->insert (\'wp_likes_counter\' ,array(\'post_id\' => $id ,\'likes\' => 1,"ip_address"=>get_client_ip(),"user_id"=>$userid,"like_time"=>time()),array(\'%d\' ,\'%d\',\'%s\',\'%d\',"%d"));
    die("added");
    else:
        if($like_the_post==true):
            $wpdb ->update (\'wp_likes_counter\' ,array(\'post_id\' => $id ,\'likes\' => $like_count["0"]+1,"ip_address"=>get_client_ip(),"user_id"=>$userid,"like_time"=>time()),array(\'post_id\' => $id ), array(\'%d\' ,\'%d\',\'%s\',\'%d\',"%d"),array( \'%d\'));
        die("added");
        else:
            $wpdb ->update (\'wp_likes_counter\' ,array(\'post_id\' => $id ,\'likes\' => $like_count["0"]-1,"ip_address"=>get_client_ip(),"user_id"=>$userid,"like_time"=>time()),array(\'post_id\' => $id ), array(\'%d\' ,\'%d\',\'%s\',\'%d\',"%d"),array( \'%d\' ) );
        die("removed");
        endif;
    endif;
die(\'nothing happened!!!\');
}
假设我们有类似计数5。如果新用户单击like按钮,则计数将为6。如果他喜欢巴顿,计数将是5。因此,当用户反复单击like按钮时,计数将在5和6之间切换。这就是我们所期望的。

像这样:

enter image description here

问题是,如果用户快速单击按钮。每秒说3-4次,则计数不会在5到6之间切换。有时是8,有时是3。就像这个截图enter image description here为什么会这样。

我们甚至不能责怪ajax,因为他们完全是客户端,客户端可以做任何他们想做的事情,不是吗?那么php代码有什么问题呢。。

挖掘了几个小时,但仍然没有解决方案和解决方法:(

1 个回复
SO网友:Aric Watson

我认为你的问题在于:

$like_the_post = intval( $_POST[\'like_the_post\'] );

您依赖用户浏览器的POST输入来确定是增加还是减少计数。当用户快速单击按钮时,AJAX调用尚未完成,表单输入从true更改为false(反之亦然)。此外,这种方法很容易被脚本重复命中AJAX脚本并将该值设置为“true”的脚本所垃圾邮件,从而人为夸大帖子上的“赞”。

由于当有人单击按钮时,您似乎正在跟踪用户id,因此我建议更改AJAX代码,以便首先检查用户是否已经有该post\\u id的记录-如果没有,则增加计数器,如果有,则减少计数器。

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请