Door
Hans Zijlstra
op 30-10-2018 20:04
gewijzigd op 17-12-2019 10:17
9.278 views
Hallo allemaal,
ik ben bezig om een stempagina te maken voor een school zodat binnenkort ook digitaal gestemd kan worden. Ik heb hiervoor tutorials gelezen over sql en php. Vervolgens heb ik een login gezocht in php die ik ook heb gevonden. daarna een stemsysteem die ik ook heb gevonden wat prima is voor het doel waarvoor deze gebruikt moet worden.
Echter nu moeten ouders stemmen en kan dat niet vanaf dezelfde computer vanwege een cookie die gemaakt wordt. Ik heb getracht dit weg te laten maar ik blijf tegen het probleem aanlopen.
Daarnaast heb ik een S_SESSION('username') aangemaakt om deze te valideren om te kijken of deze user gestemd heeft of niet. Ik kan dit echter niet goed testen omdat ik de foutmelding steeds krijg dat ik heb gestemd. Ik heb nieuwe users in de database toegevoegd om het te testen maar die hebben allemaal al gestemd.
ook heb ik de cookie naar time() -3600 gezet zodat deze verwijderd werd maar niets hielp.
het doel is dus te controleren of de user die inlogt gestemd heeft en maar een keer kan stemmen.
ik ben nieuw hier dus ik hoop dat iemand mij de juiste richting op wil wijzen. ervaring met PHP etc is beginnend.
Ik heb al een vermoeden. Je kijkt of de $_COOKIE bestaat. Maar als je een setcookie() gebruikt om de cookie aan te maken, dan bestaat de cookie in $_COOKIE pas na een refresh.
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);.
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 ;-)
Dat is je sessie die in een cookie wordt opgevraagd, en dus niet je cookie-data die je in je cookie opslaat.
Dus die 'pitfall' lijkt me inderdaad van toepassing.
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.
Ik denk dat je even een rustpauze in moet lassen. Als ik bovenstaande code zie, in combinatie met allerlei dingen met cookies (zijn vaak van tijdelijke / middellange aard) om zaken permanent te onthouden... dit gaat 'em niet worden vrees ik.
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?
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.
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.
Die cookie lijkt mij ook niet eens nodig, als het account gebaseerd wordt opgeslagen.
In de database kan je prima opslaan of er gesteld is, en dat is dan voldoende.