最近、コミックサイトにカスタムの好き嫌い機能を実装しました。「いいね」または「嫌い」ボタンを「クリック解除」することで、ユーザーが選択内容を「取り戻す」ことができるようにしたいと思います。
私の関数は次のように機能します:
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);
?>