From dc68e98d92c30de444538d2c96067718643b81f6 Mon Sep 17 00:00:00 2001 From: Peter Edmond Date: Sat, 31 May 2025 00:16:39 +0100 Subject: [PATCH] Finally extracting questions from the survey. Additional table added to hold questions --- MakeDatabase.sql | 4 ++ README.md | 28 ++++++++++ drawbar.js | 44 +++++++++++++++- get_qid_counts.html | 93 +++++++++++++++----------------- get_qid_counts.php | 35 ++++++++++--- populateGraphics.js | 125 ++++++++++++++++++++++++-------------------- reportTemplate.html | 6 +-- 7 files changed, 213 insertions(+), 122 deletions(-) diff --git a/MakeDatabase.sql b/MakeDatabase.sql index a436629..ac4a601 100644 --- a/MakeDatabase.sql +++ b/MakeDatabase.sql @@ -1,3 +1,7 @@ +/* CREATE THE DATABASE FROM SCRATCH */ + +CREATE database demodb; + USE demodb; CREATE TABLE `Surveys` ( diff --git a/README.md b/README.md index e69de29..986ae99 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,28 @@ +Process required to get data into local database: + +1. +2. getSurveys.php (identifies the surveys and calls: + getData.php to import the data) + +3. getQuestions.php +getQuestionsData.php + +Then the reportTemplate.html will work correctly + +backup database: +mysqldump -u username -p > backup.sql + +restore database: +mysql -u username -p < backup.sql + + + +SURVEYS: +SV_cwKjMqAqGxImjMG - Is the correct template one! + +SV_3pyZVUNpxXm1PZI - is a baaaad one! + + +TESTING: +get_qid_counts.html provides the ability to test the various splicing and dicing with specific questions against a specific survey. +This connects directly to get_qid_counts.php diff --git a/drawbar.js b/drawbar.js index 4133e65..ee9ad7e 100644 --- a/drawbar.js +++ b/drawbar.js @@ -28,7 +28,8 @@ SOFTWARE. function drawBar(id,data) { -//console.log(id); +console.log(id); +console.log(data); const svg = d3.select(`${id}`); const backgroundwidth = +svg.attr("width"); const backgroundradius = 10; @@ -276,7 +277,46 @@ return average; //Needed for the next layer up in the analysis -function doBarData(id,qid) { +function doBarData(id,qid, survey, Q1=0, Q2=0, Q3=0 ) { + // Create the form data object + const formData = new FormData(); + formData.append('qid', qid); + formData.append('survey', survey); + formData.append('Q1', Q1); + formData.append('Q2', Q2); + formData.append('Q3', Q3); + + // Send the form data using fetch + fetch('get_qid_counts.php', { + method: 'POST', + body: formData + }) + .then(response => response.text()) + .then(data => { + // Output result + console.log(data); + const parsed = JSON.parse(data); + + // 2. Clean the keys and build a usable object + const bardata = {}; + parsed.forEach(entry => { + const rawKey = Object.keys(entry)[0]; + const cleanKey = rawKey.replace(/"/g, ''); // Remove extra quotes + bardata[cleanKey] = entry[rawKey]; + }); + + console.log(bardata); + drawBar(id,bardata); + // return data; // Should be an array like [{ value: -3, count: 2 }, ..., { value: 3, count: 5 }] + + }) + .catch(error => { + console.error('Error:', error); + }); +} + + +function Backup() { return fetch('get_qid_counts.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, diff --git a/get_qid_counts.html b/get_qid_counts.html index f878ad1..43d3f04 100644 --- a/get_qid_counts.html +++ b/get_qid_counts.html @@ -1,67 +1,58 @@ - - -QID Value Counts - + + Form Submit Example + -

Query Value Counts by QID

+
+ +
- -
- - -
+ +
-
+ +
- + - diff --git a/get_qid_counts.php b/get_qid_counts.php index 9008be2..a938e71 100644 --- a/get_qid_counts.php +++ b/get_qid_counts.php @@ -15,14 +15,29 @@ if (php_sapi_name() === 'cli') { exit; } $qid = $_POST['qid']; - $q1 = filter_input(INPUT_POST, 'q1', FILTER_VALIDATE_INT); - $q2 = filter_input(INPUT_POST, 'q2', FILTER_VALIDATE_INT); - $q3 = filter_input(INPUT_POST, 'q3', FILTER_VALIDATE_INT); + $input = $_POST['survey'] ?? ''; + + + if (preg_match('/^SV_[a-zA-Z0-9]+$/', $input)) { + // Input is valid + $survey = $input; + } else { + // Invalid format + die("Invalid survey ID format."); + } + + $q1 = filter_input(INPUT_POST, 'Q1', FILTER_VALIDATE_INT); + $q2 = filter_input(INPUT_POST, 'Q2', FILTER_VALIDATE_INT); + $q3 = filter_input(INPUT_POST, 'Q3', FILTER_VALIDATE_INT); + } -$qualifier = ""; +$qualifier = " AND s.surveyId = '${survey}'"; + + if ($q1 > 0) { - $qualifier.=" AND r.Q1 = " . $q1; + $qualifier.=" AND r.Q1 = " . $q1; + } if ($q2 > 0) { @@ -52,7 +67,7 @@ $options = [ try { $pdo = new PDO($dsn, $user, $pass, $options); - $sql = " + $baseSql = " SELECT a.value, COUNT(*) AS count, @@ -61,12 +76,16 @@ try { r.Q3 FROM Answers a INNER JOIN Responses r ON a.responseId = r.id - WHERE a.QID = :qid' . $quantifier . ' + INNER JOIN Surveys s ON a.surveyId = s.id + WHERE a.QID = :qid + "; + + $sql = $baseSql . $qualifier . " GROUP BY a.value, r.Q1, r.Q2, r.Q3 ORDER BY a.value; "; - echo $sql; + //echo $sql; $stmt = $pdo->prepare($sql); $stmt->execute(['qid' => $qid]); diff --git a/populateGraphics.js b/populateGraphics.js index 59b4a16..10b48ca 100644 --- a/populateGraphics.js +++ b/populateGraphics.js @@ -37,8 +37,17 @@ function getAverage(prefix) { } -function loaded(){ - console.log("loaded"); +function getSurveyData(){ + console.log("gettingSurveyData"); + + let survey=document.getElementById("surveyId").value; + console.log("Survey is:"+survey); + + let Q1=document.getElementById("location").value; + let Q2=document.getElementById("level").value; + let Q3=document.getElementById("gov").value; + + let amber = '#ffbf00'; //doBigWhiteTriangle('svg1'); @@ -55,156 +64,156 @@ function loaded(){ //EO ROLES //Great Employee Owners - let average = doBarData('#svg1_1','QID35_7'); + let average = doBarData('#svg1_1','QID35_7',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg1_2','QID35_2'); + doBarData('#svg1_2','QID35_2',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg1_3','QID35_8'); + doBarData('#svg1_3','QID35_8',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg1_4','QID35_9'); + doBarData('#svg1_4','QID35_9',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); - doBarData('#svg1_5','QID35_10'); + doBarData('#svg1_5','QID35_10',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_5'); //Great EO Leaders - average = doBarData('#svg2_1','QID36_7'); + average = doBarData('#svg2_1','QID36_7',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg2_2','QID36_2'); + doBarData('#svg2_2','QID36_2',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg2_3','QID36_8'); + doBarData('#svg2_3','QID36_8',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg2_4','QID36_9'); + doBarData('#svg2_4','QID36_9',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); //Great EO Governance - average = doBarData('#svg3_1','QID37_7'); + average = doBarData('#svg3_1','QID37_7',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg3_2','QID37_2'); + doBarData('#svg3_2','QID37_2',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg3_3','QID37_8'); + doBarData('#svg3_3','QID37_8',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg3_4','QID37_20'); + doBarData('#svg3_4','QID37_20',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); - doBarData('#svg3_5','QID37_21'); + doBarData('#svg3_5','QID37_21',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_5'); - doBarData('#svg3_6','QID37_22'); + doBarData('#svg3_6','QID37_22',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_5'); //EO APPROACH //Great EO Culture - average = doBarData('#svg4_1','QID2_7'); + average = doBarData('#svg4_1','QID2_7',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg4_2','QID2_2'); + doBarData('#svg4_2','QID2_2',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg4_3','QID2_8'); + doBarData('#svg4_3','QID2_8',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg4_4','QID2_9'); + doBarData('#svg4_4','QID2_9',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); //Great EO Engagement - average = doBarData('#svg5_1','QID33_7'); + average = doBarData('#svg5_1','QID33_7',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg5_2','QID33_2'); + doBarData('#svg5_2','QID33_2',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg5_3','QID33_8'); + doBarData('#svg5_3','QID33_8',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg5_4','QID33_9'); + doBarData('#svg5_4','QID33_9',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); //Great EO Stewardship - average = doBarData('#svg6_1','QID34_7'); + average = doBarData('#svg6_1','QID34_7',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg6_2','QID34_2'); + doBarData('#svg6_2','QID34_2',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg6_3','QID34_8'); + doBarData('#svg6_3','QID34_8',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg6_4','QID34_17'); + doBarData('#svg6_4','QID34_17',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); //EO ACTIONS //Great EO Strategy - average = doBarData('#svg7_1','QID40_7'); + average = doBarData('#svg7_1','QID40_7',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg7_2','QID40_2'); + doBarData('#svg7_2','QID40_2',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg7_3','QID40_8'); + doBarData('#svg7_3','QID40_8',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg7_4','QID40_9'); + doBarData('#svg7_4','QID40_9',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); //Great EO Innovation average = doBarData('#svg8_1','QID41_7'); //makeSvgRightClickable('svg1_1'); - doBarData('#svg8_2','QID41_2'); + doBarData('#svg8_2','QID41_2',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg8_3','QID41_19'); + doBarData('#svg8_3','QID41_19',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg8_4','QID41_20'); + doBarData('#svg8_4','QID41_20',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); - doBarData('#svg8_5','QID41_21'); + doBarData('#svg8_5','QID41_21',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_5'); //Great EO Advantage - average = doBarData('#svg9_1','QID42_7'); + average = doBarData('#svg9_1','QID42_7',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg9_2','QID42_2'); + doBarData('#svg9_2','QID42_2',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg9_3','QID42_8'); + doBarData('#svg9_3','QID42_8',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); //EO RESULTS //Great EO Measurement - average = doBarData('#svg10_1','QID44_21'); + average = doBarData('#svg10_1','QID44_21',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg10_2','QID44_7'); + doBarData('#svg10_2','QID44_7',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg10_3','QID44_2'); + doBarData('#svg10_3','QID44_2',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg10_4','QID44_8'); + doBarData('#svg10_4','QID44_8',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); //Great EO Evaluation - average = doBarData('#svg11_1','QID45_24'); + average = doBarData('#svg11_1','QID45_24',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg11_2','QID45_25'); + doBarData('#svg11_2','QID45_25',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg11_3','QID45_26'); + doBarData('#svg11_3','QID45_26',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg11_4','QID45_29'); + doBarData('#svg11_4','QID45_29',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); //Great EO Impact - average = doBarData('#svg12_1','QID46_27'); + average = doBarData('#svg12_1','QID46_27',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_1'); - doBarData('#svg12_2','QID46_28'); + doBarData('#svg12_2','QID46_28',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_2'); - doBarData('#svg12_3','QID46_29'); + doBarData('#svg12_3','QID46_29',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg12_4','QID46_30'); + doBarData('#svg12_4','QID46_30',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); - doBarData('#svg12_5','QID46_31'); + doBarData('#svg12_5','QID46_31',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_5'); - doBarData('#svg12_6','QID46_32'); + doBarData('#svg12_6','QID46_32',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_5'); - doBarData('#svg12_7','QID46_33'); + doBarData('#svg12_7','QID46_33',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_3'); - doBarData('#svg12_8','QID46_34'); + doBarData('#svg12_8','QID46_34',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_4'); - doBarData('#svg12_9','QID46_36'); + doBarData('#svg12_9','QID46_36',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_5'); - doBarData('#svg12_10','QID46_37'); + doBarData('#svg12_10','QID46_37',survey,Q1,Q2,Q3); //makeSvgRightClickable('svg1_5'); diff --git a/reportTemplate.html b/reportTemplate.html index 314f240..075d93e 100644 --- a/reportTemplate.html +++ b/reportTemplate.html @@ -81,17 +81,17 @@ } - +

QUALTRICS SURVEY ANALYSIS TOOL

-

You first need to enter the Survey ID, and press submit in order to get the correct groupings available to select from

+

You first need to enter the Survey ID, and press submit in order to get the correct groupings available to select from. The master template survey is SV_cwKjMqAqGxImjMG if you want a survey to just try out.


- +