Pagina update niet na een POST

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Louis Deconinck

Louis Deconinck

01/05/2017 12:29:51
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?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');?>
 
PHP hulp

PHP hulp

20/09/2021 01:35:02
 
- Ariën -
Beheerder

- Ariën -

01/05/2017 12:35:30
Quote Anchor link
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.
Quote:
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.
Gewijzigd op 01/05/2017 12:37:38 door - Ariën -
 
Louis Deconinck

Louis Deconinck

01/05/2017 12:39:12
Quote Anchor link
- 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.
Quote:
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?
 
Ben van Velzen

Ben van Velzen

01/05/2017 12:47:37
Quote Anchor link
>> 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.
 
- Ariën -
Beheerder

- Ariën -

01/05/2017 12:51:03
Quote Anchor link
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.
 
Louis Deconinck

Louis Deconinck

01/05/2017 12:55:31
Quote Anchor link
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.


Toevoeging op 01/05/2017 12:56:21:

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.
 
- Ariën -
Beheerder

- Ariën -

01/05/2017 12:59:59
Quote Anchor link
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.
Gewijzigd op 01/05/2017 13:00:42 door - Ariën -
 
Louis Deconinck

Louis Deconinck

01/05/2017 13:11:24
Quote Anchor link
- 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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
onclick="getElementById('upvote').style.display = 'block'; this.style.display = 'none'


Toevoeging op 01/05/2017 13:15:40:

Heb het opgelost, gewoon dit toegevoegd voor de knop:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
AND !isset($_POST['submit'])
 
Thomas van den Heuvel

Thomas van den Heuvel

01/05/2017 13:16:18
Quote Anchor link
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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/05/2017 13:19:33
Quote Anchor link
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
Gewijzigd op 01/05/2017 13:20:39 door Frank Nietbelangrijk
 
Louis Deconinck

Louis Deconinck

01/05/2017 13:24:54
Quote Anchor link
**quote-knip**
Dit vind ik wel een goede oplossing, dank je wel voor de suggestie, zelf was ik hier nooit opgekomen :)


- Ariën -:
Het is niet nodig om een voorgaand laatste bericht integraal te quoten.
Gewijzigd op 01/05/2017 13:38:45 door - Ariën -
 
- Ariën -
Beheerder

- Ariën -

01/05/2017 13:41:51
Quote Anchor link
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.
Gewijzigd op 01/05/2017 13:43:10 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/05/2017 13:57:56
Quote Anchor link
In dat geval om je op weg te helpen:


Alle votes voor 1 token opvragen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
select i.filename, AVG(v.rating) as rating from images i
left join votes v on v.image_id = 123


Toevoeging op 01/05/2017 14:03:19:

- 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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.