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');?>
Weet dat er cookie al over de lijn gaat bij het laden van een website. 100 cookies per pagina is excessief veel.

Daarnaast zijn cookies pas geldig na een refresh van de website.

php.net/setcookie:
Once the cookies have been set, they can be accessed on the next page load with the $_COOKIE array.


Ik denk dat Sessions meer in de juiste richting komt.
- Ariën - op 01/05/2017 12:35:30

Weet dat er cookie al over de lijn gaat bij het laden van een website. 100 cookies per pagina is excessief veel.

Daarnaast zijn cookies pas geldig na een refresh van de website.

php.net/setcookie:
Once the cookies have been set, they can be accessed on the next page load with the $_COOKIE array.


Ik denk dat Sessions meer in de juiste richting komt.


Het zou wel slechts gaan om 1 cookie per pagina, gezien elke afbeelding een aparte pagina heeft. Maar het zou dus wel 100en cookies voor de website in zijn geheel zijn.

Hoe zou ik mijn probleem dan kunnen oplossen?
>> Het zou wel slechts gaan om 1 cookie per pagina, gezien elke afbeelding een aparte pagina heeft. Maar het zou dus wel 100en cookies voor de website in zijn geheel zijn.
Chrome ondersteunt maximaal 180 cookies per domein, en dat is al een gigantische hoeveelheid. De meeste browsers gaan niet verder dan 50. Dit zul je dus echt anders moeten oplossen.
Mensen laten registreren en inloggen als het stemmen per persoon gaat. Cookies kan je aanpassen/verwijderen en sessies worden ook standaard weer verwijderd na het sluiten van de browser.

Op IP bijhouden is ook geen optie omdat er vaak netwerken zijn achter één IP-adres.
Ben van Velzen op 01/05/2017 12:47:37

>> Het zou wel slechts gaan om 1 cookie per pagina, gezien elke afbeelding een aparte pagina heeft. Maar het zou dus wel 100en cookies voor de website in zijn geheel zijn.
Chrome ondersteunt maximaal 180 cookies per domein, en dat is al een gigantische hoeveelheid. De meeste browsers gaan niet verder dan 50. Dit zul je dus echt anders moeten oplossen.

Hmmm, dan ga ik inderdaad voor een andere oplossing moeten kijken.

- Ariën - op 01/05/2017 12:51:03

Mensen laten registreren en inloggen als het stemmen per persoon gaat. Cookies kan je aanpassen/verwijderen en sessies worden ook standaard weer verwijderd na het sluiten van de browser.

Op IP bijhouden is ook geen optie omdat er vaak netwerken zijn achter één IP-adres.

Al deze opties had ik al overwogen. Een account laten aanmaken door de user zou de perfect oplossing zijn, maar is veel te omslachtig. Ik wil het graag laagdrempelig houden.

Denk dat ik dan maar met sessies zal werken, tenzij iemand nog een suggestie heeft :) Voor het verbergen van de stem knop kan ik het na het klikken invisible maken.


[size=xsmall]Toevoeging op 01/05/2017 12:56:21:[/size]

Is het misschien mogelijk om in 1 cookie alle ID's bij te houden van de afbeeldingen waarop gestemd werden? Dat zou een vrij goede oplossing zijn denk ik, mocht dat lukken.
Met sessies kan. Maar als iemand steeds de browser sluit en opnieuw opstart kan hij weer stemmen, en zo is je stem-uitslag uiteindelijk niet echt betrouwbaar.

Een account is de enige betrouwbare weg met een bevestiging van het e-mailadres.
- Ariën - op 01/05/2017 12:59:59

Met sessies kan. Maar als iemand steeds de browser sluit en opnieuw opstart kan hij weer stemmen, en zo is je stem-uitslag uiteindelijk niet echt betrouwbaar.

Een account is de enige betrouwbare weg met een bevestiging van het e-mailadres.


Na, even nadenken ga ik het toch gewoon bij cookies houden. Het is betrouwbaarder als sessies en de kans dat een gebruiker op +50 afbeeldingen stemt lijkt me klein. De nauwkeurigheid van de stemmen is ook niet zo belangrijk.

Zit echter wel nog steeds met het probleem dat de stem knop niet meteen verdwijnt. Ik had volgende code toegevoegd, maar dat werkt niet omdat de pagina gerefreshed wordt door de POST


onclick="getElementById('upvote').style.display = 'block'; this.style.display = 'none'


[size=xsmall]Toevoeging op 01/05/2017 13:15:40:[/size]

Heb het opgelost, gewoon dit toegevoegd voor de knop:

AND !isset($_POST['submit'])
Louis Deconinck op 01/05/2017 13:11:24
Na, even nadenken ga ik het toch gewoon bij cookies houden. Het is betrouwbaarder als sessies


Nee.
Helemaal 100% voorkomen dat mensen meerdere keren stemmen gaat je ook nooit lukken. Ik zou kiezen voor 1 cookie voor de hele website met daarin een random token opgeslagen. Hetzelfde token zou ik opslaan in de database met daarachter de foto's waarop gestemd is en welk cijfer er gegeven is.

- tabel cookies:
id
token

-tabel images
id
filename

-tabel votes
image_id
cookie_id
rating
**quote-knip**
Dit vind ik wel een goede oplossing, dank je wel voor de suggestie, zelf was ik hier nooit opgekomen :)


Reageren