Op mijn website staan er afbeeldingen. Het is de bedoeling dat elke bezoeker 1 keerkan stemmen op elke afbeelding, om dit te bekomen maak ik gebruik van een cookie met een id uniek aan de afbeelding.
Is dit de corecte manier? Want bij 100 afbeeldingen kan ik dus wel 100 cookies hebben ...

Ik zou graag hebben dat de stem knop verdwijnt na het stemmen, maar dit gebeurd pas nadat ik de pagina refresh en niet meteen. Hoe los ik dit op?

Mijn code:

<?php

// Debugging
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);

// Connection with database
$conn = new mysqli('localhost', '', '', '');

// Unieke afbeeldingsid ophalen
$id=$_GET["id"];
$sql1 = "SELECT * FROM designs WHERE id='$id'";
$result1 = mysqli_query($conn,$sql1);
$row1 = mysqli_fetch_assoc($result1);

// Unieke cookienaam op basis van id
$cookiename="voted".$id;

// Als gestemd is geweest voeg een extra stem toe
if ($_SERVER['REQUEST_METHOD'] == 'POST' AND !isset($_COOKIE["$cookiename"])) {
$row1["votes"]++;
$votes=$row1["votes"];
$result2 = $conn->query("UPDATE designs SET votes=$votes WHERE id='$id'");
setcookie("$cookiename", "yes", 2147483647);
}
?>

<!-- Including header -->
<?php include($_SERVER['DOCUMENT_ROOT'].'/header.php'); ?>
<h2>Design #<?php echo $row1["id"]; ?></h2>

<img src="<?php echo $row1["image"]; ?>" id="bigimg">
<br/>
<form method="POST" action="">
<span id="upvotes"><?php echo $row1["votes"]; ?></span>
<?php
if(!isset($_COOKIE["$cookiename"])) {
?>
<input type="submit" name="submit" class="button" id="upvote" value="Upvote this design">
<?php
}
?>
</form>
<!-- Including footer -->
<?php include($_SERVER['DOCUMENT_ROOT'].'/footer.php');?>
Maar als je jouw cookie verwijdert, dan is jouw identiteit op de site ook weg. En dus kan je weer opnieuw gaan stemmen. Keer op keer....

Daarom lijkt mij de enige betrouwbare oplossing het aanmaken van een account. En daar houd je serverside bij wie gestemd (geupvoted heeft) voor welk design. Dan heb je eigenlijk helemaal geen cookeis meer nodig voor het stem-proces. Hoogstens voor je inlog-sessie.

Als je je een vote gedaan hebt, zorg je met JavaScript ervoor dat de knop onbruikbaar wordt. Na een refresh haal je dat serverside weer op.
In dat geval om je op weg te helpen:


Alle votes voor 1 token opvragen:

select i.id, i.filename, v.rating from votes v
join images i on v.image_id = i.id
join cookies c on v.cookie_id = c.id
where c.token = '123456789'


Gemiddelde score voor alle foto's:

select i.filename, AVG(v.rating) as rating from images i
left join votes v on v.image_id = i.id
group by i.id


Gemiddelde score voor 1 foto:

select i.filename, AVG(v.rating) as rating from images i
left join votes v on v.image_id = 123


[size=xsmall]Toevoeging op 01/05/2017 14:03:19:[/size]

- Ariën - op 01/05/2017 13:41:51

Maar als je jouw cookie verwijdert, dan is jouw identiteit op de site ook weg. En dus kan je weer opnieuw gaan stemmen. Keer op keer....

Daarom lijkt mij de enige betrouwbare oplossing het aanmaken van een account. En daar houd je serverside bij wie gestemd (geupvoted heeft) voor welk design. Dan heb je eigenlijk helemaal geen cookeis meer nodig voor het stem-proces. Hoogstens voor je inlog-sessie.

Als je je een vote gedaan hebt, zorg je met JavaScript ervoor dat de knop onbruikbaar wordt. Na een refresh haal je dat serverside weer op.


Ja je moet heel bewust kiezen voor het een of voor het ander. Maar hoe spannend is het? Hangt er een prijsvraag aan?

Je kunt nog met een facebook en/of google api werken waardoor men met facebook of google kan inloggen. Maar ook met een user account kun je niet voorkomen dat mensen een tweede account aanmaken en nog een keertje op dezelfde foto voten.

Als mensen moeten gaan registreren om een vote te plaatsen zullen ze waarschijnlijk snel afhaken.

Allemaal voors en tegens... Kies wat het beste past.

Reageren