stempagina aanpassen
Pagina: « vorige 1 2 3 4 5 6 volgende »
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
public function updateVote($pollVoteData) {
if(!isset($pollVoteData['username']) || isset($_COOKIE[$pollVoteData['username']])) {
return false;
}
$pollVoteDetails = $this->getVotes($pollVoteData['username']);
$votes = explode("||||", $pollVoteDetails['votes']);
$votes[$pollVoteData['pollOptions']] += 1;
implode("||||",$votes);
$pollVoteDetails['voters'] += 1;
$sqlQuery = "UPDATE ".$this->pollTable." set votes = '".implode("||||",$votes)."' , voters = '".$pollVoteDetails['voters']."' where id = '".$pollVoteData['username']."'";
mysqli_query($this->dbConnect, $sqlQuery);
return true;
if(!isset($pollVoteData['username']) || isset($_COOKIE[$pollVoteData['username']])) {
return false;
}
$pollVoteDetails = $this->getVotes($pollVoteData['username']);
$votes = explode("||||", $pollVoteDetails['votes']);
$votes[$pollVoteData['pollOptions']] += 1;
implode("||||",$votes);
$pollVoteDetails['voters'] += 1;
$sqlQuery = "UPDATE ".$this->pollTable." set votes = '".implode("||||",$votes)."' , voters = '".$pollVoteDetails['voters']."' where id = '".$pollVoteData['username']."'";
mysqli_query($this->dbConnect, $sqlQuery);
return true;
Toevoeging op 31/10/2018 10:16:15:
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
46
47
48
49
50
51
52
53
54
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
46
47
48
49
50
51
52
53
54
<?php
session_start();
class Poll{
private $host = 'localhost';
private $user = '';
private $password = '';
private $database = '';
private $pollTable = 'poll';
private $dbConnect = false;
public function __construct(){
if(!$this->dbConnect){
$conn = new mysqli($this->host, $this->user, $this->password, $this->database);
if($conn->connect_error){
die("Error failed to connect to MySQL: " . $conn->connect_error);
}else{
$this->dbConnect = $conn;
}
}
}
private function getData($sqlQuery) {
$result = mysqli_query($this->dbConnect, $sqlQuery);
if(!$result){
die('Error in query: '. mysqli_error());
}
$data= array();
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$data[]=$row;
}
return $data;
}
public function getPoll(){
$sqlQuery = 'SELECT id, question, options, votes, voters FROM '.$this->pollTable;
return $this->getData($sqlQuery);
}
public function getVotes($id){
$sqlQuery = 'SELECT votes, voters FROM '.$this->pollTable.' where id = '.$id;
$result = mysqli_query($this->dbConnect, $sqlQuery);
return mysqli_fetch_array($result, MYSQLI_ASSOC);
}
public function updateVote($pollVoteData) {
if(!isset($pollVoteData['username']) || isset($_COOKIE[$pollVoteData['username']])) {
return false;
}
$pollVoteDetails = $this->getVotes($pollVoteData['username']);
$votes = explode("||||", $pollVoteDetails['votes']);
$votes[$pollVoteData['pollOptions']] += 1;
implode("||||",$votes);
$pollVoteDetails['voters'] += 1;
$sqlQuery = "UPDATE ".$this->pollTable." set votes = '".implode("||||",$votes)."' , voters = '".$pollVoteDetails['voters']."' where id = '".$pollVoteData['username']."'";
mysqli_query($this->dbConnect, $sqlQuery);
return true;
}
}
?>
session_start();
class Poll{
private $host = 'localhost';
private $user = '';
private $password = '';
private $database = '';
private $pollTable = 'poll';
private $dbConnect = false;
public function __construct(){
if(!$this->dbConnect){
$conn = new mysqli($this->host, $this->user, $this->password, $this->database);
if($conn->connect_error){
die("Error failed to connect to MySQL: " . $conn->connect_error);
}else{
$this->dbConnect = $conn;
}
}
}
private function getData($sqlQuery) {
$result = mysqli_query($this->dbConnect, $sqlQuery);
if(!$result){
die('Error in query: '. mysqli_error());
}
$data= array();
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$data[]=$row;
}
return $data;
}
public function getPoll(){
$sqlQuery = 'SELECT id, question, options, votes, voters FROM '.$this->pollTable;
return $this->getData($sqlQuery);
}
public function getVotes($id){
$sqlQuery = 'SELECT votes, voters FROM '.$this->pollTable.' where id = '.$id;
$result = mysqli_query($this->dbConnect, $sqlQuery);
return mysqli_fetch_array($result, MYSQLI_ASSOC);
}
public function updateVote($pollVoteData) {
if(!isset($pollVoteData['username']) || isset($_COOKIE[$pollVoteData['username']])) {
return false;
}
$pollVoteDetails = $this->getVotes($pollVoteData['username']);
$votes = explode("||||", $pollVoteDetails['votes']);
$votes[$pollVoteData['pollOptions']] += 1;
implode("||||",$votes);
$pollVoteDetails['voters'] += 1;
$sqlQuery = "UPDATE ".$this->pollTable." set votes = '".implode("||||",$votes)."' , voters = '".$pollVoteDetails['voters']."' where id = '".$pollVoteData['username']."'";
mysqli_query($this->dbConnect, $sqlQuery);
return true;
}
}
?>
volledigheidshalve de gehele poll.php
php.net/setcookie:
Common Pitfalls:
Cookies will not become visible until the next loading of a page that the cookie should be visible for. To test if a cookie was successfully set, check for the cookie on a next loading page before the cookie expires. Expire time is set via the expires parameter. A nice way to debug the existence of cookies is by simply calling print_r($_COOKIE);.
Cookies will not become visible until the next loading of a page that the cookie should be visible for. To test if a cookie was successfully set, check for the cookie on a next loading page before the cookie expires. Expire time is set via the expires parameter. A nice way to debug the existence of cookies is by simply calling print_r($_COOKIE);.
Verder kan het geen kwaad om je class even netjes te identen met de TAB ;-)
Spaghetti vind ik wel lekker, maar code-spaghetti niet zo ;-)
Gewijzigd op 31/10/2018 10:44:20 door - Ariën -
deze houdt hij vast tot hij expired?
Dus die 'pitfall' lijkt me inderdaad van toepassing.
Gewijzigd op 31/10/2018 13:33:11 door - Ariën -
ik heb de session destroyed en de set cookie staat uit. Toch krijg ik steeds de melding dat ik al heb gestemd. Moet je de database verwijderen en opnieuw aanmaken?
$pollVoteData['username'] is gewoon niet geset, of $_COOKIE[$pollVoteData['username'] is leeg. Maar als je geen cookies hebt, dan moet het wel in de database zijn opgeslagen dat je gestemd hebt.
Gewijzigd op 31/10/2018 15:43:27 door - Ariën -
We are using php cookie to identify the user has been voted or not, You can use other mechanism as well to identify user session.
ik heb die cookie op time () -3600 gezet waarmee deze niet gemaakt zou worden. Echter nadat ik en keer gestemd heb.
Een ander probleem van bovenstaande opzet is dat je geen enkele historie of "getuigen" hebt van een stem, je weet enkel dat er iemand gestemd heeft, maar niet (precies) wie.
En ik huiver bij de gedachte wat er gebeurt met jouw data op het moment dat twee mensen parallel aan het stemmen zijn, wat als al die SELECTs en UPDATEs en implodes en explodes op een verkeerde manier met elkaar worden verweven, want er is op dit moment niets wat de ondeelbaarheid van zo'n stemactie garandeert. In het ergste geval blaas je letterlijk je poll op vrees ik :). Iets minder dramatisch wellicht: bij de bovenstaande code bestaat misschien het gevaar dat er stemmen verloren gaan. En vervolgens heb je dan geen idee wiens stem verloren is gegaan omdat je hier geen "getuigen" van hebt (en de rest van het systeem zal je gewoon vertellen dat er niets aan de hand is dus mogelijk heb je een hele lange tijd of gewoon helemaal niet in de gaten dat er stemmen verloren zijn gegaan).
Dus. Is dit een eenmalig iets: dan kan je code simpel blijven (maar niet simpeler zoals bovenstaande opzet). Is dit een terugkerend fenomeen (meerdere stemmingen) dan wordt het tijd om even goed na te gaan denken hoe je e.e.a. organiseert en hoe stemmingen er uit kunnen zien.
En dan nog een stukje gebruiksvriendelijkheid: zoals eerder aangegeven kun je iemand gewoon een linkje sturen met een unieke code zodat iemand direct kan stemmen zonder login, wachtwoorden en al dat soort moeilijke poeha - ain't nobody got time fo dat. Dit kun je doen door die code te koppelen aan een stemming + een e-mailadres. Dan kan iemand meteen stemmen en klaar. Scheelt een hoop gedoe lijkt mij en geeft het stemmen een stuk lagere drempel.
Eerder werd ook iets gezegd over stemgeheim: het lijkt mij voor de administratie wel handig/belangrijk dat je kunt zien dat iemand ergens op gestemd heeft (om de kloppendheid van de gegevens en het systeem verder te waarborgen). Zolang de database verder afgeschermd blijft en deze precieze informatie niet gedeeld wordt lijkt mij dat niet zo'n probleem?
Gewijzigd op 31/10/2018 16:48:59 door Thomas van den Heuvel
ik weet wie er mogen stemmen, ivm het stemgeheim moet men anoniem kunnen stemmen. Het is getest door meerdere mensen die allemaal gestemd hebben en dat werkte prima. De beschrijving van de poll pagina geeft aan dat er meerdere polls zouden kunnen moeten draaien. Ben natuurlijk beginner dus zou het niet weten met im- en explodes.
https://www.phpflow.com/php/simple-poll-example-using-php-bootstrap-mysql/
Ik heb dit gebruikt en er een login systeem aan gekoppeld welke ik hier gevonden had
https://www.allphptricks.com/simple-user-registration-login-script-in-php-and-mysqli/
ik heb dus alles werkend maar zit met het feit dat twee ouders met eigen code moeten kunnen stemmen vanaf een pc. Nu begrijp ik dat ik via emailadres kan inregelen of de user gestemd heeft. nu gebeurd dat via het cookie waardoor je maar een keer kan stemmen. en dat geldt volgens mij voor de pc en niet de user. Ik heb nieuwe users toegevoegd die nog niet gestemd hadden en krijg de melding dat ze al gestemd hadden.
vandaar mijn vraag of ik de database opnieuw moet maken om van de reeds gezette cookie af te komen?
en ik wil die cookie weglaten dus heb deze met // en time() -3600 m.i. gedeactiveerd maar hij blijft zeggen u heeft al gestemd. die vote=2 staat icm cookie staat dus ergens.
heb je een linkje voor mij voor zo'n stemsysteem via email met unieke code? zal ook zoeken hoor.
In de database kan je prima opslaan of er gesteld is, en dat is dan voldoende.
alleen hoe verwijder ik deze cookie. Ik heb inmiddels de database leegemaakt de cookie op -3600 gezet maar hij blijft aangeven dat er al gestemd is van deze pc.
Download anders een Cookie Manager als add-on voor je browser, als je er meer inzicht in wilt hebben.
Gewijzigd op 01/11/2018 00:40:33 door - Ariën -
Ik heb de cookies gewist via de browser. Meerdere keren maar schijnbaar werkt dat niet.
Dan is de controle in het script fout, of staat in de database nog aangegeven dat er gestemd is.
Indien ergens een melding wordt gegeven dat je al gestemd hebt zul je daarvandaan terug moeten werken in de code. Dit script maakt dit nogal moeilijk omdat alles zo'n beetje door elkaar loopt. Als $voted gelijk is aan 2 zoals je aangeeft, betekent dit dat updateVote() false was, en dus waarschijnlijk dat er ergens nog een cookie met een numerieke waarde rondzwerft.
Ik heb zou gauw geen code liggen maar kan wel het principe uitleggen. Allereerst is het zaak dat je op een of andere manier een random string kunt genereren, bijvoorbeeld als volgt:
Vervolgens koppel je deze code aan een poll-id en en e-mailadres, waarbij je tevens bijhoudt of iemand heeft gestemd, een mogelijke tabel wordt dus zoiets (schematisch):
Code (php)
1
2
3
4
5
6
2
3
4
5
6
poll_voted // naam van de tabel
------------------------------------------------
poll_id // id van de poll
email_address // e-mail adres van de gebruiker
token // toegekend token
voted // of iemand gestemd heeft
------------------------------------------------
poll_id // id van de poll
email_address // e-mail adres van de gebruiker
token // toegekend token
voted // of iemand gestemd heeft
Vervolgens stuur je iemand een link naar het script, waarbij in elke aanroep het poll-id en het token worden meegegeven, bijvoorbeeld poll.php?poll=5&token=8324e62297135f29f483caa0f9d66d01047ab4c7.
En dan controleer je dus in de overzichtspagina of iemand gestemd heeft (poll_voted.voted = 1). Op grond daarvan toon je resultaten -als daar correspondentie over is- of geef je een boodschap dat iemand al gestemd heeft, en anders een overzicht met keuzes. In de verwerkstap sla je dan de gemaakte keuze op en pas je poll_voted.voted aan naar 1 voor het record waar het poll id en het token overeen komen. Hier komt dus geen login aan te pas.
Dit "werkt" dus omdat het token "geheim" is en alleen aan de ontvanger van het e-mailadres bekend wordt gemaakt en tevens omdat dit token slechts eenmalig bruikbaar is.
Gewijzigd op 01/11/2018 03:05:30 door Thomas van den Heuvel
Klopt dit?
kun je ook het aantal logins registreren in database. ik vond wel last_login = now(), maar ik zou ook graag aantal logins willen zien.
wie kan mij op weg helpen?
UPDATE gebruikers SET pogingen = pogingen+1 WHERE e-mail = '[email protected]'
Zet ze ten tijden van je registratie standaard op een default waarde van 0.
Gewijzigd op 09/11/2018 17:52:59 door - Ariën -
waarbij pogingen een kolomnaam is in de tabel toch?
Gewijzigd op 09/11/2018 17:53:50 door - Ariën -
Code (php)
1
2
3
4
5
6
2
3
4
5
6
if(!empty($user)){
$_SESSION['user_info'] = $user;
$query = " UPDATE ".$SETTINGS["USERS"]." SET last_login = NOW() WHERE id=".$user['id'];
$query = " UPDATE ".$SETTINGS["USERS"]." SET pogingen = pogingen+1 WHERE id=".$user['id'];
mysql_query ($query, $connection ) or die ('request "Could not execute SQL query" '.$query);
}
$_SESSION['user_info'] = $user;
$query = " UPDATE ".$SETTINGS["USERS"]." SET last_login = NOW() WHERE id=".$user['id'];
$query = " UPDATE ".$SETTINGS["USERS"]." SET pogingen = pogingen+1 WHERE id=".$user['id'];
mysql_query ($query, $connection ) or die ('request "Could not execute SQL query" '.$query);
}
hij update nu wel het aantal pogingen maar de last_login wordt niet meer geupdated en als deze op null staat word de now()ook niet ingevuld. dit klopt niet.
ik heb het gevoel dat er een fout in mijn code ligt.
Gewijzigd op 09/11/2018 18:16:12 door Hans Zijlstra
Pagina: « vorige 1 2 3 4 5 6 volgende »