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
Nee, die <variabelen> is maar om aan te geven wat er in deze placeholders thuishoort.

Uhm, je moet natuurlijk ook je queries uitvoeren he, met mysqli_query() :p.

Mijn code/voorbeelden gingen alleen over de (schematische) vorm van de queries, verder gelden natuurlijk de normale spelregels.

<?php
      if(isset($_POST['stem'])){
        $kandidaat = $_POST['kandidaat'] ;
        echo $_POST['kandidaat'];
        $sql = "SELECT * FROM ".$SETTINGS["kandidaat"]." WHERE id=".$kandidaat['id']"";
        $sql_result = mysql_query ($sql, $connection ) or die ('request "Could not execute SQL query" '.$sql);
        $gekozene = mysql_fetch_assoc($sql_result);
        if(!empty($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'];
        mysql_query ($query, $connection ) or die ('request "Could not execute SQL query" '.$query);

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


als het goed is nu de normale regels :-)(nog geen msqli)

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.
ok dit gaat nog iets te snel. ik heb de post kandidaat info toch? deze weet welke kandidaat er is gedrukt.

de controle of er iemand gestemd heeft kan pas nadat ik voor elkaar heb dat de stemming werkt en de kolom gestemd van 0 naar 1 gaat.

met een stem bedoel je dan dat de teller van kandidaat 1 omhoog gaat. Deze gaat overigens met deze laatste code niet meer omhoog :-(
Dat is niet vreemd:
<?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
session_start();

error_reporting(0);
include("config.php");


?>

    <html>
    <head>
      <title>MR stempagina</title>
    </head>
    <body>

      <?php echo $_SESSION['user_info']['name']  ?>, u kunt hier stemmen.
      <form action="stemmen.php" method="POST">
        <p>Welke ouder wilt u als vertegenwoordiger van de ouders van de HBK afdeling in de medezeggenschapsraad?</p>
        <input type="radio" name="kandidaat" value="piet"> piet<br>
        <input type="radio" name="kandidaat" value="hein"> hein<br>
        <p><input type="submit" name="stem" value="stem"></p>

<?php

$error = '';
  if(isset($_POST['kandidaat'])){
    $sql = "SELECT * FROM ".$SETTINGS["kandidaat"]." WHERE `kandidaten` = '".($_POST['kandidaat'])."'";
    $sql_result = mysql_query ($sql, $connection ) or die ('request "Could not execute SQL query" '.$sql);
    $gekozene = mysql_fetch_assoc($sql_result);
    if(!empty($gekozene)){
      $_SESSION['user_info'] = $user;
      $_POST['kandidaat'] = $GK;
      $query = " UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal+1 WHERE id =".$GK['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);
      
    }
    else{
      $error = 'u heeft niet gestemd';
    }
  }
      /*if(isset($_POST['kandidaat'])){
        echo $_POST['kandidaat'];
         //header("Location: vote.php");
      }
      else{
        $kandidaat = NULL;
        echo "kies uw kandidaat";
      }
?>

<?php
  $error = '';
  if(isset($_POST['kandidaat'])){
    $sql = "SELECT * FROM ".$SETTINGS["kandidaat"]."";
    $sql_result = mysql_query ($sql, $connection ) or die ('request "Could not execute SQL query" '.$sql);
    $gekozene = mysql_fetch_assoc($sql_result);
    if(!empty($gekozene)){
      $_SESSION['user_info'] = $user;
      $_POST['kandidaat'] = $GK;
      $query = " UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal+1 WHERE id =".$GK['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);
      
    }
    else{
      $error = 'u heeft niet gestemd';
    }
  }
 */
?>

          </form>
    </body>
    </html> 



Thomas, los van sql inj maar hij update nog niet en dat begrijp ik niet. lijkt veel op count van inlogs die wel werkt.

dank voor het kijken. hoop dat ik de count werkend krijg. zoek ondertussen zelf ook hoor. 3e stemmen .php al :-)
Dit:
<?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'];


bij deze krijg ik de "die" foutmelding

Bouw dan gelijk eens wat foutafhandeling in zodat je kan zien *welke* foutmelding dat precies is. Zie in jouw geval mysql_error().
Ben,

dank je voor jou tip. Ik heb boven in de pagina error_reporting(0) staan. is dat niet juist?

ik bedoelde
or die ('request "Could not execute SQL query" '.$query)
foutmelding

ondertussen heb ik de query aangepast en krijg geen foutmelding meer maar ook dan gaat de teller niet omhoog.

$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1 WHERE name='{$_SESSION['user_info']}'";


De tellers van beide users gaan zonder foutmelding omhoog bij de volgende query
$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1";

Reageren