Hoe kan ik vragen gekoppeld aan een categorie opslaan in mijn database
Dit is mijn database structuur (engels want ik had deze vraag ook op stackoverflow gezet zonder antwoord):
templates:
id - template id
title - name of list (template)
id_company (company list belongs to, irrelevant for this question)
questioncat:
id - id of category
title - name of category
tid - template id that the category belongs to
questions:
id - question id
question - the actual question
catid - category id that the questions belong to
Mijn code:
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
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
<?PHP
$conn = new Connection;
$arr = $_POST['lijst'];
$companyid = $_POST['companyid'];
$store = [];
// pull off first arr element
$title = array_shift($arr);
// save title to store
$store['title'] = $title['name'];
// Insert template title and companyid
$inserttemplate = '
INSERT INTO templates (title, id_company) VALUES ("'.$conn->real_escape_string($title["value"]).'","'.$conn->real_escape_string($companyid).'")';
$inserttemplatecon = $conn->query($inserttemplate);
$lastinserted = $conn->inserted_id();
$currCat = '';
foreach($arr as $a) {
$val = $a['value'];
// handle category
if($a['name'] == 'category[]') {
// save cat name
$currCat = $val;
$insertcats = '
INSERT INTO questioncat (title, tid) VALUES ("'.$conn->real_escape_string($currCat).'", "'.$conn->real_escape_string($lastinserted).'")';
$insertcatscon = $conn->query($insertcats);
// init questions array
$store[$currCat] = [];
echo $store[$currCat];
}else {
// add question to question array
$store[$currCat][] = $val;
}
}
?>
$conn = new Connection;
$arr = $_POST['lijst'];
$companyid = $_POST['companyid'];
$store = [];
// pull off first arr element
$title = array_shift($arr);
// save title to store
$store['title'] = $title['name'];
// Insert template title and companyid
$inserttemplate = '
INSERT INTO templates (title, id_company) VALUES ("'.$conn->real_escape_string($title["value"]).'","'.$conn->real_escape_string($companyid).'")';
$inserttemplatecon = $conn->query($inserttemplate);
$lastinserted = $conn->inserted_id();
$currCat = '';
foreach($arr as $a) {
$val = $a['value'];
// handle category
if($a['name'] == 'category[]') {
// save cat name
$currCat = $val;
$insertcats = '
INSERT INTO questioncat (title, tid) VALUES ("'.$conn->real_escape_string($currCat).'", "'.$conn->real_escape_string($lastinserted).'")';
$insertcatscon = $conn->query($insertcats);
// init questions array
$store[$currCat] = [];
echo $store[$currCat];
}else {
// add question to question array
$store[$currCat][] = $val;
}
}
?>
Met bovenstaande code kan ik de array $store printen. Als ik wat voorbeeld gegevens invoer is dit het resultaat:
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
Array
(
[title] => lijsttitle
[Category 1] => Array
(
[0] => Question 1cat1
[1] => Question 2cat1
[2] => Question 3cat1
)
[Category 2] => Array
(
[0] => Question 1cat2
)
[Category 3] => Array
(
[0] => Question 1cat3
)
[Category 4] => Array
(
[0] => Question 1cat4
[1] => Question 2cat4
)
)
(
[title] => lijsttitle
[Category 1] => Array
(
[0] => Question 1cat1
[1] => Question 2cat1
[2] => Question 3cat1
)
[Category 2] => Array
(
[0] => Question 1cat2
)
[Category 3] => Array
(
[0] => Question 1cat3
)
[Category 4] => Array
(
[0] => Question 1cat4
[1] => Question 2cat4
)
)
Het lukt me nu een lijst op te slaan met de categorieen, alleen de vragen bij die categorieen niet.
Ik heb dit geprobeerd:
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
foreach($arr as $a) {
$val = $a['value'];
// handle category
if($a['name'] == 'category[]') {
// save cat name
$currCat = $val;
$insertcats = '
INSERT INTO questioncat (title, tid) VALUES ("'.$conn->real_escape_string($currCat).'", "'.$conn->real_escape_string($lastinserted).'")';
$insertcatscon = $conn->query($insertcats);
// init questions array
$store[$currCat] = [];
}else {
// add question to question array
$store[$currCat][] = $val;
}
foreach($store[$currCat] as $question){
echo $question.'<br>';
}
}
?>
foreach($arr as $a) {
$val = $a['value'];
// handle category
if($a['name'] == 'category[]') {
// save cat name
$currCat = $val;
$insertcats = '
INSERT INTO questioncat (title, tid) VALUES ("'.$conn->real_escape_string($currCat).'", "'.$conn->real_escape_string($lastinserted).'")';
$insertcatscon = $conn->query($insertcats);
// init questions array
$store[$currCat] = [];
}else {
// add question to question array
$store[$currCat][] = $val;
}
foreach($store[$currCat] as $question){
echo $question.'<br>';
}
}
?>
$store[$currCat] loopen om eerst is de vragen te laten zien maar met die code krijg ik dit te zien:
Question 1cat1
Question 1cat1
Question 2cat1
Question 1cat1
Question 2cat1
Question 3cat1
Question 1cat2
Question 1cat3
Question 1cat4
Question 1cat4
Question 2cat4
Zoals je ziet klopt dat niet met de array, hoe komt dat? Ik heb ook al geprobeerd $question leeg te gooien binnen de 1e foreach. Volgens mij ben ik er bijna, als ik de vragen juist kan weergeven lukt het me wel ze in de database te inserten.
Gewijzigd op 12/12/2018 11:35:13 door Snelle Jaap
Wat zit er in $_POST, en in het bijzonder in $_POST['lijst']?
Waarom kopieer je dit naar een aparte variabele $arr? Dit heeft hier geen meerwaarde, het belemmert enkel de leesbaarheid.
Dan, wat probeer je hier precies te doen want het lijkt erop dat je alles tegelijkertijd probeert te doen?
- het koppelen van een template aan een company; jouw databasetabel impliceert dat je meerdere templates zou kunnen koppelen?
- het koppelen van categorieën aan templates?
- het koppelen van vragen aan een categorie?
In wezen zijn dit allemaal verschillende acties, dus ik denk dat je het jezelf nogal moeilijk maakt doordat je alles tegelijkertijd probeert te doen.
En dan dit:
Levert dat if-statement ooit true op? Maar dat hangt dus wederom van $_POST['lijst'] af. Het lijkt alsof die een nogal... exotische opbouw heeft.
Is het niet veel handiger om dit op te delen in verschillende acties? Eerst maakt iemand de templates aan, dan de categorieën en dan de vragen, in die volgorde?
De gets en posts zet ik meestal in een variabele omdat ik dat wat netter vind staan.
Formulier is inderdaad redelijk ingewikkeld opgebouwd je kunt hem ook sorteren en nieuwe categorieen toevoegen met daarin weer nieuwe vragen bij elke categorie.
Wat je zegt klopt inderdaad maar ik heb het al kunnen oplossen. Ik dacht veel te moeilijk na, $store bevatte al precies alle data die ik nodig had. Eerst heb ik de lijst titel uit de array gehaald en daarna de categorieen geloopt (met daarin een insert query) daarin loop ik weer de vragen met weer een insert die gekoppeld zit via het laatst geinserte id.
Edit:
Het is niet nodig om het voorlaatste bericht integraal te quoten. Je kan prima via de (Quick) reply reageren.
Gewijzigd op 12/12/2018 16:04:29 door - Ariën -