0

最近、コミックサイトにカスタムの好き嫌い機能を実装しました。「いいね」または「嫌い」ボタンを「クリック解除」することで、ユーザーが選択内容を「取り戻す」ことができるようにしたいと思います。

私の関数は次のように機能します:

1)ボタンの値(id ='like'またはid='dislike')をJquery経由でphpスクリプトに渡す

2)スクリプトは、最初に、指定されたコミックIDに対してデータベースにIPが存在するかどうかを確認します。存在しない場合は、ユーザーのIPと現在のコミックIDを挿入します。存在する場合は、元々「投票済み」と表示されます。 ..しかし、「嫌い」を実装するために、削除クエリを実行するだけにします

3)次に、そのコミックIDと増分の現在のいいねの合計を取得します。

ユーザーがもう一度ボタンを押すと、基本的に反対のクエリを実行します...そのコミックIDを指定して、そのユーザーの投票をテーブルから削除します...次に、コミック内のその画像のいいねの総数を減らします。テーブル。

だから私の質問は

1)ボタンを1回押すと挿入クエリを実行し、同じ選択を「選択解除」する場合は削除クエリを実行するのが、これを実装するための最良の方法ですか?ユーザーが「いいね」ボタンを押し続けることでデータベースをスパムし、過負荷にして、常に好き嫌いをすることができませんでしたか?そのIDに対してある種の$_SESSION['count']を実装する必要がありますか?

2)特定のIPを保存している場合...複数の一意のユーザーが同じコンピューターを使用している場合はどうなりますか...たとえばネットカフェ...常にそのユーザーのIPが保存されます。IPに対して保存するのが最善の方法ですか?

参照が必要な場合のコード:

<?php 
include 'dbconnect.php';
$site = $_GET['_site'];
$imgid = intval($_GET['_id']);
$input = $_GET['_choice'];

if ($site == "artwork") {
$table = "artwork";
}
else {
$table = "comics";
}

$check = "SELECT ip, tablename, imgid FROM votes WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND tablename = '$table' AND imgid = $imgid";
$result = $mysqli->query($check);

if ($result->num_rows == 0) { 
    //Insert voter's information into votes table
    $sql = "INSERT INTO 
            votes (ip, tablename, imgid) 
        VALUES 
            (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)
        ON DUPLICATE KEY UPDATE
            imgid = VALUES(imgid)";

        if (!$mysqli->query($sql)) printf("Error: %s\n", $mysqli->error); 

        /*while ($row = $result->fetch_assoc()) {
            echo "you've inserted: " . $row['ip'] . ", " . $row['tablename'] . ", " . $row['imgid'] . ".";
        }*/

        $result = $mysqli->query("SELECT like_count, dislike_count FROM $table WHERE id = $imgid"); 

        //put the counts into a list
        list($likes, $dislikes) = $result->fetch_array(MYSQLI_NUM);     

        if ($input == "like") {
            $sql = "UPDATE $table SET like_count = like_count + 1 WHERE id = $imgid";
            $mysqli->query($sql);           
            $likes++;
        }
        else if ($input == "dislike") {
            $sql = "UPDATE $table SET dislike_count = dislike_count + 1 WHERE id = $imgid";
            $mysqli->query($sql);
            $dislikes++;    
        }
    } 
else { //"unlike" their previous like for that given image id
        $sql = "DELETE FROM
                    votes 
                WHERE (ip, tablename, imgid) = 
                    (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)";

        if (!$mysqli->query($sql)) printf("Error: %s\n", $mysqli->error); 

        $result = $mysqli->query("SELECT like_count, dislike_count FROM $table WHERE id = $imgid"); 

        //put the counts into a list
        list($likes, $dislikes) = $result->fetch_array(MYSQLI_NUM);     

        if ($input == "like") { //remove like
            $sql = "UPDATE $table SET like_count = like_count - 1 WHERE id = $imgid";
            $mysqli->query($sql);           
            $likes--;
        }
        else if ($input == "dislike") {
            $sql = "UPDATE $table SET dislike_count = dislike_count - 1 WHERE id = $imgid";
            $mysqli->query($sql);
            $dislikes--;    
        }
}

echo "Likes: " . $likes . ", Dislikes: " . $dislikes;

mysqli_close($mysqli);

?>
4

1 に答える 1

1

1)はい、カウント機能を使用して、ボタンを連続して押すことができる試行回数を制限します。本当に高い数値に達しない限り、おそらくそれほど問題はないでしょう。単純なループでうまくいくと思います。

2)IPだけを保存するのではありません。IPやセッションCookieのように、識別子としてIPだけでなく、それが一意であるものを使用しようとします。ただし、サーバーを振り返ると、データベースからのエントリを解析する必要があります。またはおそらくMACアドレス。あなたがそれにアクセスできるかどうかはわかりません。PHPで接続されたクライアントのMACとIPアドレスを取得するにはどうすればよいですか?

別の方法があると確信していますが、概念的にはそれが機能していると思います。

于 2013-02-22T15:32:42.633 に答える