0

我正在为我的网站构建一个简单的类似系统。问题是,jquery 帖子没有按照它应该做的工作。

数据库表上没有插入任何值,并且成功功能也不起作用..

所有数据库表都已设置好。

HTML:

<a href="javascript:like('85','17','product','1','3');" class="button like_click"><span><img src="wp-content/plugins/assets/images/icons/like-icon.png"> Like </span></a>

这是我的 jQuery。

function like(blog_id,object_id,object_type,user_id,default_count)
{

    jQuery.ajax({
        url: '/wp-content/plugins/assets/like.php',
        type: 'post',
        data: 'object_id=' + object_id + '&user_id=' + user_id + '&type=like&blog_id=' + blog_id + '&object_type=' + object_type,
        dataType: json,
        success: function(data)
        {
             jQuery('#' + object_id + '_count').html(data.total);
             jQuery('.like_click').attr('href','javascript:unlike(\'' + blog_id + '\',\'' + object_id + '\',\'' + user_id + '\',\'' + object_type + '\',\'' + default_count + '\')');
             jQuery('.like_click span').html('<img src="/wp-content/plugins/assets/images/icons/unlike-icon.png"> Unlike');
             jQuery('.likes').html('You and <a href="#">'  + default_count + ' others</a> like this.');
        }
    });

}

like.php

<?php
// include wordpress functions
include( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php');
require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-admin/includes/plugin.php' );
global $wpdb;
$global_likes = $wpdb->base_prefix . "global_likes";
$global_table = $wpdb->base_prefix . "global_products_table";

$object_id = mysql_real_escape_string($_POST['object_id']);
$user_id = mysql_real_escape_string($_POST['user_id']);
$blog_id = mysql_real_escape_string($_POST['blog_id']);
$object_type = mysql_real_escape_string($_POST['object_type']);
$type = mysql_real_escape_string($_POST['type']);

$check_duplicate = $wpdb->get_row("SELECT object_id FROM ".$global_likes." WHERE object_type = '" .$object_type . "' and object_id = '".$object_id."' and blog_id = '" . $blog_id . "' and user_id = '" . $user_id . "' ");
if( empty($check_duplicate->object_id) && isset($_POST['object_id']) && isset($_POST['user_id']) && isset($_POST['blog_id']) && isset($_POST['object_type']) ) {

 if( $type == "like" ) {

    $wpdb->insert( 
    $global_likes, 
    array( 
        'user_id' => $user_id, 
        'blog_id' => $blog_id, 
        'object_id' => $object_id, 
        'object_type' => $object_type
    )
    );

    $add_like = "UPDATE " . $global_table . " SET likes=likes+1 WHERE products_id = '".$object_id."' and blog_id = '" . $blog_id . "'";
    $wpdb->query($add_like);

 } elseif( $type == "unlike" ) {
    $remove_like = "UPDATE " . $global_table . " SET likes=likes-1 WHERE products_id = '".$object_id."' and blog_id = '" . $blog_id . "'";
    $delete_user_like = "DELETE FROM ".$global_likes." WHERE object_type = '" .$object_type . "' and object_id = '".$object_id."' and blog_id = '" . $blog_id . "' and user_id = '" . $user_id . "'";
    $wpdb->query($remove_like);
    $wpdb->query($delete_user_like);
 }

 $sql = mysql_fetch_assoc(mysql_query("SELECT likes FROM ".$global_table." WHERE products_id = '".$object_id."' and blog_id = '" . $blog_id . "'"));

 echo json_encode(array('total' => $sql[0]['likes']));

} else {
  wp_die('Error!');
}

?>

是否也可以只发布而不返回任何值,以便我可以删除以下脚本like.php

 $sql = mysql_fetch_assoc(mysql_query("SELECT likes FROM ".$global_table." WHERE products_id = '".$object_id."' and blog_id = '" . $blog_id . "'"));

 echo json_encode(array('total' => $sql[0]['likes']));

原因是,我已经有了一个自动获取点赞数的功能。

请帮忙。

4

2 回答 2

2

您的 ajax 方法中的数据不是 json,但您将类型指定为 json。

编辑以下评论: dataType 用于预期的返回数据,但 data: object 应采用键值对表示法,如下例所示...

data: { object_id: object_id, user_id: user_id, type: 'like', blog_id: blog_id, object_type: object_type }

好的,正如一位智者曾经说过的 RTM。事实证明,这两种方法都有效。

从 Jquery 文档...

data 选项可以包含 key1=value1&key2=value2 形式的查询字符串,或 {key1: 'value1', key2: 'value2'} 形式的映射。如果使用后一种形式,则数据在发送之前使用 jQuery.param() 转换为查询字符串。可以通过将 processData 设置为 false 来规避此处理。如果您希望将 XML 对象发送到服务器,则该处理可能是不可取的;在这种情况下,将 contentType 选项从 application/x-www-form-urlencoded 更改为更合适的 MIME 类型。

这意味着,尽管有赞成票,但这个答案根本无助于解决您的问题,它只是一种语法替代方案。

于 2012-10-28T15:26:15.393 回答
0

如果您不需要脚本的任何输出,只需使用echo "{}";然后不对 javascript 中的响应执行任何操作。我在您的代码中看到的唯一错误是dataType: json,但据说您已经修复了该错误。

如果您的代码不起作用,请在您的 ajax 调用之后添加此代码以提供调试信息:

jQuery.ajax({...}).fail(function(){
    console.log(arguments);
});

注意:您应该使用提供调试控制台的浏览器来执行此操作,例如带有 firebug 的 google chrome 或 firefox。

如果您检查您的请求并且您得到500这意味着您的 PHP 失败了,您需要将您的 php 与 Javascript 分开调试。

如果console.log(arguments)parseError,您的 php 正在返回额外的字符,您需要查找/删除正在执行此操作的 echo 语句(它可能不是相同的 .php 文件),或者您可以将 dataType 更改为,"text"因为您不在乎是什么反正回来了。

于 2012-10-28T17:57:00.793 回答