2012-11-01 21 views
2

我的朋友和我正在創建一個請願板,並且我正在添加一個喜歡/不喜歡的功能。我打算這樣做,只有用戶可以喜歡/不喜歡它。問題是,我不知道如何確保用戶不會多次垃圾按鈕以及如何註冊哪個用戶喜歡/不喜歡哪個主題。以下是我的代碼到目前爲止。確保用戶不會像「like」按鈕

編輯:謝謝我現在正在創建喜歡/不喜歡的表。但現在我必須將用戶與數據庫進行比較,看看他們以前是否喜歡評論。我知道我必須使用WHERE(檢查喜歡和不喜歡錶),但我不知道如何將它與IF結合起來。

<?php 
include connect.php 

if (isset($_POST['like']) || isset($_POST['dislike'])) 
{ 
    if($_SESSION['signed_in']){ 
     if (isset($_POST['like'])) { 
      $sql="UPDATE 
        topics 
       SET 
        likes=likes+1, 
       WHERE 
        id=topic_id"; 

      echo "You liked it"; 
     } 

     elseif (isset($_POST['dislike'])) { 
      $sql="UPDATE 
        topics 
       SET 
        dislikes=dislikes+1, 
       WHERE 
        id=topic_id"; 

      echo "You disliked it"; 
     } 
    } 
    else{ 
     echo 'Please log in.' 
} 

?> 
+0

爲什麼不使用Facebook like按鈕。只是一個想法。它會照顧垃圾郵件問題。 –

+0

這是一個不容易解決的複雜問題。 *確定*它不會被垃圾郵件的唯一方法是強制用戶在他們喜歡之前登錄。即使您在單個設備上阻止多張選票(比聽起來難),如果我在我的計算機上訪問它,然後是我的筆記本電腦,然後是我的電話,然後是我的平板電腦,然後是我兒子的電腦......我只投了5票次... –

+2

@cale_b基於問題和代碼,強制用戶登錄已經是一項要求,並且OP有技術實現問題 – eis

回答

5

你應該有一張「喜歡」的表格,並且包含以下列。

「的article_id」, 「USER_ID」,主鍵應該包含兩列

每當用戶喜歡的文章,INSERT INTO喜歡VALUES($ article_id的,$ USER_ID); 如果有人喜歡兩次,這要歸功於主鍵。

每次用戶不喜歡時,DELETE FROM like WHERE article_id = $ article_id和user_id = $ user_id。如果他願意,這將允許用戶再次喜歡。

要獲得文章的喜歡數量,請運行SELECT COUNT(*)作爲nb_of_likes FROM likes WHERE article_id = $ article_id,而不是將該數字存儲在文章表中。

有意義嗎?

+2

我不會從數據庫中刪除任何內容。製作三列:'article_id','user_id'和'like'。如果他們喜歡某事,請將'like'列更新爲'1'。如果他們不喜歡它,請將其更改爲「0」。 – sgroves

+0

(S)如果他想跟蹤不喜歡的事情,他的確可以做到這一點。 – Bgi

+1

,因爲主鍵的唯一限定符是確保防止重複的原因,所以需要與此答案不同的方法。另外,由於沒有收集其他數據,刪除是一個首選的解決方案,原因有兩個:1.大約同一時間在數據庫中刪除更新。 2.減少桌上的膨脹。 - 這是假設它具有類似Facebook的行爲......喜歡與否,不喜歡。 – NappingRabbit

0

以下解決方案是可能的,這可以一起使用:

  • 如果使用註冊/登錄機制,則可以在內部設置一些計數機構,以便每個用戶可以像一次每請願(如BGI建議)。
  • 你可以存儲一個cookie,防止他進一步喜歡,即使他創建了一個新用戶。
  • 當然,人們可以刪除cookie或使用其他瀏覽器,因此您可以使用例如md5並比較散列,如果該散列已經在使用請願書。
  • 當然,多人可以共享相同的IP,因此IP哈希可能並不總是一個好的解決方案。或者,您可以使用Facebook API,並要求人們擁有一定數量的朋友或其他東西以驗證其身份。

你永遠無法完全擺脫垃圾郵件發送者,取決於你的請願具體是什麼。因此,越想阻止利用請願書,就越不會匿名。