Door
Hans Zijlstra
op 30-10-2018 20:04
gewijzigd op 17-12-2019 10:17
9.277 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.
Maar... Er moet toch al een initieel record zijn met kandidaat-informatie, anders kun je die later niet updaten... En deze wordt niet geupdate, want je controleert of er geen record is met die gegevens. Dus geen wonder dat je maar één stem kunt uitbrengen :/.
En je controleert dus ook niet expliciet van tevoren of iemand al gestemd heeft. Je verhoogt gestemd simpelweg met 1...
Wat je achtereenvolgens zou moeten doen:
als er een geldige waarde gekozen dan
als de huidige gebruiker nog niet gestemd heeft dan
hoog gekozen stem op met 1
markeer huidge gebruiker dat deze gestemd heeft
einde als
einde als
En zoals aangegeven, dit hele bovenstaande stuk code zou in zijn geheel, of in zijn geheel niet moeten worden uitgevoerd, dus in een transactie, want stel nu dat er dubbel gesubmit wordt dan kan iemand dus meerdere stemmen ontvangen van één stemgerechtigde.
<?php
$query = " UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal+1 WHERE id=".$_POST['id'];
$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1 WHERE id=".$_SESSION['id'];
mysql_query ($query, $connection ) or die ('request "Could not execute SQL query" '.$query);
?>
Regel 3 overschrijft $query in regel 2, en alleen die laatste query wordt uitgevoerd.
Waarden rechtstreeks in een query-string stoppen lijkt mij ook onverstandig. Dit werkt mogelijk SQL-injectie in de hand. De bovenstaande code is daardoor nogal foutgevoelig. Je zou de formulierdata op zijn minst moeten valideren om vast te stellen of $_POST['id'] een geldige waarde bevat.
<?php
$sql = 'SELECT * FROM lala WHERE blabla';
?>
Is simpelweg een toekenning van een lap tekst aan de variabele $sql die toevallig SQL-instructies bevat .
Als je vervolgens deze SQL als query aan de database wil voeren zul je dus $sql als argument aan mysql(i)_query() moeten meegeven om de query ook echt uit te voeren.
Vervolgens kun je $sql best hergebruiken om een andere query op de database uit te voeren, maar dan zul je dus opnieuw deze SQL-opdracht aan de database moeten voeren door middel van nog een aanroep van mysql(i)_query().
Regel 26 t/m 41 zal dus zoiets worden. Hierbij doe je er verstandig aan om niet eindeloos variabelen te kopieren onder een andere naam, dit is echt hopeloos verwarrend. Het onderstaande verdient nog steeds geen schoonheidsprijs en is nog steeds zeer foutgevoelig en je zult deze uit moeten breiden met meer controles zodat alles goed gaat, maar dat zou op zijn minst moeten werken... misschien.
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// voer hier eerst je controles uit...
// ...
// aanname: $_POST['id'] bevat een geldig kandidaat id
// aanname: het record met id gelijk aan $_POST['id'] bestaat reeds
$query = "UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal + 1 WHERE id = ".$_POST['id'];
mysql_query($query, $connection) or die('[error] database error '.$query);
// aanname: sessie loopt, gebruiker is ingelogd, heeft nog niet gestemd en hier is op gecontroleerd...
// aanname: $_SESSION['id'] bevat het user id van de huidige (ingelogde) gebruiker
$query = "UPDATE ".$SETTINGS["USERS"]." SET gestemd = 1 WHERE id = ".$_SESSION['id'];
mysql_query($query, $connection) or die('[error] database error '.$query);
}
?>
<?php
$error = '';
if(isset($_POST['kandidaat'])){
echo $_POST['kandidaat'];
//$query = " UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal+1";
$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1";
mysql_query ($query, $connection ) or die ('request "Could not execute SQL query" '.$query);
}
else{
$error = 'u heeft niet gestemd';
}
?>
Thomas,
echt super dat je zo meedenkt. Heb jouw server==post meegenomen maar kreeg geen echo waardoor is weer teruggegaan ben naar de isset.
Het werkt nu zo dat als de stem knop gedrukt wordt dat beide kandidaten in aantal worden verhoogd. hetzelfde geld voor de andere query dat alle users een 1 krijgen bij gestemd.
Dit ligt eraan omdat ik geen where gebruik. maar elke keer als ik dat probeer voert hij de sql niet uit.
ik heb de $_SESSION['user info']['name'] welke van de ingelogde gebruiker is. Ook kan ik zien dat de $_POST['kandidaat'] degene is op wie is gestemd.
toch lukt het mij niet om deze info in de where te gebruiken om dus een rij ipv alle te updaten.
$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1 WHERE id=".$user['id'];