Beste PRGers,
Op dit moment ben ik bezig met het ontwikkelen van een online vragenlijst (master thesis) voor een vriendin.
De reden om dit niet uit te besteden aan een "survey software & questionnaire tool" heeft er mee te maken dat er dynamische aspecten zitten (sliders en klikknoppen met achterliggende berekeningen) die SurveyMonkey, Google Forms etc. niet bieden. Derhalve moest er zelf iets in elkaar gezet worden.
Het is wenselijk om de vragenlijst maar één keer te kunnen invullen (per persoon).
Ik ben op zoek naar een mogelijkheid om middels Laravel 5.4 te kunnen detecteren of de gebruiker al een keer de vragenlijst heeft ingevuld.
Ik draai Laravel 5.4 middels laradock op een Ubuntu 16.04 VPS. Ik gebruik voor de opslag van de gebruikers en antwoorden een MySQL database.
De migrations-file voor de beide tabellen ziet er (momenteel) zo uit:
Bij het starten van de vragenlijst wordt de sessie-tabel gevuld. De sessie wordt op deze manier opgebouwd:
Daarna wordt er op de vraag/antwoord pagina de volgende controle toegepast:
Het principe werkt aardig. Alleen vrees ik dat er nu vanuit hetzelfde "huis" met dezelfde "browser / user-agent" de vragenlijst maar één keer ingevuld kan worden, ongeacht dat deze op verschillende machines draaien.
Andersom is ook het geval, dezelfde persoon kan met verschillende "browsers / user-agents" vanuit hetzelfde "huis" de vragenlijst meerdere keren invullen.
Natuurlijk is het inloggen voor deze vragenlijst een no-go. En ik ben me er ook zonder meer van bewust dat dit nooit 100% af te vangen valt voor de "kwaadwillende" gebruiker, maar ik wil in ieder geval een controle inbouwen dat dezelfde computer de vragenlijst maak één keer kan invullen.
Hebben jullie tips?
Alvast bedankt voor jullie bijdrage
Matis
Op dit moment ben ik bezig met het ontwikkelen van een online vragenlijst (master thesis) voor een vriendin.
De reden om dit niet uit te besteden aan een "survey software & questionnaire tool" heeft er mee te maken dat er dynamische aspecten zitten (sliders en klikknoppen met achterliggende berekeningen) die SurveyMonkey, Google Forms etc. niet bieden. Derhalve moest er zelf iets in elkaar gezet worden.
Het is wenselijk om de vragenlijst maar één keer te kunnen invullen (per persoon).
Ik ben op zoek naar een mogelijkheid om middels Laravel 5.4 te kunnen detecteren of de gebruiker al een keer de vragenlijst heeft ingevuld.
Ik draai Laravel 5.4 middels laradock op een Ubuntu 16.04 VPS. Ik gebruik voor de opslag van de gebruikers en antwoorden een MySQL database.
De migrations-file voor de beide tabellen ziet er (momenteel) zo uit:
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
| Schema::create('sessions', function (Blueprint $table) { $table->increments('id'); $table->string('session_id')->unique(); $table->string('ip_address', 45)->nullable(); $table->text('user_agent')->nullable(); $table->string('situation', 1); $table->timestamps(); }); Schema::create('answers', function (Blueprint $table) { $table->increments('id'); $table->integer('session_id')->unsigned(); $table->string('situation'); $table->string('sex'); $table->string('age'); $table->string('education'); $table->string('education_other')->nullable(); $table->string('salary'); $table->string('days'); $table->string('work_hours'); $table->string('satisfied_salary'); $table->string('satisfied_freetime'); $table->string('importance_salary'); $table->string('importance_freetime'); $table->string('want_more'); $table->string('greedy'); $table->string('enough_money'); $table->string('buy_next'); $table->string('never_satisfied'); $table->string('more_better'); $table->string('salary_new'); $table->string('days_new'); $table->timestamps(); $table->foreign('session_id')->references('id')->on('sessions'); |
Bij het starten van de vragenlijst wordt de sessie-tabel gevuld. De sessie wordt op deze manier opgebouwd:
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
| /* class SurveyController extends Controller */ public function show(Request $request) { $ip_address = $request->ip(); if($request->server('HTTP_X_FORWARDED_FOR') !== null) { $ip_address = $request->server('HTTP_X_FORWARDED_FOR'); } $user_agent = $request->server('HTTP_USER_AGENT'); $session = Session::where(['user_agent' => $user_agent, 'ip_address' => $ip_address])->first(); if($session === null) { $count = Answer::count(); $situation = 'a'; if(($count % 2) == 1) { $situation = 'b'; } $session_id = uniqid('', true); $session = new Session; $session->session_id = $session_id; $session->user_agent = $user_agent; $session->ip_address = $ip_address; $session->situation = $situation; $session->save(); } else { $session_id = $session->session_id; $session->touch(); } return redirect()->route('question', ['id' => $session_id]); } |
Daarna wordt er op de vraag/antwoord pagina de volgende controle toegepast:
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
| /* class QuestionController extends Controller */ public function show(Request $request, $id = 0) { $session = Session::where('session_id', $id)->first(); if($session === null) { return redirect()->route('welcome'); } $answer = $session->answer; if($answer !== null) { return redirect()->route('summary'); } $situation = $session->situation; return view('questions', compact('id', 'situation')); } public function save(StoreAnswerPost $request, $id) { $session = Session::where('session_id', $id)->first(); if($session === null) { return redirect()->route('welcome'); } $answer = $session->answer; if($answer !== null) { return redirect()->route('summary'); } $input = $request->all(); unset($input['_token'], $input['id']); $session->answer()->create($input); return redirect()->route('summary'); } |
Het principe werkt aardig. Alleen vrees ik dat er nu vanuit hetzelfde "huis" met dezelfde "browser / user-agent" de vragenlijst maar één keer ingevuld kan worden, ongeacht dat deze op verschillende machines draaien.
Andersom is ook het geval, dezelfde persoon kan met verschillende "browsers / user-agents" vanuit hetzelfde "huis" de vragenlijst meerdere keren invullen.
Natuurlijk is het inloggen voor deze vragenlijst een no-go. En ik ben me er ook zonder meer van bewust dat dit nooit 100% af te vangen valt voor de "kwaadwillende" gebruiker, maar ik wil in ieder geval een controle inbouwen dat dezelfde computer de vragenlijst maak één keer kan invullen.
Hebben jullie tips?
Alvast bedankt voor jullie bijdrage
Matis
If money talks then I'm a mime
If time is money then I'm out of time