2011-11-08 14 views
0

ウェブ上のどこかで、ブログ記事の基本的な「好き」のスクリプトがあるサイトを見ました。PHP/JSでクッキーを使って投票を保存する方法

私はそれを複製しようとしています、私はちょっと混乱しています。ここではフロントエンドのために私が持っているコード

Javascriptが、ここで

.like-count .icon { 
    background-position: 0 -19px; 
    width: 13px; 
    height: 11px; 
    float: left; 
    margin: 4px 5px 0 0; 
} 

.like-count a:hover .icon, 
.like-count a.active .icon { background-position: -15px -19px; } 

.like-count, 
.edit-post, 
.comment-count { 
    float: right; 
    margin: 0 0 0 10px; 
} 

<li class="like-count"> 
    <a href="#" class="likeThis active" id="like-356"> 
     <span class="count"><span class="icon"></span> 
     <span class="count">397</span></span> 
    </a> 
</li> 

は、私がこれまでに...

my_likeInit()収集したものですjqueryの

jQuery(document).ready(function() { 

function my_reloadLikes(who) { 
    var text = jQuery("#" + who).html(); 
    var patt= /(\d)+/; 

    var num = patt.exec(text); 
    num[0]++; 
    text = text.replace(patt,num[0]); 
    jQuery("#" + who).html('<span class="count">' + text + '</span>'); 
} //reloadLikes 


function my_likeInit() { 
    jQuery(".likeThis").click(function() { 
     var classes = jQuery(this).attr("class"); 
     classes = classes.split(" "); 

     if(classes[1] == "active") { 
      return false; 
     } 
     var classes = jQuery(this).addClass("active"); 
     var id = jQuery(this).attr("id"); 
     id = id.split("like-"); 
     jQuery.ajax({ 
      type: "POST", 
      url: "index.php", 
      data: "likepost=" + id[1], 
      success: my_reloadLikes("like-" + id[1]) 
     }); 


     return false; 
    }); 
} 

my_likeInit(); 

}); 

HTMLを必要としています機能

  • 「が表示されているか
  • が接続アクティブ」クラス「スペースは、それがあるかどうかを確認するために をチェックしている」.likeThisの変数
  • スプリット値にlikeThisクラスを保存します.likeThisクラスにイベントをクリックしてくださいそれか
  • .activeが発見された場合、これはalreadない場合
  • ため を気に入っ/投票されたとして、それは死ぬ、それは.likeThis
  • に.activeクラスを追加し、それは、ID = like-を取得123number
  • 「like-」部分を分割して数字「」を取得します。
  • としてPHPスクリプトにID番号を送信する "のように、NUMBERHERE

を「AJAX要求から成功likepost = NUM​​BERHERE

  • 、その値を渡し、my_reloadLikes() 機能を実行します"私はそれに入るが、あなたが見ることができる、それはID番号と によってdiv要素は番号を追加見つけ、
  • ページ番号を更新習慣my_reloadLikes()関数

      私はこれを取得ネット/ XHRの下で、放火犯を実行し、

      リクエストヘッダ
      POST: likepost=811//このケースでは、私はID 811 w3tc_referrer=http%3A%2F%2Ftest.testdomain.com%2F%3Ftheme%3Dtest; 795=795; 835=835; 832=832に投票するためにクリックしたこれは、ある種のです私が投票したすべてのもののIDを保存するように見えるクッキーが設定されています。

      レスポンスヘッダここで Set-Cookie 811=811; expires=Sat, 13-Jan-2807 11:04:20 GMT; path=/私はidが決定的クッキーに保存されて見ることができます。私には、これはOWNのクッキーだと思われますが、それよりも上にあるとクッキーに複数の値が表示されるので、最後に追加されますか?私が上記で投票したそれらのIDはすべて同じページにありました。おそらく1ページあたり1つのCookie、うまくいけばサイトあたり1つだけです...


      は、だから、私の知る限りだようですが、私は基本的に、コードを解剖してきたと私は完全に私の頭の外にされるバックエンドに今、上記のすべてを理解し、私は

      を助ける必要がある場所

      [OK]ページが読み込まれたら、私はMySQLデータベースから同様の値を入力します。値を追加してこのスクリプトの値を取得するバックエンドを行う方法を知っています。クッキー部分は私がちょっと混乱している部分です。

      私はちょうど別のテストをしましたが、今はスクリプトで別々のクッキーに保存されていますので、100個のアイテムに投票すればそのサイトのCookieは100個あります。

      良い方法がありますか?クッキーは、既に投票しているかどうかを確認し、クッキーがクリアされるまで私が再び投票するのを防ぎます。これは、ユーザーがログインしないように、ワードプレスのブログに載っているので、クッキーやIPアドレスの他にたくさんのオプションはありません。

      質問

      1. は、私が投票している項目を追跡するために良い方法はあります/各項目のクッキーの代わりに言っていますか?
      2. いくつかのサンプルPHPコードでクッキーをチェックするので、すでに投票されているアイテムに「アクティブ」クラスを追加することができます(クッキーを持っている場合に基づいて)
      3. WordPressのブログでは、 POSTをindex.php?likepost = 1234にするか、単に別のURIページに投稿して、DB接続を手動で行うのではなく、Wordpressのものを利用するのがいいですか?

      ========= クッキーの問題についての洞察をいただき、ありがとうございます。

    +2

    #1に答えるために、シリアル化は複数のデータエントリを1つのエンティティに格納するのに最適な方法です。 http://api.jquery.com/serializeArray/。しかし、私はクッキーを使用してこれをしません - 彼らは簡単にユーザーが変更し、あなたのロジックをねじ込むことができます。 – nickb

    +0

    あなたはどうやってお勧めしますか? DBに保管していますか? – JasonDavis

    +0

    DBにvote/likesを格納することをお勧めします。これは論理的な方法です。ご存じのようにクッキーはクライアント側です。ユーザーが投票したかどうかは、DBから確認する必要があります。 – onatm

    答えて

    1

    はい、間違いなくデータベースで行います。私が以前に言ったように、クッキーは変更され、実際にあなたのロジックを台無しにする可能性があります。

    ------------------------------- 
    |   likes   | 
    ------------------------------- 
    | like_id | post_id | user_id | 
    ------------------------------- 
    

    like_idに主キー(自動インクリメント)を作成しますので、あなたは簡単に行を削除することができます。簡単なデータベーステーブルを作成します。次に、post_id, user_idUNIQUEインデックスを作成します。これにより、ユーザーがデータベースレベルで同じ投稿を複数回好きにすることは不可能であるため、データの並行性が向上します。

    ただし、ご希望の場合はlike_idを省略することができます。それは必要ではなく、すべてあなたの好みに合わせます。

    これで、必要な情報をすべて照会できます。 、ポストのための同類の数を言う:

    SELECT COUNT(*) FROM likes WHERE post_id = $post_id 
    

    またはユーザーがこの記事を気に入っているか否かを判断する。

    SELECT like_id FROM likes WHERE post_id = $post_id AND user_id = $user_id 
    

    ご質問の残りの部分に対処するために:

    1. 前述したように、シリアライゼーションは、複数のエントリを1つのエンティティに格納する一般的な方法です。基本的には、オブジェクト(または配列)の状態を後で復元できるように保存しています。ただし、DBを使用する場合は、JS配列/オブジェクトをシリアル化する必要はありませんが、便利なことを知っておくとよいでしょう。
    2. データベースからのクエリに基づいてアクティブなクラスを追加します(上記を参照)。
    3. 必ずPOSTをindex.php?likepost = 1234にしてください。これにより、WordPressが提供するアプリケーションへの単一のエントリポイントが維持されます。これの利点は明らかです - WordPressにDBへの接続を設定させ、ホイールを再構築するのではなく必要なすべての機能を提供しましょう。
    +0

    ヒントをありがとう、私の主な理由は、user_idがないため、すべての視聴者はゲストなので、唯一の方法はあなたが知っているようにIPを使用することです。 – JasonDavis

    +0

    そのようにして、ゲストだけにクッキーを使用し、好みのものがデータベースに影響を与えないようにしてください。その後、クッキーを混乱させると誰が気にしますが、彼らは彼らの側にあるディスプレイをつまむだけです。クッキーがユーザによって変更されていないと信じることのできないクッキー部分を作成するときは、覚えておいてください。 – nickb

    関連する問題