0

私は自分のウェブサイト用にシンプルなようなシステムを構築しています。問題は、jquery の投稿が本来の動作をしていないことです。

データベース テーブルに値が挿入されておらず、success 関数も機能していません。

すべてのデータベース テーブルは既に設定されています。

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: オブジェクトは以下の例のようにキーと値のペア表記にする必要があります...

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

わかりました、賢者がかつて言ったように RTM. どちらの方法でも機能することがわかりました。

Jqueryのドキュメントから...

データ オプションには、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);
});

注:これは、googlechromeやfirebugを使用したfirefoxなどのデバッグコンソールを提供するブラウザで行う必要があります。

リクエストを調べて、それが得られた場合500は、PHPが失敗していることを意味し、Javascriptとは別にphpをデバッグする必要があります。

console.log(arguments)が言う場合、parseErrorphpは余分な文字を返し、それを実行しているechoステートメントを検索/削除する必要があります(同じ.phpファイルではない可能性があります)。または、"text"何であるかを気にしないため、dataTypeをに変更できます。とにかく戻った。

于 2012-10-28T17:57:00.793 に答える