2016-06-13 2 views
1

私はあなたがページにコメントを投稿して他のコメントに投票することができるサイトを構築していますが、匿名であり、ユーザーログインはまったくありません。ユーザーのログインなしでIPアドレスごとに1回機能を制限します

私はすでにコメント評価システムを導入していますが、現在のところ、ハートのコンテンツにコメントを繰り返すだけで誰かが止まることはありません。

一度投票すれば、それだけです。あなたはそれに戻ってくることはできません、そしてあなたはその同じ投稿に再び投票することはできません。

はここに私のrateup.phpファイル、例です:

<?php 
include("config.php"); 

$post_id = $_GET['id']; 

// Connection to database 
$connection=mysqli_connect("$servername","$username","$password","$dbname"); 
// Check connection 
if (mysqli_connect_errno()) { 
    echo 'oops'; 
    //echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

// Increasing the current value with 1 

mysqli_query($connection,"UPDATE $tablename SET upvotes = (upvotes + 1) WHERE id = $post_id"); 
mysqli_close($connection); 

echo 'done'; ?> 

は正直なところ、私もこの問題を説明する方法を考えて苦労していました。

ありがとうございました!

+0

私の推測では、あなたがする必要があります列を別のテーブルに投票記録を維持する必要がありますですIPアドレス(投票に使用されたユーザー)を保管します。 1つのポストに対して1つの票から1つの票のみを許可する必要があります。 例: post_id |投票| IP 1 | 1 | 108.1.1.1 1 | 1 | 108.1.2.1 –

+0

ログインしていない場合は、どのようにして誰が誰を追跡していますか? – Strawberry

+0

それは本当に必要はありません、それは匿名であるはずです。私はまだIPをログに記録していますが、この目的のためだけです。投稿が削除されると削除されます。 – Treedot

答えて

1

私は自分のプロジェクトで同様のことをしました。

このようテーブルを作成します - この表の今

comment_id IP 

、 "upvotes" を格納します。だから、もし127.0.0.1というIPでの使用がコメントID 456でコメントをアップアップした場合、その行を追加するとします。

クリックするたびにajaxリクエストをバインドします(upvoteボタン)。誰かが "upvote"を実行するとすぐに、リクエストはajaxハンドラページにコメントIDとともに送られます。このページでは、このデータを使用してユーザーのIPとクエリを取得し、レコードがあるかどうかを確認します。

SELECT COUNT(*) as total from table where comment_id = ? AND IP = ? 

total場合は、それがない場合、ユーザは、第二の投票をしようとしていることを意味、ある投票は合法であり、あなたが進みます。

+0

申し訳ありませんが、私はこれらのIPを別のテーブルに格納することを考えていませんでした。私はこれでいくつかのことを試してみるつもりです。私はPHPとMySQLにはかなり新しく、これは私が単独で試みている最初のプロジェクトです。 – Treedot

+0

これは本当にとても簡単です。それを試してみてください、あなたはいつも助けを求めることができます! – Akshay

+0

これをif文としてどのようにフォーマットできますか?私はこれを私のrateup.phpファイルに入れなければならないと仮定しているので、IPがすでにその投稿に投票しているかどうかをチェックし、そうでなければ評価してテーブルに追加します。 – Treedot

0

コンテンツを追加/変更したユーザー名ではなく、ユーザーのIPとブラウザの指紋情報をデータベーステーブルに保存する必要があります。したがって、例えばupvotesテーブルを持っている場合、スキーマは次のようになります。

commentid, text, creation_date, created_by 

created_byフィールドは、ユーザーのIPアドレスです。また、訪問者を一意に識別するのに役立つ$ _REQUESTからいくつかの変数を保存することもできます。

通常、ユーザは動的IPとNATファイアウォールの背後に座っているため、これらの措置はすべて偽りのないものであるため、IPが頻繁に変更される可能性があります。

希望に役立ちます。

0

各投票のためにあなたのIPアドレスを保存するための新しいテーブルを作成します。

CREATE TABLE IP_post_votes (
    post_id INT 
    ip varchar(15) 
); 

、あなたはupvoteテーブルを更新するたびに、あなたはIP_post_votesテーブルにIPSをチェックし、存在していない場合は挿入し、でなければなりませんトランザクション。また、WHERE NOT EXISTS句は、データを更新するために、1つのカウントデータのクエリや他よりも最高のパフォーマンスを得られます:

mysqli_begin_transaction($connection); 
mysqli_query($connection,"UPDATE $tablename SET upvotes = (upvotes + 1) WHERE id = $post_id AND NOT EXISTS (SELECT 1 FROM IP_post_votes where IP = $ip and post_id = $post_id)"); 

if(mysqli_affected_rows() > 0) { 
    $insert = mysqli_query($connection,"INSERT INTO IP_post_votes values($post_id, $ip)"); 
    $insert ? 
     mysqli_commit($connection): 
     mysqli_rollback($connection); 
} else { 
    mysqli_rollback($connection); 
} 
+0

私は上記の答えを働かせることができなかったのでこれを試しています、私は '致命的なエラーを出しています:未定義の関数mysqli_begin_transaction ' – Treedot

+0

ああ、おそらく' mysql_begin_transaction() 'がPHP 5.5まで存在せず、私が5.2を実行していて、それを変更する方法がないからでしょう。回避策はありますか? – Treedot

関連する問題