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.

dank alvast
Potjandorie, ik ben MySQLi zo gewend dat ik bijna geen mysql meer kan typen... :+)
Mijn excuses voor de verwarring, omdat mijn interne spellingscontrole onbedoeld ingreep ;-)

Wat gaat er nu eigenlijk precies nog fout? Je had al het een en ander opgelost, zag ik?
ik heb een tweede tabel gemaakt met daarin de kandidaten en een kolom aantal. als je de kandidaat hebt gekozen en op stemt drukt wordt er steeds een getal bij het aantal van de 1e kandidaat opgeteld ook al stem je op de tweede kandidaat.

verder heb ik bij de users een kolom gestemd aangemaakt die van 0 naar 1 moet gaan zodra er op de stem knop wordt gedrukt. Hiermee kan ik dan ook controleren of de user al gestemd heeft
Als dit een eenmalige stemming is dan zou ik gezien het voorgaande gaan voor een bestaand online pollsite waar mensen hun stem kunnen uitbrengen, naar alle waarschijnlijkheid zijn er genoeg gratis sites.

Als dit geen eenmalige stemming is dan zou ik het systeem zo opzetten dat je ook makkelijk meerdere stemmingen kunt houden.

Zoals eerder aangegeven is een loginsysteem overbodig. Je kunt mensen rechtstreeks toegang geven met een token wat eenmalig te gebruiken is. Dit is laagdrempeliger voor de eindgebruiker en minder complex voor de ontwikkelaar.

Het nadeel van systemen die door, excusez le mot, hobbyisten in elkaar worden gezet is dat deze mogelijk bepaalde nuances missen. Ik neem aan dat de correcte werking van zo'n stemsysteem buiten kijf moet staan, ik zou dan op zijn minst database-transacties verwachten als je een trits queries uitvoert, die garandeert dat een stemactie één ondeelbaar geheel vormt.

Enfin, dit is een herhaling van zetten.
Thomas,

ik had al aangegeven dat jouw voorstel voor mij nog boven de pet ging. Verder heb ik nu meerdere gratis pollssites geprobeerd die niet voor deze stemming werken omdat mensen dan maar een keer kunnen stemmen waar beide ouders dit moeten kunnen. Bij mij eerste versie was dat ook al een issue en bij de gratis en betaalde onlines ook.

dat is de reden dat is voor een hele basic versie ga waar alle ouders random een username en pass krijgen waarmee ze in moeten loggen zodat de anonimiteit is gewaarborgd. De database bevat deze inlogs zodat anderen niet kunnen stemmen. vervolgens moeten ze stemmen. Ik kan aantal inlogs zien en als ze stemmen volgt er een 1 in de database zodat ze daarna niet meer kunnen stemmen (deze code moet ik nog voor elkaar krijgen.) verder krijgt de gekozen kandidaat ook een teller die oploopt. Ook dit werkt nog niet.

Dus ik begrijp jouw "herhaling van zetten" maar deze hobbyist denkt dat als dit werkbaar is het goed is voor het doel. (daarna php7 en beveiliging)

ik dank je evenwel voor jouw feedback maar ben benieuwd of je mij ook de juiste weg in kunt duwen om wat ik nu heb werkend te krijgen ;-)
Ik denk dat je het jezelf nogal moeilijk maakt doordat je extra complexiteit toevoegt met een loginsysteem. Daarnaast is een pollsysteem gevoelig voor fraude als je geen gebruik maakt van database-transacties, en hiervoor heb je een relationele database nodig, en hiervoor dien je de tabellen aan te maken met de juiste database engine.

Laat ik wat codesnippets erbij pakken.

Allereerst dit:
  <?php
@session_start();
?>

Op regel 1 ga je al de mist in door "output" te produceren - die twee spaties voor het <?php blok. Vervolgens onderdruk je op regel 2 eventuele foutmeldingen die bij het starten/voortzetten van een sessie ontstaan. Mogelijk hebben deze twee regels tot gevolg dat de sessie niet succesvol gestart is, dus eigenlijk begin je hier al op de verkeerde voet.

Dan op regel 37 en 42 voer je de volgende twee queries uit:
SELECT * FROM ".$SETTINGS["kandidaat"]
UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal+1 WHERE id=".$kandidaat['id']

En dit illustreert het belang van database-transacties.
Op het moment van het opvragen van informatie uit de tabel $SETTINGS['kandidaat'] - ontbreekt hier trouwens niet een argument in de trant van WHERE id = <huidige gebruiker> ofzo? Ik neem aan dat die tabel meerdere records bevat? - op dat moment zouden eigenlijk de gegevens van die tabel vergrendeld moeten worden totdat de mutatie (de UPDATE) afgerond is. Want wat nu als ik dit drie keer snel achter elkaar, en parallel, aanroep? Dan is de volgorde worst case zoiets:
SELECT * FROM <tabel>
SELECT * FROM <tabel>
SELECT * FROM <tabel>
UPDATE <tabel> SET ... WHERE id = <id>
UPDATE <tabel> SET ... WHERE id = <id>
UPDATE <tabel> SET ... WHERE id = <id>

En halverwege worden daar controles uitgevoerd of de UPDATE mag plaatsvinden, maar op dat moment was alle informatie al binnengehaald nog voordat een andere proces een UPDATE heeft uitgevoerd!
Eigenlijk zouden regel 2 en regel 3 moeten wachten totdat de UPDATE die in wezen geïnitieerd werd in regel 1 klaar is met zijn bijbehorende UPDATE op regel 4 waarna de controles van de tweede en derde SELECT waarschijnlijk falen omdat dan (na afronding van de eerste UPDATE) niet meer voldaan kan worden aan de controles voor de UPDATEs.

Je opzet is ook zodanig dat je niet na kunt gaan wie er dubbel stemt? En als dat hetgene is wat je hierboven hardnekkig probeert te tellen, ook dat is helemaal niet nodig met de juiste voorzieningen.

Een mechanisme die dit waarborgt zijn transacties.

Zoals ik het zie wordt dit pollsysteem in zijn simpelste vorm zoiets (tabeldefinitie):
poll_polls
----------
id
active
name
description


poll_options
------------
id
poll_id
description
order


poll_votes
----------
poll_id
poll_option_id


poll_participants
-----------------
id
email
token
voted


poll_polls - kapstoktabel voor stemrondes
id - een auto_increment id voor unieke identificatie van stemmen
active - geeft aan of de poll "aan" of "uit" staat
name - titel van de poll
description - omschrijving van de poll, hier zou je ook informatie in kunnen zetten als openings- en sluitingsdatum van de poll, waar je later bijvoorbeeld aparte kolommen voor kunt maken

poll_options - bevat de verschillende stemopties voor de polls
id - auto_increment id voor unieke identificatie van de stemoptie
poll_id - de poll waar deze optie bijhoort
description - omschrijving van de optie, bijvoorbeeld de naam van een verkiesbare kandidaat
order - kolom waarmee je de opties een alternatieve sorteervolgorde kunt geven

poll_votes - houdt de stemmen per poll(optie) bij
poll_id - de poll waarop gestemd wordt
poll_option_id - de poll optie waarop gestemd wordt
Aan deze tabel kun je nog veel meer informatie hangen, zoals de datum van stemming en wellicht ook een "witness", dus de persoon die stemde op deze optie; het is dan de verantwoordelijkheid van de beheerder van deze data om deze informatie te strippen op het moment dat deze hierover een rapportage uitbrengt

poll_participants - tabel die minimale informatie bevat van personen die zijn uitgenodigd voor deelname
id - auto_increment id
poll_id - poll waarop je mag stemmen
email - contact e-mail adres
token - activatiecode voor deelname aan stemming
voted - boolean die aangeeft of er gestemd is

Dit is een minimale opzet die alle informatie bevat die je initieel nodig hebt om een eenvoudig pollsysteem te bouwen. Je zult dan dus nog wel op een of andere manier activatiecodes moeten genereren en mailen naar een lijst van gebruikers, maar ook dat is redelijk eenvoudig te bouwen.

Het blijft echter wel zaak dat wat voor aanpak je ook kiest dat er haast een "zero margin for errors" is. Dit is immers een administratief systeem, en het is zaak dat je administratie te allen tijde klopt. Ik denk niet dat dat gaat lukken zonder een opzet met een relationele database of zonder gebruikmaking van eerdergenoemde transacties.
hoi thomas,

bedankt voor deze uitleg weer.

de inlogpagina werkt dus dat is niet het probleem.

vanuit deze pagina gaat de user naar de stempagina met session user.
deze bevat 2 radiobuttons en submit. hier moet er een gekozen worden. dat werkt ook.
na submit moet de $-POST kandidaat in de tabel kandidaten in de kolom aantal met een vermeerderd worden. de tabel bestaat uit

id
kandidaat
aantal

daarnaast moet er na submit door de bekende user het vakje gestemd in de tabel users
id
email
pass
name
lastlogin
pogingen
gestemd

de kolom gestemd van 0 naar 1
en bij de submit knop op de stempagina een check. indien gestemd op 1 echo u heeft al gestemd


na submit moet de $-POST kandidaat in de tabel kandidaten in de kolom aantal met een vermeerderd worden. op dit moment wordt alleen het nummer van kandidaat 1 vermeerderd met 1.

de user tabel gestemd wordt niet met 1 vermeerderd.
Gebruik je in het stemformulier het id van de kandidaat? Dat lijkt mij het makkelijkste.

Dus zoiets:
UPDATE kandidaten
SET aantal = aantal + 1
WHERE id = <id kandidaat uit formulier in $_POST>


En dan dus:
UPDATE users
SET gestemd = 1
WHERE id = <id gebruiker uit $_SESSION>
Thomas, dat is wel zoals het bij de aantal logins werkte.

Is jouw notatie ook zoals het zou moeten? WHERE id = <id gebruiker uit $_SESSION>

[size=xsmall]Toevoeging op 13/11/2018 17:38:35:[/size]

nu heb ik de code zo:

<?php
      if(isset($_POST['stem'])){
        $kandidaat = $_POST['kandidaat'];
        echo $_POST['kandidaat'];
        $query = " UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal+1 WHERE id=".$_POST['id'];
        $query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1 WHERE id=".$_SESSION['id'];

        //header("Location: vote.php");
      }
      else{
        $kandidaat = NULL;
        echo "kies uw kandidaat";
      }
 ?>


zowel stem als aantal worden niet vermeerderd met 1

Reageren