stempagina aanpassen
Pagina: « vorige 1 2 3 4 5 6 volgende »
Anyhow, het lijkt erop dat je id $user['id'] niet (correct) gevuld wordt.
Uit optiek van database-ontwerp is dit verder verre van ideaal, want door deze opzet is het slechts éénmalig mogelijk om te stemmen.
Maar even over het voorgaande: je bent hier een heleboel technieken aan het combineren (webformulieren + de verwerking, database-bewerkingen en een hoop applicatielogica o.a. in PHP voor een stemsysteem) maar dit gaat allemaal niet zo fantastisch.
Ik denk dat dit voor een groot deel komt (naast een gebrek aan ervaring wellicht) omdat het niet duidelijk is wat er precies fout gaat. Zoals @Ben en @Ariën al aangaven helpt het enorm als je voor jezelf debugging-informatie kunt oproepen, deze geven je namelijk inzicht in de "toestand" van je applicatie en leggen meestal direct de vinger op de zere plek. Want nu krijg ik de indruk dat je eigen applicatie een soort van black box voor jou is waar je af en toe een duw tegen geeft en dan rolt er weer iets uit dat niet doet wat jij wilt. Dat is niet echt een optimale manier om te ontwikkelen.
Hierbij helpt het ook als je vantevoren een beeld hebt van wat je met je eerstvolgende stap wilt bereiken, en hierbij bedoel ik niet simpelweg het eindresultaat. Ontwikkelen is een iteratief proces. Als je nu bijvoorbeeld eerst zorgt dat je formulier op orde is, en de verwerkingsstap alle informatie in de juiste vorm ontvangt (dus ook je sessie-data), dan heb je een werkende uitgangssituatie voor de volgende stap. En dump die informatie ook eens naar je scherm. Wat zit er initieel in deze verwerkingsstap in $_POST en $_SESSION, hoe ziet deze data er uit en hoe is deze gestructureerd? Als jij dit niet duidelijk kunt maken naar jezelf en anderen, hoe moeten wij daar dan chocola van kunnen maken?
Nu lijk je met alle geweld alles in één keer te willen doen. Deel dit gewoon op in stappen en zorg voor inzicht door debugging, dit werkt echt stukken makkelijker.
Gewijzigd op 14/11/2018 13:43:35 door Thomas van den Heuvel
Quote:
Hierbij helpt het ook als je vantevoren een beeld hebt van wat je met je eerstvolgende stap wilt bereiken, en hierbij bedoel ik niet simpelweg het eindresultaat. Ontwikkelen is een iteratief proces. Als je nu bijvoorbeeld eerst zorgt dat je formulier op orde is, en de verwerkingsstap alle informatie in de juiste vorm ontvangt (dus ook je sessie-data), dan heb je een werkende uitgangssituatie voor de volgende stap. En dump die informatie ook eens naar je scherm. Wat zit er initieel in deze verwerkingsstap in $_POST en $_SESSION, hoe ziet deze data er uit en hoe is deze gestructureerd? Als jij dit niet duidelijk kunt maken naar jezelf en anderen, hoe moeten wij daar dan chocola van kunnen maken?
ik heb het formulier werkend en de S_SESSION data voor de tweede stap is bekend die wordt op deze pagina ook gebruikt. de tweede stap is de keuze welke keuze ook wordt gedumpt op de pagina ($_POST). Ook het optellen van de kolommen werkt alleen wordt de info uit de S_SESSION en $_POST niet goed verwerkt in de query om het gestemd met 1 te verhogen.
ook moet ik tegelijk met de gestemd kolom ook het aantal kolom van de kandidaten met een ophogen na een stem.
ook de check of een ingelogde user al een keer heeft gestemd werkt, alleen dan moet de teller voor gestemd wel werken :-).
misschien het iteratieproces van een beginner met weinig ervaring maar ik doe mijn best om het zelf uit te vinden en op te lossen, maar soms is een zetje zeer welkom.
Toevoeging op 14/11/2018 18:56:43:
ik heb de volgende debug info
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Array
(
[username] =>
[user_info] => Array
(
[id] => 2
[email] => [email protected]
[password] => pass
[name] => Demo 2
[phone] => +9876543210
[content] => another text content for Demo2 user
[last_login] => 2018-11-14 18:01:57
[pogingen] => 18
[gestemd] => 0
)
)
(
[username] =>
[user_info] => Array
(
[id] => 2
[email] => [email protected]
[password] => pass
[name] => Demo 2
[phone] => +9876543210
[content] => another text content for Demo2 user
[last_login] => 2018-11-14 18:01:57
[pogingen] => 18
[gestemd] => 0
)
)
verder heb gezocht naar $_SESSION variabele in query en kwam op de volgende notatie.
Code (php)
1
$query = " UPDATE php_users_login SET gestemd = gestemd+1 WHERE id='{$_SESSION['id']}'";
Met deze notatie krijg ik idd geen foutmelding, maar ook deze doet niet de gestemd kolom van de betreffende id verhogen?
Dus, wat heb je nu precies? Alleen een query is een beetje zinloos.
In $query zit enkel de vraag die je aan MySQL wilt stellen:
"Kan je in tabel 'php_users_login' het veld 'gestemd' aanpassen door de waardes te verhogen met 1 waarbij het veld 'id' gelijk is aan...(waarde van 'id' index in je sessie die (hopelijk) eerder bekend gemaakt is in je code)
Met mysql(i)_query() vraag je dus of of die vraag gesteld kan worden. Hierop krijg je terug dat er antwoord kan worden gegeven (zie volgende stap), of dat het niet kan waarbij je moet doorvragen met mysql(i)_error().
En met mysql(i)_fetch_assoc / -array vraag je dus wat de antwoorden zijn, als je in de vorige stap die bevestiging kreeg.
Gewijzigd op 14/11/2018 19:56:17 door - Ariën -
10 tegen 1 dat $_SESSION['id'] leeg is. Dat zou in dit geval nog steeds een werkende query opleveren als MySQL niet op strict mode staat (en dat is ongetwijfeld niet het geval).
Het is niet nodig en ook onverstandig om andere profielinformatie op te slaan in de sessie, dit is echt nergens voor nodig. Het enige wat daar eigenlijk in thuishoort qua user informatie is het user id, de rest is opvraagbaar uit de database op het moment dat daar behoefte aan is.
Dit om enerzijds te voorkomen dat sessies "rijdende archieven" worden en anderzijds omdat wanneer deze profielinformatie aangepast wordt op de website (als daar functionaliteit voor is) dat je deze op twee plaatsen moet gaan bijhouden of in ieder geval elke keer zal moeten updaten in de sessie als hier iets op de website iets in wordt veranderd wat onwijs onpraktisch is...
Gewijzigd op 15/11/2018 00:26:38 door Thomas van den Heuvel
- Ariën - op 14/11/2018 19:54:51:
Hoe een query werkt....
In $query zit enkel de vraag die je aan MySQL wilt stellen:
"Kan je in tabel 'php_users_login' het veld 'gestemd' aanpassen door de waardes te verhogen met 1 waarbij het veld 'id' gelijk is aan...(waarde van 'id' index in je sessie die (hopelijk) eerder bekend gemaakt is in je code)
Met mysql(i)_query() vraag je dus of of die vraag gesteld kan worden. Hierop krijg je terug dat er antwoord kan worden gegeven (zie volgende stap), of dat het niet kan waarbij je moet doorvragen met mysql(i)_error().
En met mysql(i)_fetch_assoc / -array vraag je dus wat de antwoorden zijn, als je in de vorige stap die bevestiging kreeg.
In $query zit enkel de vraag die je aan MySQL wilt stellen:
"Kan je in tabel 'php_users_login' het veld 'gestemd' aanpassen door de waardes te verhogen met 1 waarbij het veld 'id' gelijk is aan...(waarde van 'id' index in je sessie die (hopelijk) eerder bekend gemaakt is in je code)
Met mysql(i)_query() vraag je dus of of die vraag gesteld kan worden. Hierop krijg je terug dat er antwoord kan worden gegeven (zie volgende stap), of dat het niet kan waarbij je moet doorvragen met mysql(i)_error().
En met mysql(i)_fetch_assoc / -array vraag je dus wat de antwoorden zijn, als je in de vorige stap die bevestiging kreeg.
wat ik vreemd vind is dat dit wel werkt met aantal pogingen incrementen maar niet met gestemd zelfs al gebruik ik de fetch?
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$error = '';
if(isset($_POST['stem'])){
echo $_POST['kandidaat'];
$sql = "SELECT * FROM ".$SETTINGS["USERS"]." WHERE `email` = '".mysql_real_escape_string($_POST['email'])."' AND `password` = '".mysql_real_escape_string($_POST['password'])."'";
$sql_result = mysql_query ($sql, $connection ) or die ('request "Could not execute SQL query" '.$sql);
$user = mysql_fetch_assoc($sql_result);
if(!empty($user)){
$_SESSION['user_info'] = $user;
$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1 WHERE id=".$user['id'];
//$_SESSION['user_info'] = $user;
//$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1 WHERE id=".$_SESSION['id'];
//$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1";
//$query = " UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal+1";
//$query = " UPDATE php_users_login SET gestemd = gestemd+1 WHERE id='{$_SESSION['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 . ': ' . mysql_error());
}
}
?>
$error = '';
if(isset($_POST['stem'])){
echo $_POST['kandidaat'];
$sql = "SELECT * FROM ".$SETTINGS["USERS"]." WHERE `email` = '".mysql_real_escape_string($_POST['email'])."' AND `password` = '".mysql_real_escape_string($_POST['password'])."'";
$sql_result = mysql_query ($sql, $connection ) or die ('request "Could not execute SQL query" '.$sql);
$user = mysql_fetch_assoc($sql_result);
if(!empty($user)){
$_SESSION['user_info'] = $user;
$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1 WHERE id=".$user['id'];
//$_SESSION['user_info'] = $user;
//$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1 WHERE id=".$_SESSION['id'];
//$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1";
//$query = " UPDATE ".$SETTINGS["kandidaat"]." SET aantal = aantal+1";
//$query = " UPDATE php_users_login SET gestemd = gestemd+1 WHERE id='{$_SESSION['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 . ': ' . mysql_error());
}
}
?>
deze werkt niet terwijl deze op de index pagina wel werkt?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if(isset($_POST['is_login'])){
$sql = "SELECT * FROM ".$SETTINGS["USERS"]." WHERE `email` = '".mysql_real_escape_string($_POST['email'])."' AND `password` = '".mysql_real_escape_string($_POST['password'])."'";
$sql_result = mysql_query ($sql, $connection ) or die ('request "Could not execute SQL query" '.$sql);
$user = mysql_fetch_assoc($sql_result);
if(!empty($user)){
$_SESSION['user_info'] = $user;
$query = " UPDATE ".$SETTINGS["USERS"]." SET last_login = NOW(), pogingen = pogingen+1 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);
header("Location: stemmen.php");
}
else{
$error = 'Wrong email or password.';
}
}
if(isset($_GET['ac']) && $_GET['ac'] == 'logout'){
$_SESSION['user_info'] = null;
unset($_SESSION['user_info']);
}
?>
$sql = "SELECT * FROM ".$SETTINGS["USERS"]." WHERE `email` = '".mysql_real_escape_string($_POST['email'])."' AND `password` = '".mysql_real_escape_string($_POST['password'])."'";
$sql_result = mysql_query ($sql, $connection ) or die ('request "Could not execute SQL query" '.$sql);
$user = mysql_fetch_assoc($sql_result);
if(!empty($user)){
$_SESSION['user_info'] = $user;
$query = " UPDATE ".$SETTINGS["USERS"]." SET last_login = NOW(), pogingen = pogingen+1 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);
header("Location: stemmen.php");
}
else{
$error = 'Wrong email or password.';
}
}
if(isset($_GET['ac']) && $_GET['ac'] == 'logout'){
$_SESSION['user_info'] = null;
unset($_SESSION['user_info']);
}
?>
Toevoeging op 15/11/2018 01:25:49:
Ben van Velzen op 14/11/2018 21:37:10:
10 tegen 1 dat $_SESSION['id'] leeg is. Dat zou in dit geval nog steeds een werkende query opleveren als MySQL niet op strict mode staat (en dat is ongetwijfeld niet het geval).
ik deed een echo $_SESSION['id'] maar kreeg geen respons.
heb de query veranderd
Code (php)
1
$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1 WHERE id={$_SESSION['user_info']['id']}";
haal ik where eraf:
worden beide users incremented
Gewijzigd op 15/11/2018 00:48:24 door Hans Zijlstra
Doe dan eens een print_r($_SESSION); vlak voor je de query opstelt. Kijk wat daar in staat.
SQL
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
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
CREATE TABLE poll_polls (
pol_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
pol_active BOOL NOT NULL DEFAULT 0,
pol_name VARCHAR(255) NOT NULL,
pol_description TEXT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE poll_options (
pop_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
pop_poll_id INT UNSIGNED NOT NULL,
pop_description VARCHAR(255) NOT NULL,
pop_order INT UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE poll_options ADD FOREIGN KEY (pop_poll_id) REFERENCES poll_polls (pol_id) ON DELETE CASCADE;
CREATE TABLE poll_votes (
pvo_poll_id INT UNSIGNED NOT NULL,
pvo_option_id INT UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE poll_votes ADD FOREIGN KEY (pvo_poll_id) REFERENCES poll_polls (pol_id) ON DELETE CASCADE;
ALTER TABLE poll_votes ADD FOREIGN KEY (pvo_option_id) REFERENCES poll_options (pop_id) ON DELETE CASCADE;
CREATE TABLE poll_participants (
ppa_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
ppa_poll_id INT UNSIGNED NOT NULL,
ppa_email VARCHAR(255) NOT NULL,
ppa_token VARCHAR(255) NOT NULL,
ppa_voted BOOL NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE poll_participants ADD FOREIGN KEY (ppa_poll_id) REFERENCES poll_polls (pol_id) ON DELETE CASCADE;
pol_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
pol_active BOOL NOT NULL DEFAULT 0,
pol_name VARCHAR(255) NOT NULL,
pol_description TEXT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE poll_options (
pop_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
pop_poll_id INT UNSIGNED NOT NULL,
pop_description VARCHAR(255) NOT NULL,
pop_order INT UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE poll_options ADD FOREIGN KEY (pop_poll_id) REFERENCES poll_polls (pol_id) ON DELETE CASCADE;
CREATE TABLE poll_votes (
pvo_poll_id INT UNSIGNED NOT NULL,
pvo_option_id INT UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE poll_votes ADD FOREIGN KEY (pvo_poll_id) REFERENCES poll_polls (pol_id) ON DELETE CASCADE;
ALTER TABLE poll_votes ADD FOREIGN KEY (pvo_option_id) REFERENCES poll_options (pop_id) ON DELETE CASCADE;
CREATE TABLE poll_participants (
ppa_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
ppa_poll_id INT UNSIGNED NOT NULL,
ppa_email VARCHAR(255) NOT NULL,
ppa_token VARCHAR(255) NOT NULL,
ppa_voted BOOL NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE poll_participants ADD FOREIGN KEY (ppa_poll_id) REFERENCES poll_polls (pol_id) ON DELETE CASCADE;
test data
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
insert into poll_polls (pol_active, pol_name, pol_description) values (1, 'Test poll', 'This is a test poll. To be able to cast votes you need to create records in the poll_participants table with generated tokens and then distribute these amongst the participants.');
insert into poll_options (pop_poll_id, pop_description, pop_order) values (1, 'the first option', 1), (1, 'the second', 2), (1, 'and the third', 3);
insert into poll_participants (ppa_poll_id, ppa_email, ppa_token, ppa_voted) values
(1, '[email protected]', '46108d84a11db44b2a95190a2d0dba1570a7321b', 0),
(1, '[email protected]', '60671281ffcb0bf0e6493fed8c2a12965e84610c', 0),
(1, '[email protected]', '07ad975599881d2f61b7b55a290772983f444a0a', 0);
insert into poll_polls (pol_active, pol_name, pol_description) values (1, 'Another test poll', 'This is another test poll.');
insert into poll_options (pop_poll_id, pop_description, pop_order) values (2, 'apples', 1), (2, 'oranges', 2);
insert into poll_participants (ppa_poll_id, ppa_email, ppa_token, ppa_voted) values
(2, '[email protected]', '400f2f57f30c7eb18ddf770d7644d403cfe94748', 0),
(2, '[email protected]', '0c27e4a6598c8b870c3d88aa37e8e2e6ebb9e538', 0);
insert into poll_options (pop_poll_id, pop_description, pop_order) values (1, 'the first option', 1), (1, 'the second', 2), (1, 'and the third', 3);
insert into poll_participants (ppa_poll_id, ppa_email, ppa_token, ppa_voted) values
(1, '[email protected]', '46108d84a11db44b2a95190a2d0dba1570a7321b', 0),
(1, '[email protected]', '60671281ffcb0bf0e6493fed8c2a12965e84610c', 0),
(1, '[email protected]', '07ad975599881d2f61b7b55a290772983f444a0a', 0);
insert into poll_polls (pol_active, pol_name, pol_description) values (1, 'Another test poll', 'This is another test poll.');
insert into poll_options (pop_poll_id, pop_description, pop_order) values (2, 'apples', 1), (2, 'oranges', 2);
insert into poll_participants (ppa_poll_id, ppa_email, ppa_token, ppa_voted) values
(2, '[email protected]', '400f2f57f30c7eb18ddf770d7644d403cfe94748', 0),
(2, '[email protected]', '0c27e4a6598c8b870c3d88aa37e8e2e6ebb9e538', 0);
/pagetype/poll.php
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
<?php
require_once './pagetype.php';
class Pagetype_Poll extends Pagetype
{
protected function init() {
// define the actions that do not produce output
if (in_array($this->action, array(
'voteProcess',
))) {
$this->hasOutput = false;
}
}
protected function actionDefault() {
$this->title = 'Poll overview';
?><div class="wrapper">
<h1>Poll overview</h1><?php
$res = $this->db->query(
'SELECT pol_id AS id, pol_name AS name, pol_description AS description
FROM poll_polls
WHERE pol_active = 1
ORDER BY pol_id DESC'
);
if ($res->num_rows > 0) {
while ($pollData = $res->fetch_object()) {
?><h2><?php echo $this->escape($pollData->name); ?></h2>
<p><?php echo $this->escape($pollData->description); ?></p>
<p><a href="?action=show&poll=<?php echo $this->escape($pollData->id); ?>">> show details</a><?php
}
} else {
?><p>There currently are no active polls.</p><?php
}
$res->free();
?></div><?php
} // actionDefault
protected function actionShow() {
if (isset($_GET['poll']) && Helper::isIndex($_GET['poll'])) {
$pollId = $_GET['poll'];
} else {
throw new Exception('Poll.show: required poll id not found or not valid');
}
$this->title = 'Poll details';
?><div class="wrapper">
<h1>Poll details</h1><?php
// get all the poll data
$res = $this->db->query(
"SELECT pol_active AS active, pol_name AS name, pol_description AS description
FROM poll_polls
WHERE pol_id = '".$this->db->real_escape_string($pollId)."'"
);
if ($res->num_rows == 1) {
$pollData = $res->fetch_object();
if ($pollData->active == 1) {
?><h2><?php echo $this->escape($pollData->name); ?></h2>
<p><?php echo $this->escape($pollData->description); ?></p><?php
// vote data
?><h2>Votes</h2><?php
$res2 = $this->db->query(
"SELECT pop_description AS description, COUNT(pvo_option_id) AS votes
FROM poll_options
LEFT JOIN poll_votes ON (pvo_option_id = pop_id)
WHERE pop_poll_id = '".$this->db->real_escape_string($pollId)."'
GROUP BY pop_id
ORDER BY pop_order"
);
?><table border="1">
<thead>
<tr>
<th>option</th>
<th>votes</th>
</tr>
</thead>
<tbody><?php
while ($optionData = $res2->fetch_object()) {
?><tr>
<td><?php echo $this->escape($optionData->description); ?></td>
<td align="right"><?php echo $this->escape($optionData->votes); ?></td>
</tr><?php
}
?></tbody>
</table>
<p>If you have received a voting token, copypaste it here to cast a vote:</p>
<form action="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>" method="get" accept-charset="UTF-8">
<input type="hidden" name="action" value="vote">
<input type="hidden" name="poll" value="<?php echo $this->escape($pollId); ?>">
<input type="text" name="token" size="50" autocomplete="off"> <button type="submit">to the voting page</button>
</form><?php
} else {
// inactive poll
?><h2>Poll inactive</h2>
<p>The poll you are trying to look up is no longer active.</p><?php
}
} else {
// non existing poll
?><h2>Poll not found</h2>
<p>The poll you are trying to look up does not exist (anymore).</p><?php
}
$res->free();
?><p><a href="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>">< back to overview</a></p>
</div><?php
} // actionShow
protected function actionVote() {
// this action requires at least a valid (correctly formatted) poll id
if (isset($_GET['poll']) && Helper::isIndex($_GET['poll'])) {
$pollId = $_GET['poll'];
} else {
throw new Exception('Poll.vote: required id not found or not valid');
}
// check token - later on you could enforce more strict checking, for example with a function like Helper::checkToken($token)
$votingToken = false;
if (isset($_GET['token'])) {
$votingToken = $_GET['token'];
}
$this->title = 'Poll vote';
?><div class="wrapper">
<h1>Poll vote</h1><?php
if (isset($_GET['errors'])) {
?><div class="error">Something went wrong. Please review and resubmit your data.</div><?php
}
// check if poll exists
$res = $this->db->query(
"SELECT pol_active AS active, pol_name AS name, pol_description AS description
FROM poll_polls
WHERE pol_id = '".$this->db->real_escape_string($pollId)."'"
);
if ($res->num_rows == 1) {
$pollData = $res->fetch_object();
if ($pollData->active == 1) {
// check if token is valid
$res2 = $this->db->query(
"SELECT ppa_id AS id, ppa_voted AS voted
FROM poll_participants
WHERE ppa_poll_id = '".$this->db->real_escape_string($pollId)."'
AND ppa_token = '".$this->db->real_escape_string($votingToken)."'"
);
if ($res2->num_rows == 1) {
$tokenData = $res2->fetch_object();
if ($tokenData->voted == 1) {
?><h2>Invalid token</h2>
<p>The token you supplied has already been used for voting.</p><?php
} else {
// we finally made it to the part where you can actually vote - whee~
$res3 = $this->db->query(
"SELECT pop_id AS id, pop_description AS description
FROM poll_options
WHERE pop_poll_id = '".$this->db->real_escape_string($pollId)."'
ORDER BY pop_order"
);
?><h2><?php echo $this->escape($pollData->name); ?></h2>
<p><?php echo $this->escape($pollData->description); ?></p>
<p>Submit your vote with the form below:</p>
<form action="<?php echo $this->escape($_SERVER['SCRIPT_NAME']); ?>?action=voteProcess" method="POST" onsubmit="return confirm('Since this is an anonymous vote, this vote cannot be undone.\nAre you sure?');">
<input type="hidden" name="poll" value="<?php echo $this->escape($pollId); ?>">
<input type="hidden" name="token" value="<?php echo $this->escape($votingToken); ?>">
<table border="1">
<tbody><?php
while ($optionData = $res3->fetch_object()) {
$fieldId = 'vote_'.$optionData->id;
?><tr>
<td>
<input type="radio" name="vote" id="<?php echo $this->escape($fieldId); ?>" value="<?php echo $this->escape($optionData->id); ?>">
<label for="<?php echo $this->escape($fieldId); ?>" style="padding-right: 50px;"><?php echo $this->escape($optionData->description); ?></label>
</td>
</tr><?php
}
?></tbody>
</table>
<p><button type="submit">Cast vote</button></p>
</form><?php
$res3->free();
}
} else {
// invalid token
?><h2>Invalid token</h2>
<p>The token you supplied is not valid.</p><?php
}
$res2->free();
} else {
// inactive poll
?><h2>Poll inactive</h2>
<p>The poll you are trying to look up is no longer active.</p><?php
}
}
$res->free();
?><p>
<a href="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>?action=show&poll=<?php echo $this->escape($pollId); ?>">< back to poll</a><br>
<a href="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>">< back to overview</a>
</p>
</div><?php
} // actionVote
protected function actionVoteProcess() {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Helper::dump($_POST);
// exit;
// some checks
if (isset($_POST['poll']) && Helper::isIndex($_POST['poll'])) {
$pollId = $_POST['poll'];
} else {
throw new Exception('Poll.voteProcess: missing poll id');
}
if (isset($_POST['token'])) {
$votingToken = $_POST['token'];
} else {
throw new Exception('Poll.voteProcess: missing token');
}
if (isset($_POST['vote']) && Helper::isIndex($_POST['vote'])) {
$voteId = $_POST['vote'];
} else {
// oh dear, someone forgot to vote - if we got this far, just send them back to the form...
$this->redirect($_SERVER['SCRIPT_NAME'].'?action=vote&poll='.$pollId.'&token='.$votingToken.'&errors=1');
}
// now we need to do some final checks during which nothing may be modified
// this is why we need transactions: to guarantee that all these checks are performed as one atomic (undivisible) operation
$this->db->autocommit(false); // effectively starts a transaction
// first check if the poll is active
$res = $this->db->query(
"SELECT pol_id
FROM poll_polls
WHERE pol_id = '".$this->db->real_escape_string($pollId)."'
AND pol_active = 1
FOR UPDATE"
);
if ($res->num_rows == 1) {
// next check if the token is active
$res2 = $this->db->query(
"SELECT ppa_id
FROM poll_participants
WHERE ppa_poll_id = '".$this->db->real_escape_string($pollId)."'
AND ppa_token = '".$this->db->real_escape_string($votingToken)."'
AND ppa_voted = 0
FOR UPDATE"
);
if ($res2->num_rows == 1) {
// finally check if the vote was valid
$res3 = $this->db->query(
"SELECT pop_id
FROM poll_options
WHERE pop_id = '".$this->db->real_escape_string($voteId)."'
AND pop_poll_id = '".$this->db->real_escape_string($pollId)."'
FOR UPDATE"
);
if ($res3->num_rows == 1) {
// the stars align - cast the vote and update the participants table
$this->db->query(
"INSERT INTO poll_votes (
pvo_poll_id,
pvo_option_id
) VALUES (
'".$this->db->real_escape_string($pollId)."',
'".$this->db->real_escape_string($voteId)."'
)"
);
$this->db->query(
"UPDATE poll_participants
SET ppa_voted = 1
WHERE ppa_poll_id = '".$this->db->real_escape_string($pollId)."'
AND ppa_token = '".$this->db->real_escape_string($votingToken)."'"
);
} else {
// invalid vote - we are done
$this->db->rollback();
throw new Exception('Poll.voteProcess: invalid option');
}
} else {
// not an active token - we are done
$this->db->rollback();
throw new Exception('Poll.voteProcess: inactive or invalid token');
}
} else {
// not an active poll - we are done
$this->db->rollback();
throw new Exception('Poll.voteProcess: inactive poll');
}
$this->db->autocommit(true); // commit transaction
$this->redirect($_SERVER['SCRIPT_NAME'].'?action=voteComplete&poll='.$pollId);
}
} // actionVoteProcess
protected function actionVoteComplete() {
$pollId = false;
if (isset($_GET['poll']) && Helper::isIndex($_GET['poll'])) {
$pollId = $_GET['poll'];
}
$this->title = 'Vote cast!';
?><div class="wrapper">
<h1>Vote cast!</h1>
<p>Your vote has been successfully cast.</p>
<p>
<a href="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>?action=show&poll=<?php echo $this->escape($pollId); ?>">< back to poll</a><br>
<a href="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>">< back to overview</a>
</p>
</div><?php
} // actionVoteComplete
protected function actionGenerateTokens() {
?><pre><?php
for ($i=0; $i < 10; $i++) {
echo Helper::getRandomToken()."\n";
}
?></pre><?php
} // actionGenerateTokens
} // Pagetype_Poll
?>
require_once './pagetype.php';
class Pagetype_Poll extends Pagetype
{
protected function init() {
// define the actions that do not produce output
if (in_array($this->action, array(
'voteProcess',
))) {
$this->hasOutput = false;
}
}
protected function actionDefault() {
$this->title = 'Poll overview';
?><div class="wrapper">
<h1>Poll overview</h1><?php
$res = $this->db->query(
'SELECT pol_id AS id, pol_name AS name, pol_description AS description
FROM poll_polls
WHERE pol_active = 1
ORDER BY pol_id DESC'
);
if ($res->num_rows > 0) {
while ($pollData = $res->fetch_object()) {
?><h2><?php echo $this->escape($pollData->name); ?></h2>
<p><?php echo $this->escape($pollData->description); ?></p>
<p><a href="?action=show&poll=<?php echo $this->escape($pollData->id); ?>">> show details</a><?php
}
} else {
?><p>There currently are no active polls.</p><?php
}
$res->free();
?></div><?php
} // actionDefault
protected function actionShow() {
if (isset($_GET['poll']) && Helper::isIndex($_GET['poll'])) {
$pollId = $_GET['poll'];
} else {
throw new Exception('Poll.show: required poll id not found or not valid');
}
$this->title = 'Poll details';
?><div class="wrapper">
<h1>Poll details</h1><?php
// get all the poll data
$res = $this->db->query(
"SELECT pol_active AS active, pol_name AS name, pol_description AS description
FROM poll_polls
WHERE pol_id = '".$this->db->real_escape_string($pollId)."'"
);
if ($res->num_rows == 1) {
$pollData = $res->fetch_object();
if ($pollData->active == 1) {
?><h2><?php echo $this->escape($pollData->name); ?></h2>
<p><?php echo $this->escape($pollData->description); ?></p><?php
// vote data
?><h2>Votes</h2><?php
$res2 = $this->db->query(
"SELECT pop_description AS description, COUNT(pvo_option_id) AS votes
FROM poll_options
LEFT JOIN poll_votes ON (pvo_option_id = pop_id)
WHERE pop_poll_id = '".$this->db->real_escape_string($pollId)."'
GROUP BY pop_id
ORDER BY pop_order"
);
?><table border="1">
<thead>
<tr>
<th>option</th>
<th>votes</th>
</tr>
</thead>
<tbody><?php
while ($optionData = $res2->fetch_object()) {
?><tr>
<td><?php echo $this->escape($optionData->description); ?></td>
<td align="right"><?php echo $this->escape($optionData->votes); ?></td>
</tr><?php
}
?></tbody>
</table>
<p>If you have received a voting token, copypaste it here to cast a vote:</p>
<form action="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>" method="get" accept-charset="UTF-8">
<input type="hidden" name="action" value="vote">
<input type="hidden" name="poll" value="<?php echo $this->escape($pollId); ?>">
<input type="text" name="token" size="50" autocomplete="off"> <button type="submit">to the voting page</button>
</form><?php
} else {
// inactive poll
?><h2>Poll inactive</h2>
<p>The poll you are trying to look up is no longer active.</p><?php
}
} else {
// non existing poll
?><h2>Poll not found</h2>
<p>The poll you are trying to look up does not exist (anymore).</p><?php
}
$res->free();
?><p><a href="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>">< back to overview</a></p>
</div><?php
} // actionShow
protected function actionVote() {
// this action requires at least a valid (correctly formatted) poll id
if (isset($_GET['poll']) && Helper::isIndex($_GET['poll'])) {
$pollId = $_GET['poll'];
} else {
throw new Exception('Poll.vote: required id not found or not valid');
}
// check token - later on you could enforce more strict checking, for example with a function like Helper::checkToken($token)
$votingToken = false;
if (isset($_GET['token'])) {
$votingToken = $_GET['token'];
}
$this->title = 'Poll vote';
?><div class="wrapper">
<h1>Poll vote</h1><?php
if (isset($_GET['errors'])) {
?><div class="error">Something went wrong. Please review and resubmit your data.</div><?php
}
// check if poll exists
$res = $this->db->query(
"SELECT pol_active AS active, pol_name AS name, pol_description AS description
FROM poll_polls
WHERE pol_id = '".$this->db->real_escape_string($pollId)."'"
);
if ($res->num_rows == 1) {
$pollData = $res->fetch_object();
if ($pollData->active == 1) {
// check if token is valid
$res2 = $this->db->query(
"SELECT ppa_id AS id, ppa_voted AS voted
FROM poll_participants
WHERE ppa_poll_id = '".$this->db->real_escape_string($pollId)."'
AND ppa_token = '".$this->db->real_escape_string($votingToken)."'"
);
if ($res2->num_rows == 1) {
$tokenData = $res2->fetch_object();
if ($tokenData->voted == 1) {
?><h2>Invalid token</h2>
<p>The token you supplied has already been used for voting.</p><?php
} else {
// we finally made it to the part where you can actually vote - whee~
$res3 = $this->db->query(
"SELECT pop_id AS id, pop_description AS description
FROM poll_options
WHERE pop_poll_id = '".$this->db->real_escape_string($pollId)."'
ORDER BY pop_order"
);
?><h2><?php echo $this->escape($pollData->name); ?></h2>
<p><?php echo $this->escape($pollData->description); ?></p>
<p>Submit your vote with the form below:</p>
<form action="<?php echo $this->escape($_SERVER['SCRIPT_NAME']); ?>?action=voteProcess" method="POST" onsubmit="return confirm('Since this is an anonymous vote, this vote cannot be undone.\nAre you sure?');">
<input type="hidden" name="poll" value="<?php echo $this->escape($pollId); ?>">
<input type="hidden" name="token" value="<?php echo $this->escape($votingToken); ?>">
<table border="1">
<tbody><?php
while ($optionData = $res3->fetch_object()) {
$fieldId = 'vote_'.$optionData->id;
?><tr>
<td>
<input type="radio" name="vote" id="<?php echo $this->escape($fieldId); ?>" value="<?php echo $this->escape($optionData->id); ?>">
<label for="<?php echo $this->escape($fieldId); ?>" style="padding-right: 50px;"><?php echo $this->escape($optionData->description); ?></label>
</td>
</tr><?php
}
?></tbody>
</table>
<p><button type="submit">Cast vote</button></p>
</form><?php
$res3->free();
}
} else {
// invalid token
?><h2>Invalid token</h2>
<p>The token you supplied is not valid.</p><?php
}
$res2->free();
} else {
// inactive poll
?><h2>Poll inactive</h2>
<p>The poll you are trying to look up is no longer active.</p><?php
}
}
$res->free();
?><p>
<a href="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>?action=show&poll=<?php echo $this->escape($pollId); ?>">< back to poll</a><br>
<a href="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>">< back to overview</a>
</p>
</div><?php
} // actionVote
protected function actionVoteProcess() {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Helper::dump($_POST);
// exit;
// some checks
if (isset($_POST['poll']) && Helper::isIndex($_POST['poll'])) {
$pollId = $_POST['poll'];
} else {
throw new Exception('Poll.voteProcess: missing poll id');
}
if (isset($_POST['token'])) {
$votingToken = $_POST['token'];
} else {
throw new Exception('Poll.voteProcess: missing token');
}
if (isset($_POST['vote']) && Helper::isIndex($_POST['vote'])) {
$voteId = $_POST['vote'];
} else {
// oh dear, someone forgot to vote - if we got this far, just send them back to the form...
$this->redirect($_SERVER['SCRIPT_NAME'].'?action=vote&poll='.$pollId.'&token='.$votingToken.'&errors=1');
}
// now we need to do some final checks during which nothing may be modified
// this is why we need transactions: to guarantee that all these checks are performed as one atomic (undivisible) operation
$this->db->autocommit(false); // effectively starts a transaction
// first check if the poll is active
$res = $this->db->query(
"SELECT pol_id
FROM poll_polls
WHERE pol_id = '".$this->db->real_escape_string($pollId)."'
AND pol_active = 1
FOR UPDATE"
);
if ($res->num_rows == 1) {
// next check if the token is active
$res2 = $this->db->query(
"SELECT ppa_id
FROM poll_participants
WHERE ppa_poll_id = '".$this->db->real_escape_string($pollId)."'
AND ppa_token = '".$this->db->real_escape_string($votingToken)."'
AND ppa_voted = 0
FOR UPDATE"
);
if ($res2->num_rows == 1) {
// finally check if the vote was valid
$res3 = $this->db->query(
"SELECT pop_id
FROM poll_options
WHERE pop_id = '".$this->db->real_escape_string($voteId)."'
AND pop_poll_id = '".$this->db->real_escape_string($pollId)."'
FOR UPDATE"
);
if ($res3->num_rows == 1) {
// the stars align - cast the vote and update the participants table
$this->db->query(
"INSERT INTO poll_votes (
pvo_poll_id,
pvo_option_id
) VALUES (
'".$this->db->real_escape_string($pollId)."',
'".$this->db->real_escape_string($voteId)."'
)"
);
$this->db->query(
"UPDATE poll_participants
SET ppa_voted = 1
WHERE ppa_poll_id = '".$this->db->real_escape_string($pollId)."'
AND ppa_token = '".$this->db->real_escape_string($votingToken)."'"
);
} else {
// invalid vote - we are done
$this->db->rollback();
throw new Exception('Poll.voteProcess: invalid option');
}
} else {
// not an active token - we are done
$this->db->rollback();
throw new Exception('Poll.voteProcess: inactive or invalid token');
}
} else {
// not an active poll - we are done
$this->db->rollback();
throw new Exception('Poll.voteProcess: inactive poll');
}
$this->db->autocommit(true); // commit transaction
$this->redirect($_SERVER['SCRIPT_NAME'].'?action=voteComplete&poll='.$pollId);
}
} // actionVoteProcess
protected function actionVoteComplete() {
$pollId = false;
if (isset($_GET['poll']) && Helper::isIndex($_GET['poll'])) {
$pollId = $_GET['poll'];
}
$this->title = 'Vote cast!';
?><div class="wrapper">
<h1>Vote cast!</h1>
<p>Your vote has been successfully cast.</p>
<p>
<a href="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>?action=show&poll=<?php echo $this->escape($pollId); ?>">< back to poll</a><br>
<a href="<?php echo $this->escape($_SERVER['SCRIPT_NAME']) ?>">< back to overview</a>
</p>
</div><?php
} // actionVoteComplete
protected function actionGenerateTokens() {
?><pre><?php
for ($i=0; $i < 10; $i++) {
echo Helper::getRandomToken()."\n";
}
?></pre><?php
} // actionGenerateTokens
} // Pagetype_Poll
?>
/debug.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$development = true; // true for development, false for production
if ($development) {
// write errors directly to output
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
// log_errors: whatever is default
// error_log: whatever is default
} else {
// write errors to separate logfile
error_reporting(E_ALL);
ini_set('display_startup_errors', false);
ini_set('display_errors', false);
ini_set('log_errors', true);
ini_set('error_log', '/absolute/path/to/poll.log');
}
?>
$development = true; // true for development, false for production
if ($development) {
// write errors directly to output
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
// log_errors: whatever is default
// error_log: whatever is default
} else {
// write errors to separate logfile
error_reporting(E_ALL);
ini_set('display_startup_errors', false);
ini_set('display_errors', false);
ini_set('log_errors', true);
ini_set('error_log', '/absolute/path/to/poll.log');
}
?>
/helper.php
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
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
<?php
class Helper
{
public static function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
public static function dump($in) {
if (is_array($in)) {
$in = print_r($in, true);
}
echo '<pre>'.self::escape($in).'</pre>';
}
public static function isIndex($in) {
return preg_match('#^[1-9][0-9]*$#', $in) == 1;
}
public static function getRandomToken() {
if (function_exists('openssl_random_pseudo_bytes')) {
return bin2hex(openssl_random_pseudo_bytes(20, $strong));
} else {
return sha1(uniqid(mt_rand(), true));
}
}
}
?>
class Helper
{
public static function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
public static function dump($in) {
if (is_array($in)) {
$in = print_r($in, true);
}
echo '<pre>'.self::escape($in).'</pre>';
}
public static function isIndex($in) {
return preg_match('#^[1-9][0-9]*$#', $in) == 1;
}
public static function getRandomToken() {
if (function_exists('openssl_random_pseudo_bytes')) {
return bin2hex(openssl_random_pseudo_bytes(20, $strong));
} else {
return sha1(uniqid(mt_rand(), true));
}
}
}
?>
/index.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
require_once './debug.php';
require_once './helper.php';
require_once './pagetype/poll.php';
try {
$poll = new Pagetype_Poll();
$poll->execute();
} catch (Exception $e) {
echo 'Exception: '.$e->getMessage();
// echo '<br><pre>'.$e->getTraceAsString().'</pre>'; // extra info
}
?>
require_once './debug.php';
require_once './helper.php';
require_once './pagetype/poll.php';
try {
$poll = new Pagetype_Poll();
$poll->execute();
} catch (Exception $e) {
echo 'Exception: '.$e->getMessage();
// echo '<br><pre>'.$e->getTraceAsString().'</pre>'; // extra info
}
?>
/pagetype.php
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
abstract class PageType
{
protected $action;
protected $hasOutput;
protected $title;
protected $db;
public function __construct() {
$this->action = 'default';
if (isset($_GET['action']) && method_exists($this, 'action'.$_GET['action'])) {
$this->action = $_GET['action'];
}
$this->hasOutput = true;
$this->title = '';
$this->db = new mysqli('127.0.0.1', 'test', 'test', 'test');
$this->db->set_charset('utf8');
}
protected function init() {}
public function execute() {
$this->init();
$action = 'action'.$this->action;
if ($this->hasOutput) {
ob_start();
$this->$action();
$contents = ob_get_clean();
$this->__printHeader();
echo $contents;
$this->__printFooter();
} else {
$this->$action();
}
}
abstract protected function actionDefault();
protected function __printHeader() {
?><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><?php echo $this->escape($this->title); ?></title>
<style type="text/css">
div.wrapper { font-family: sans-serif; }
div.error { width: 500px; background-color: #ffcccc; padding: 10px; margin: 10px 0px; text-align: center; }
</style>
</head><?php
}
protected function __printFooter() {
?><body>
</body>
</html><?php
}
// shorthand
protected function escape($in) {
return Helper::escape($in);
}
public function redirect($link) {
header($_SERVER['SERVER_PROTOCOL'].' 303 See Other');
header('Location: '.$link);
exit;
}
}
?>
abstract class PageType
{
protected $action;
protected $hasOutput;
protected $title;
protected $db;
public function __construct() {
$this->action = 'default';
if (isset($_GET['action']) && method_exists($this, 'action'.$_GET['action'])) {
$this->action = $_GET['action'];
}
$this->hasOutput = true;
$this->title = '';
$this->db = new mysqli('127.0.0.1', 'test', 'test', 'test');
$this->db->set_charset('utf8');
}
protected function init() {}
public function execute() {
$this->init();
$action = 'action'.$this->action;
if ($this->hasOutput) {
ob_start();
$this->$action();
$contents = ob_get_clean();
$this->__printHeader();
echo $contents;
$this->__printFooter();
} else {
$this->$action();
}
}
abstract protected function actionDefault();
protected function __printHeader() {
?><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><?php echo $this->escape($this->title); ?></title>
<style type="text/css">
div.wrapper { font-family: sans-serif; }
div.error { width: 500px; background-color: #ffcccc; padding: 10px; margin: 10px 0px; text-align: center; }
</style>
</head><?php
}
protected function __printFooter() {
?><body>
</body>
</html><?php
}
// shorthand
protected function escape($in) {
return Helper::escape($in);
}
public function redirect($link) {
header($_SERVER['SERVER_PROTOCOL'].' 303 See Other');
header('Location: '.$link);
exit;
}
}
?>
Uiteraard even de database credentials in /pagetype.php aanpassen, alsmede het pad naar je logfile in /debug.php.
Gewijzigd op 15/11/2018 16:58:42 door Thomas van den Heuvel
Ben van Velzen op 15/11/2018 02:03:24:
Doe dan eens een print_r($_SESSION); vlak voor je de query opstelt. Kijk wat daar in staat.
Ben,
dit was de uitkomst van de print_r$_SESSION);
Code (php)
1
Array ( [user_info] => Array ( [id] => 1 [email] => [email protected] [password] => pass [name] => Demo 1 [phone] => +0123456789 [content] => text content for Demo1 user. [last_login] => 2018-11-15 01:11:46 [pogingen] => 22 [gestemd] => 0 ) )
Toevoeging op 15/11/2018 16:43:16:
Thomas, bedankt voor de inspiratie.
Thomas van den Heuvel op 15/11/2018 00:26:27:
Het user id staat waarschijnlijk in $_SESSION['user_info']['id'], niet in $_SESSION['id'].
Code (php)
1
$query = " UPDATE ".$SETTINGS["USERS"]." SET gestemd = gestemd+1 WHERE id={$_SESSION['user_info']['id']}";
nu alleen de $POST['kandidaat'] met 1 verhogen.
Tevens, ook zoals al eerder aangehaald, als het de bedoeling is dat er twéé (of X) queries daadwerkelijk worden uitgevoerd dan zullen er ook evenveel (X) aanroepen van mysql(i)_query() moeten zijn. Zoals gezegd, $query is simpelweg een "string" (een lap tekst). Deze doét verder niets van zichzelf.
er zullen twee query's uitgevoerd moeten worden als de stemknop wordt ingedrukt. maar omdat jullie schreven dat als er twee query's achter elkaar komen alleen de laatste wordt uitgevoerd.
of heb ik dit verkeerd begrepen?
Misschien wordt het op de volgende manier duidelijker:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$sql = 'xxx'; // <-- hier wordt een waarde toegekend aan de variabele $sql
mysql_query($sql); // <-- hier wordt een SQL-query - die in $sql is gedefinieerd - uitgevoerd
$sql = 'yyy'; // <-- hier overschrijf je de inhoud van $sql met een andere waarde
mysql_query($sql); // <-- hier wordt een tweede query uitgevoerd met de nieuwe waarde van $sql
?>
$sql = 'xxx'; // <-- hier wordt een waarde toegekend aan de variabele $sql
mysql_query($sql); // <-- hier wordt een SQL-query - die in $sql is gedefinieerd - uitgevoerd
$sql = 'yyy'; // <-- hier overschrijf je de inhoud van $sql met een andere waarde
mysql_query($sql); // <-- hier wordt een tweede query uitgevoerd met de nieuwe waarde van $sql
?>
Niets weerhoudt je er trouwens ook van om simpelweg het volgende te doen:
Beide codefragmenten hebben hetzelfde effect.
Gewijzigd op 15/11/2018 17:42:17 door Thomas van den Heuvel
ik was al bezig met een query
Code (php)
1
$query = " UPDATE ".$SETTINGS["USERS"].", ".$SETTINGS["kandidaat"]." SET gestemd = gestemd+1, aantal = aantal+1 WHERE id={$_SESSION['user_info']['id']} AND kandidaten={$_POST['kandidaat']}";
alleen krijg ik weer een error
heinArray ( [kandidaat] => hein [stem] => stem ) request "Could not execute SQL query" UPDATE php_users_login, kandidaten SET gestemd = gestemd+1, aantal = aantal+1 WHERE id=2 AND kandidaten=hein: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'de Jong' at line 1
ik zal jouw manier eens proberen.
Je mist quotes om je waarden. Ongetwijfeld dus ook escaping. Alle waarden vereisen quotes EN escaping om het veilig te houden.
Dat heeft er niks mee te maken. De fout zit in het gebruik van de aanhalingstekens. Is het niet slim om eerst eens wat basis-beginselen van het programmeren te leren?
dat is wel slim.
maar omdat ik exact dezelfde quoting gebruik bij beide queries en toch een fout krijg vraag ik mij af of het niet met Array ( [kandidaat] => hein [stem] => stem ) met stem te maken hebben?
heb nu bijna alle variaties quoting wel gehad maar de foutmelding blijft :-(
Gewijzigd op 15/11/2018 18:03:50 door Hans Zijlstra
Pagina: « vorige 1 2 3 4 5 6 volgende »