Probleem met updaten van drie tabellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Snelle Jaap

Snelle Jaap

27/12/2018 13:32:36
Quote Anchor link
Ik loop tegen iets aan met mijn script.

Momenteel heb ik een script waar je een lijst kunt toevoegen met een lijstnaam, categorieen voor die lijst en vragen onder elke categorie.

De opbouw is als volgt:

templates
id
title
id_company

questioncat
id
title
ordering
tid (id van templates)

questions
id
question
catid (id van questioncat)
ordering

Het inserten van alles werkt prima, dat doe ik zo:

Eerst krijg ik een array binnen die gepost is, deze ziet er bijvoorbeeld zo uit:

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
43
44
45
Array
(
    [0] => Array
        (
            [name] => lijsttitle
            [value] => Lijst nieuw
        )

    [1] => Array
        (
            [name] => category[]
            [value] => cat1
        )

    [2] => Array
        (
            [name] => sortorder
            [value] => 1
        )

    [3] => Array
        (
            [name] => question[]
            [value] => q1
        )

    [4] => Array
        (
            [name] => category[]
            [value] => cat2
        )

    [5] => Array
        (
            [name] => sortorder
            [value] => 2
        )

    [6] => Array
        (
            [name] => question[]
            [value] => q1
        )

)


Met PHP maak ik er wat bruikbaarders van en insert alles:

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
43
44
45
46
47
48
<?PHP
// 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 = '';
    $sortorder = '';

    foreach($arr as $a) {
      $val = $a['value'];
      // handle category
      if($a['name'] == 'category[]') {
        // save cat name
        $currCat = $val;
        // init questions array
        $store[$currCat] = [];
      }
else if($a['name'] == 'sortorder') {
            $sortorder = $val;
        $store[$currCat]['sortorder'] = $val;
      }
else {
        // add question to question array
        $store[$currCat]['question'][] = $val;
      }
    }


    array_shift($store);
    // $key is category name, $lijst is an array with everything belonging to that category
    foreach($store as $keycat => $lijst){
        $sortorder = $lijst['sortorder'];

        $insertcats = '
        INSERT INTO questioncat (title, tid, ordering) VALUES ("'
.$conn->real_escape_string($keycat).'", "'.$conn->real_escape_string($lastinserted).'", "'.$conn->real_escape_string($sortorder).'")';
        $insertcatscon = $conn->query($insertcats);
        $lastinserted1 = $conn->inserted_id();

        $questionarr = $lijst['question'];

            foreach($questionarr as $q){
                $insertquestions = '
                INSERT INTO questions (question, catid) VALUES ("'
.$conn->real_escape_string($q).'", "'.$conn->real_escape_string($lastinserted1).'")';
                $insertquestionscon = $conn->query($insertquestions);
            }
    }

    
    echo 'Uw lijst is toegevoegd';
?>


Bovenstaand werkt maar nu heb ik een check ingebouwd die kijkt of de lijst al bestaat, dat doe ik zo:

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
<?PHP
$check
= '
SELECT *
FROM templates
WHERE title = "'
.$conn->real_escape_string($title["value"]).'"';
$checkcon = $conn->query($check);
$check = $checkcon->fetch_assoc();
// If there is more than 1 result, update data instead of inserting
if($checkcon->num_rows > 0){
    // Hier moet de update code komen
// Else insert data as new list

}else{
    // Hier staat bovenstaande code die ik heb gepost in mijn vraag
}
?>


Het updaten kan niet op dezelfde manier omdat ik het laatst geinserte id pak in die loops bijvoorbeeld met deze regel: $lastinserted1 = $conn->inserted_id();

Dat werkt voor een insert query maar niet een update, ik weet dus niet hoe ik alle drie mijn tabellen kan updaten (of eigenlijk twee want de lijstnaam blijft gelijk, wanneer die is aangepast maakt hij een nieuwe lijst aan). Alle tabellen zijn gelinkt aan elkaar via die ids, hoe kan ik ze updaten op de juiste manier?
 
PHP hulp

PHP hulp

22/09/2020 13:20:09
 
Thomas van den Heuvel

Thomas van den Heuvel

27/12/2018 16:25:14
Quote Anchor link
Dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
// ...
$checkcon = $conn->query($check);
$check = $checkcon->fetch_assoc();
if($checkcon->num_rows > 0){
  // ...
}
// ...
?>

Is sowieso de verkeerde volgorde. Daar haal je eerst iets op, en dan controleer je pas of er uberhaupt een resultaat is? :/

Daarnaast, dit is wat, het tweede/derde topic wat je over hetzelfde onderwerp opent. Dus waarom probeer je ook alweer alles (nog steeds) tegelijkertijd te doen?

Er zijn in principe twee manieren mogelijk:
- geef voldoende informatie mee (zoals record id's) zodat je alles kunt updaten
- gooi alle aanverwante data weg en voeg deze opnieuw toe

Dit laatste is vooral interessant als het wijzig-formulier je de mogelijkheid geeft om ook nieuwe data toe te voegen. Dan kom je namelijk in de rare spagaat terecht dat je moet controleren wat al bestaat, en dat UPDATEn, en zoniet INSERTen. Dan is het veel makkelijker om alles gewoon weg te kieperen en opnieuw toe te voegen.

Welke oplossing je ook kiest, dit is een wijziging die op aardig wat data betrekking heeft. Je wilt dan ook dat deze in het geheel, of in het geheel niet wordt uitgevoerd. Je doet er dus in ieder geval verstandig aan om dit in een transactie te stoppen...
 
Snelle Jaap

Snelle Jaap

27/12/2018 16:30:16
Quote Anchor link
Daar had ik nog niet aan gedacht, alles weggooien en opnieuw toevoegen. Klinkt als een goede oplossing, bedankt ik ga het proberen.
 



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.