Hoe kan ik vragen gekoppeld aan een categorie opslaan in mijn database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Snelle Jaap

Snelle Jaap

12/12/2018 11:02:11
Quote Anchor link
Ik heb een lijst waar mensen categorieen en vragen (hangend onder een bepaalde categorie) kunnen toevoegen. Dat lukt me aardig behalve het toevoegen van de vragen.

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
  }
}

?>


Met bovenstaande code kan ik de array $store printen. Als ik wat voorbeeld gegevens invoer is dit het resultaat:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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
        )

)


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)
PHP script in nieuw venster Selecteer het PHP script
1
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>';
    }
}

?>


$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
 
PHP hulp

PHP hulp

22/12/2024 05:18:46
 
Thomas van den Heuvel

Thomas van den Heuvel

12/12/2018 15:49:09
Quote Anchor link
Allereerst, hoe ziet jouw formulier er uit?
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if($a['name'] == 'category[]') {
    // ...
}
?>

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?
 
Snelle Jaap

Snelle Jaap

12/12/2018 16:02:10
Quote Anchor link
** quoteknip **
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 -
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.