Query in insertQuery met WHILE
Ik heb een enquete met daarin hoofdstukken. Via een insert Query in een WHILE LOOP wil ik de enquete inclusief hoofdstukken kunnen kopieren. De enquete word al gekopiereed, het bovenste gedeelte van dit script werkt dus al. Alleen de hoofdstukken gaan niet mee. Soms alleen het eerste hoofdstuk, afhankelijk van de enquete.
Kunnen jullie zien wat er fout is? Ik gebruik voor de hoofdstukken eerst een Query en daarna een INSERT Query in een WHILE. Maar op een of andere manier wil hij niet inserten als een WHILE Loop. Doe ik dit zo goed? Of kan het ook anders?
BVD!
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
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
<?php
//DUPLICATE ENQUETE
$queryenquete = "SELECT * FROM enquete WHERE enqueteid = '$ENQUETE'";
$resultenquete = mysql_query($queryenquete);
$row=mysql_fetch_array($resultenquete);
echo" Enquete <b>$row[titel]</b> gedupliceerd naar <b>$row[titel]2</b><br><br>";
$query_insertenquete = "INSERT INTO enquete SET
bedrijfsid = '".$row['bedrijfsid']."',
adviseurid = '".$row['adviseurid']."',
titel = '".$row['titel']."2',
media = '".$row['media']."',
aktief = 'ja'";
$result_insertenquete = mysql_query($query_insertenquete);
$ID = mysql_insert_id();
// DUPLICATE ALLE HOOFDSTUKKEN
$queryhoofdstuk = "SELECT * FROM hoofdstuk WHERE enqueteid = '$ENQUETE'";
$resulthoofdstuk = mysql_query($queryhoofdstuk);
while ($rowhoofdstuk=mysql_fetch_array($resulthoofdstuk)) {
$query_insert_hoofdstuk = "INSERT INTO hoofdstuk SET
hoofdstuk = '".$ID."',
hoofdstuk = '".$rowhoofdstuk['hoofdstuk']."',
titel = '".$rowhoofdstuk['titel']."',
inleiding = '".$rowhoofdstuk['inleiding']."',
template = '".$rowhoofdstuk['template']."'";
$result_insert_hoofdstuk = mysql_query($query_insert_hoofdstuk);
}?>
//DUPLICATE ENQUETE
$queryenquete = "SELECT * FROM enquete WHERE enqueteid = '$ENQUETE'";
$resultenquete = mysql_query($queryenquete);
$row=mysql_fetch_array($resultenquete);
echo" Enquete <b>$row[titel]</b> gedupliceerd naar <b>$row[titel]2</b><br><br>";
$query_insertenquete = "INSERT INTO enquete SET
bedrijfsid = '".$row['bedrijfsid']."',
adviseurid = '".$row['adviseurid']."',
titel = '".$row['titel']."2',
media = '".$row['media']."',
aktief = 'ja'";
$result_insertenquete = mysql_query($query_insertenquete);
$ID = mysql_insert_id();
// DUPLICATE ALLE HOOFDSTUKKEN
$queryhoofdstuk = "SELECT * FROM hoofdstuk WHERE enqueteid = '$ENQUETE'";
$resulthoofdstuk = mysql_query($queryhoofdstuk);
while ($rowhoofdstuk=mysql_fetch_array($resulthoofdstuk)) {
$query_insert_hoofdstuk = "INSERT INTO hoofdstuk SET
hoofdstuk = '".$ID."',
hoofdstuk = '".$rowhoofdstuk['hoofdstuk']."',
titel = '".$rowhoofdstuk['titel']."',
inleiding = '".$rowhoofdstuk['inleiding']."',
template = '".$rowhoofdstuk['template']."'";
$result_insert_hoofdstuk = mysql_query($query_insert_hoofdstuk);
}?>
Gewijzigd op 01/01/1970 01:00:00 door Bram
Het dupliceren van data is niet wat men met een relationele database in gedachten heeft... Het is juist de bedoeling om de data slechts 1x op te slaan. Mij lijkt het dus volkomen overbodig.
Wanneer iemand dus een enquete wil met ongeveer dezelfde hoofdstukken en vragen hoeft hij deze alleen maar de kopieren en aan te passen. Zo kun je dezelfde enquete gebruiken maar weer meer toespitsen op een andere doelgroep door dezelfde vragen in een andere context te plaatsen.
Het is daarom ook niet mijn vraag of het overbodig is of niet. Ik wil juist weten hoe het wel kan, ik zal eens kijken naar het topic van PHPeric. :)
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// DUPLICATE ALLE HOOFDSTUKKEN
$queryhoofdstuk = "INSERT INTO hoofdstuk SET hoofdstuk = '$ID' SELECT * FROM hoofdstuk WHERE enqueteid = '$ENQUETE'";
$resulthoofdstuk = mysql_query($queryhoofdstuk);
?>
// DUPLICATE ALLE HOOFDSTUKKEN
$queryhoofdstuk = "INSERT INTO hoofdstuk SET hoofdstuk = '$ID' SELECT * FROM hoofdstuk WHERE enqueteid = '$ENQUETE'";
$resulthoofdstuk = mysql_query($queryhoofdstuk);
?>
Dit werkt namelijk niet echt ... :|
Gewijzigd op 01/01/1970 01:00:00 door Bram
Gewijzigd op 01/01/1970 01:00:00 door Bram
Het is per slot van rekening een nieuwe enquete die je aanmaakt toch?
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
//DUPLICATE ENQUETE
$queryenquete = "SELECT * FROM enquete WHERE enqueteid = '$ENQUETE'";
$resultenquete = mysql_query($queryenquete);
$row=mysql_fetch_array($resultenquete);
echo" Enquete <b>$row[titel]</b> gedupliceerd naar <b>$row[titel]2</b><br><br>";
$query_insertenquete = "INSERT INTO enquete SET
bedrijfsid = '".$row['bedrijfsid']."',
adviseurid = '".$row['adviseurid']."',
titel = '".$row['titel']."2',
media = '".$row['media']."',
aktief = 'ja'";
$result_insertenquete = mysql_query($query_insertenquete);
$ID = mysql_insert_id();
// DUPLICATE ALLE HOOFDSTUKKEN
$queryhoofdstuk = "INSERT INTO hoofdstuk SET enquete = '$ID' SELECT * FROM hoofdstuk WHERE enqueteid = '$ENQUETE'";
$resulthoofdstuk = mysql_query($queryhoofdstuk);
?>
//DUPLICATE ENQUETE
$queryenquete = "SELECT * FROM enquete WHERE enqueteid = '$ENQUETE'";
$resultenquete = mysql_query($queryenquete);
$row=mysql_fetch_array($resultenquete);
echo" Enquete <b>$row[titel]</b> gedupliceerd naar <b>$row[titel]2</b><br><br>";
$query_insertenquete = "INSERT INTO enquete SET
bedrijfsid = '".$row['bedrijfsid']."',
adviseurid = '".$row['adviseurid']."',
titel = '".$row['titel']."2',
media = '".$row['media']."',
aktief = 'ja'";
$result_insertenquete = mysql_query($query_insertenquete);
$ID = mysql_insert_id();
// DUPLICATE ALLE HOOFDSTUKKEN
$queryhoofdstuk = "INSERT INTO hoofdstuk SET enquete = '$ID' SELECT * FROM hoofdstuk WHERE enqueteid = '$ENQUETE'";
$resulthoofdstuk = mysql_query($queryhoofdstuk);
?>
Maar dit wil ook nog niet echt werken. Volgens mij is er iets mis met die Query in de Query, ik weet alleen niet zo goed wat.
Gewijzigd op 01/01/1970 01:00:00 door Bram
Maak er anders dit van:
Code (php)
1
2
3
4
5
2
3
4
5
<?
// DUPLICATE ALLE HOOFDSTUKKEN
$queryhoofdstuk = "INSERT INTO hoofdstuk SET enquete = '$ID' WHERE enqueteid = '$ENQUETE'";
$resulthoofdstuk = mysql_query($queryhoofdstuk);
?>
// DUPLICATE ALLE HOOFDSTUKKEN
$queryhoofdstuk = "INSERT INTO hoofdstuk SET enquete = '$ID' WHERE enqueteid = '$ENQUETE'";
$resulthoofdstuk = mysql_query($queryhoofdstuk);
?>
Nu zie ik nog wel dat het niet helemaal klopt. Je selecteerd uit hoofdstukken de Enqueteid's. Daarna vervang je enquete id met $ID. is het niet WHERE hoofdstukid = $hoofdstuk ?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// DUPLICATE ALLE HOOFDSTUKKEN
$queryhoofdstuk = "SELECT * FROM hoofdstuk WHERE enqueteid = '$ENQUETE'";
$resulthoofdstuk = mysql_query($queryhoofdstuk);
while ($rowhoofdstuk=mysql_fetch_array($resulthoofdstuk)) {
$query_insert_hoofdstuk = "INSERT INTO hoofdstuk SET
enqueteid = '".$ID."',
hoofdstuk = '".$rowhoofdstuk['hoofdstuk']."',
titel = '".$rowhoofdstuk['titel']."',
inleiding = '".$rowhoofdstuk['inleiding']."',
template = '".$rowhoofdstuk['template']."'";
$result_insert_hoofdstuk = mysql_query($query_insert_hoofdstuk);
}
?>
// DUPLICATE ALLE HOOFDSTUKKEN
$queryhoofdstuk = "SELECT * FROM hoofdstuk WHERE enqueteid = '$ENQUETE'";
$resulthoofdstuk = mysql_query($queryhoofdstuk);
while ($rowhoofdstuk=mysql_fetch_array($resulthoofdstuk)) {
$query_insert_hoofdstuk = "INSERT INTO hoofdstuk SET
enqueteid = '".$ID."',
hoofdstuk = '".$rowhoofdstuk['hoofdstuk']."',
titel = '".$rowhoofdstuk['titel']."',
inleiding = '".$rowhoofdstuk['inleiding']."',
template = '".$rowhoofdstuk['template']."'";
$result_insert_hoofdstuk = mysql_query($query_insert_hoofdstuk);
}
?>
Hij pakt nu maar 1 hoofdstuk omdat er nergens is te vinden hoeveel hoofdstukken er zijn.
Je moet dus eerst even kijken hoeveel hoofdstukken er zijn en dan dmv een while loop of een for loop het bovenstaande uitvoeren totdat hij alle hoofstukken heeft gehad.
Misschien iets van:
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
<?
$rowhoofdstuk=mysql_fetch_array($resulthoofdstuk);
while ($a <= $aantalhoofstukken){
$query_insert_hoofdstuk = "INSERT INTO hoofdstuk SET
enqueteid = '".$ID."',
hoofdstuk = '".$rowhoofdstuk['hoofdstuk']."',
titel = '".$rowhoofdstuk['titel']."',
inleiding = '".$rowhoofdstuk['inleiding']."',
template = '".$rowhoofdstuk['template']."'";
$result_insert_hoofdstuk = mysql_query($query_insert_hoofdstuk);
$a++;
}
?>
$rowhoofdstuk=mysql_fetch_array($resulthoofdstuk);
while ($a <= $aantalhoofstukken){
$query_insert_hoofdstuk = "INSERT INTO hoofdstuk SET
enqueteid = '".$ID."',
hoofdstuk = '".$rowhoofdstuk['hoofdstuk']."',
titel = '".$rowhoofdstuk['titel']."',
inleiding = '".$rowhoofdstuk['inleiding']."',
template = '".$rowhoofdstuk['template']."'";
$result_insert_hoofdstuk = mysql_query($query_insert_hoofdstuk);
$a++;
}
?>
Weet niet of dat gaat werken (denk het niet) maar zoiets zal de bedoeling gaan worden.
en even een die inbouwen voor als er iets fout gaat:
Gewijzigd op 01/01/1970 01:00:00 door Gerben van Erkelens
Maar kun je mij vertellen hoe je dat met $a <= $aantalhoofstukken bedoeld? En waar ik dat vandaan haal? of moet ik $aantalhoofdstukken eers uit een num_rows halen?
Hij geeft nu namelijk aan:
Parse error: syntax error, unexpected T_WHILE
$a is eigenlijk de variabele die steeds wordt opgeteld totdat hij dan bijv. 4 bereikt. Hij heeft dan alle hoofdstukken gehad zeg maar.
Die error weet ik zo 1 2 3 niet, heeft met de codering te maken. Weet niet precies hoe dat in mekaar zit.
Bram:
Dupliceren houdt een risico in, namelijk corrupte data. En wanneer je per keer verschillende enquetes wilt genereren op basis van een hele berg vragen, maak dan een aparte tabel waarin je de selectie van vragen aangeeft. Het is onnodig om de vragen te dupliceren. Het dupliceren in deze is best wel handig. Vooral omdat deze enquetes vrij groot zijn en hoofdstukken hebben met veel vragen.
Wanneer iemand dus een enquete wil met ongeveer dezelfde hoofdstukken en vragen hoeft hij deze alleen maar de kopieren en aan te passen. Zo kun je dezelfde enquete gebruiken maar weer meer toespitsen op een andere doelgroep door dezelfde vragen in een andere context te plaatsen.
Het is daarom ook niet mijn vraag of het overbodig is of niet. Ik wil juist weten hoe het wel kan, ik zal eens kijken naar het topic van PHPeric. :)
Wanneer iemand dus een enquete wil met ongeveer dezelfde hoofdstukken en vragen hoeft hij deze alleen maar de kopieren en aan te passen. Zo kun je dezelfde enquete gebruiken maar weer meer toespitsen op een andere doelgroep door dezelfde vragen in een andere context te plaatsen.
Het is daarom ook niet mijn vraag of het overbodig is of niet. Ik wil juist weten hoe het wel kan, ik zal eens kijken naar het topic van PHPeric. :)
Voorbeeldje:
Vragen:
- id
- vraag
Enquete:
- id
- omschrijving
- startdatum
- einddatum
Selectie:
- id_vragen (foreignkey met de tabel vragen)
- id_enquete (foreignkey met de tabel enquete)
UNIQUE(id_vragen, id_enquete)
Met dit datamodel kun je oneindig veel vragen en enquetes opzetten. Iedere enquete kan slechts 1x dezelfde vraag bevatten, zie UNIQUE, maar 1 vraag kan in meerdere enquetes voorkomen.
Dit model is een stuk beter te onderhouden en uit te breiden.
Succes!
Ik bedoel uit ervaring heb ik wel eens dingen verkeerd gemaakt waardoor ik het niet om kan gooien voor de deadline. Meestal spreek ik dan af met de klant dat het nu werkend is, maar dat ik het nog verder zal ontwikkelen.
Vandaar dat ik me afvraag of het ook mogelijk is het zonder bovenstaande model te doen en gewoon met een while loop, hoe lelijk dat ook is eigenlijk.
Ik zou er voor kiezen om de boel nu aan te passen en daarmee dus niet te wachten. Je krijgt anders grote problemen/uitdagingen met de dataconversie van het oude datamodel naar het nieuwe datamodel.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$query_insert_hoofdstuk = "INSERT INTO hoofdstuk
SET (enqueteid,hoofdstuk,titel,inleiding,template)
VALUES ($ID, $rowhoofdstuk['hoofdstuk'], $rowhoofdstuk['titel'], $rowhoofdstuk['inleiding'], $rowhoofdstuk['template'])";
?>
$query_insert_hoofdstuk = "INSERT INTO hoofdstuk
SET (enqueteid,hoofdstuk,titel,inleiding,template)
VALUES ($ID, $rowhoofdstuk['hoofdstuk'], $rowhoofdstuk['titel'], $rowhoofdstuk['inleiding'], $rowhoofdstuk['template'])";
?>
??