stempagina aanpassen
Pagina: « vorige 1 2 3 4 5 6 volgende »
En één query die je uitvoert en de ander overschrijft? Je maakt nu twee opdrachten als string aan, en voert enkel de laatste uit.
Gewijzigd op 09/11/2018 18:22:48 door - Ariën -
ik heb mijn query even greyed out en nu werkt het feilloos. de Last_login = now() werkt en wordt steeds geupdated.
ik heb gezocht en nu werkt het wel.
Code (php)
1
$query = " UPDATE ".$SETTINGS["USERS"]." SET last_login = NOW(), pogingen = pogingen+1 WHERE id=".$user['id'];
https://www.w3resource.com/mysql/update-table/update-table.php
Gewijzigd op 09/11/2018 18:38:25 door Hans Zijlstra
Eerst maakte je twee opdrachten aan waarvan je enkel de laatste uitvoerde.
Maar let erop dat mysql_*** functies verouderd zijn en niet meer in PHP 7 werken. Gebruik liever de mysqli-functies.
Gewijzigd op 09/11/2018 18:42:11 door - Ariën -
Ik heb hier veelvuldig gelezen dat msql verouderd is, maar de stempagina moet donderdag werken :-)
aangezien ik beginner ben moet het eerst maar even zo, de andere optie is mij ook nog te hoog gegrepen.
ik heb nu de inlog geregeld (zij het in msql en het kan zeker nog verbeterd worden qua beveiliging) en ga na inlog verwijzen naar stempagina waarbij ik ook een kolom en deze update van 0 naar 1 zodat de gebruiker maar een keer kan stemmen.
De overstap van mysql functies naar mysqli is niet heel groot.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?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
if(isset($_POST['kandidaat'])){
$kandidaat = $_POST['kandidaat'];
header("Location: vote.php");
}
else{
$kandidaat = NULL;
echo "kies uw kandidaat";
}
?>
<?php
$error = '';
if(isset($_POST['stem'])){
$sql = "SELECT * FROM ".$SETTINGS["kandidaat"]."";
$sql_result = mysql_query ($sql, $connection ) or die ('request "Could not execute SQL query" '.$sql);
$kandidaat = mysql_fetch_assoc($sql_result);
if(!empty($kandidaat)){
$_SESSION['user_info'] = $user;
$query = " UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal+1 WHERE id=".$kandidaat['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>
@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
if(isset($_POST['kandidaat'])){
$kandidaat = $_POST['kandidaat'];
header("Location: vote.php");
}
else{
$kandidaat = NULL;
echo "kies uw kandidaat";
}
?>
<?php
$error = '';
if(isset($_POST['stem'])){
$sql = "SELECT * FROM ".$SETTINGS["kandidaat"]."";
$sql_result = mysql_query ($sql, $connection ) or die ('request "Could not execute SQL query" '.$sql);
$kandidaat = mysql_fetch_assoc($sql_result);
if(!empty($kandidaat)){
$_SESSION['user_info'] = $user;
$query = " UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal+1 WHERE id=".$kandidaat['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>
als ik stem wordt het aantal van de eerste kandidaat in de tabel kandidaten geüpdatet ondanks dat er op de andere kandidaat is gestemd. Waar gaat dit fout?
is het mogelijk om twee een kolommen in twee tabellen te updaten zodra er is gestemd.
ik wil graag een stem bij de geselecteerde kandidaat en bij de user een 1 in het vakje gestemd. Dan wilde ik bij de stemknop de controle doen of bij die user een 1 staan en dan de melding geven dat hij heeft gestemd. Echter de user info wordt niet onthouden?
graag uw helpende hand.
Toevoeging op 12/11/2018 12:24:43:
hallo inmiddels heb ik de user info op de nieuwe pagina opgelost.
Maar zodra deze mogelijk door je webhosting-beheerder van PHP 7 wordt voorzien zal je script niet meer werken, omdat je oude mysql_xxx()-functies gebruikt. Ik raad aan om dit zo snel mogelijk aan te passen.
Verder hoort er na een location-header een exit(); te staan. Je script wil je dan natuurlijk ook graag laten stoppen.
Gewijzigd op 12/11/2018 14:21:10 door - Ariën -
de exit(); heb ik toegevoegd. Dank daarvoor.
- Ariën - op 12/11/2018 13:20:22:
...
Maar zodra deze mogelijk door je webhosting-beheerder van PHP 7 wordt voorzien zal je script niet meer werken, omdat je oudemysqli-functies mysql-functies gebruikt. Ik raad aan om dit zo snel mogelijk aan te passen.
...
Maar zodra deze mogelijk door je webhosting-beheerder van PHP 7 wordt voorzien zal je script niet meer werken, omdat je oude
...
Nog een idee waarom het niet werkt?
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?
Gewijzigd op 12/11/2018 14:24:49 door - Ariën -
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 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.
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 ;-)
Laat ik wat codesnippets erbij pakken.
Allereerst dit:
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:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
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>
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):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
----------
id
active
name
description
poll_options
------------
id
poll_id
description
order
poll_votes
----------
poll_id
poll_option_id
poll_participants
-----------------
id
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.
Gewijzigd op 14/11/2018 14:08:03 door Thomas van den Heuvel
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
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
En waar loop je vast?
de user tabel gestemd wordt niet met 1 vermeerderd.
Dus zoiets:
Code (php)
1
2
3
2
3
UPDATE kandidaten
SET aantal = aantal + 1
WHERE id = <id kandidaat uit formulier in $_POST>
SET aantal = aantal + 1
WHERE id = <id kandidaat uit formulier in $_POST>
En dan dus:
Is jouw notatie ook zoals het zou moeten? WHERE id = <id gebruiker uit $_SESSION>
Toevoeging op 13/11/2018 17:38:35:
nu heb ik de code zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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";
}
?>
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
Gewijzigd op 13/11/2018 17:21:56 door Hans Zijlstra
Pagina: « vorige 1 2 3 4 5 6 volgende »