Door
Hans Zijlstra
op 30-10-2018 20:04
gewijzigd op 17-12-2019 10:17
9.284 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.
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.
Cookies staan op je PC, en kan je in je browser wissen.
Download anders een Cookie Manager als add-on voor je browser, als je er meer inzicht in wilt hebben.
Mijn brein loopt echt vast als ik die code probeer te volgen. Magische constanten voor toestanden, nummers voor de naam van een cookie, inline verwerking van een POST formulier... Als dit nu een script van 10 jaar terug was alas, maar deze code is dit jaar geschreven... Dit pollscript is echt complete bagger.
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:
<?php
function getRandomToken() {
return sha1(uniqid(mt_rand(), true));
}
?>
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):
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
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.
ik ben gestopt met deze code omdat ik er niet uitkom. Maar tijdens deze thread triggerde jullie mij dat je met een unieke id (email) konden zeggen of iemand gestemd had. dat handel je dus af door de user id nadat hij op de knop heeft gedrukt een veld te vullen in de tabel en bij inlog te checken of dit veld is gevuld zodat de stemknop verdwijnt.
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.
Dat kan, je kan bij elke succesvolle login zo een query uitvoeren :
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.
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);
}
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.