0

I've recently implemented a custom liking and disliking feature for my comics site. I'd like to give users the ability to "Take back" their selection by "unclicking" the like or dislike button.

My function works by:

1) Passing button value (id = 'like' or id = 'dislike') via Jquery to php script

2) script will first check if an ip exists in the database against that given comic id... if not it will insert user's IP and current comic ID... if it does, it originally said "you've already voted"... but now to implement "unliking", I will just have it run a delete query

3) then it will get total current likes for that comic id and increment.

The way I think it can be done is if the user presses the button again, I basically run the opposite query... delete that user's vote from the table given that comic id... then decrement total likes for that image in the comics table.

So my questions are,

1) Is doing an insert query if they press a button once, then a delete query if they "deselect" that same choice the best way to implement this? Couldn't a user spam and overload the database by continuously pressing the like button, thereby constantly liking and unliking? Should I just implement some sort of $_SESSION['count'] for that ID?

2) If I'm storing a certain IP... what happens if several uniques users happen to use the same computer at... let's say a netcafe... it will always store that user's IP. Is storing against the IP the best way to go?

Code if you need a reference:

<?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);

?>
user3871
  • 12,432
  • 33
  • 128
  • 268

1 Answers1

1

1) I would say yes, use a count feature to limit the number of attempts they can hit the button in succession. Probably wouldn't have much trouble unless they hit really high numbers, I believe a simple loop would do fine.

2) I would not store just the IP. I would try and use something more than just the IP as an Identifier, like the IP and the session cookie - that way it's unique. However on the look back to the server you would have to parse the entry from the db. Or perhaps the mac address. I'm not sure if you have access to that or not. How can I get the MAC and the IP address of a connected client in PHP?

I'm sure there's another way but conceptually that's how I see it working.

Community
  • 1
  • 1
Hituptony
  • 2,740
  • 3
  • 22
  • 44