Pagina update niet na een POST
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)
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
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');?>
// 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');?>
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.
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 -
- 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.
Ik denk dat Sessions meer in de juiste richting komt.
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.
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?
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.
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.
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.
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.
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 -
- 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.
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
Toevoeging op 01/05/2017 13:15:40:
Heb het opgelost, gewoon dit toegevoegd voor de knop:
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.
- 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
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 -
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 -
Alle votes voor 1 token opvragen:
Code (php)
1
2
3
4
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'
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)
1
2
3
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
left join votes v on v.image_id = i.id
group by i.id
Gemiddelde score voor 1 foto:
Code (php)
1
2
2
select i.filename, AVG(v.rating) as rating from images i
left join votes v on v.image_id = 123
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.
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.