Probleem met updaten van drie tabellen
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)
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
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
)
)
(
[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)
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
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';
?>
// 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
}
?>
$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?
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
// ...
$checkcon = $conn->query($check);
$check = $checkcon->fetch_assoc();
if($checkcon->num_rows > 0){
// ...
}
// ...
?>
// ...
$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...
Daar had ik nog niet aan gedacht, alles weggooien en opnieuw toevoegen. Klinkt als een goede oplossing, bedankt ik ga het proberen.