Query in insertQuery met WHILE
Hoi mensen,
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!
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
Een INSERT in een while-loop is bijna altijd inefficient.
Zie dit topic: http://www.phphulp.nl/forum/showtopic.php?cat=12&id=22468&lasttopic=1
Zie dit topic: http://www.phphulp.nl/forum/showtopic.php?cat=12&id=22468&lasttopic=1
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.
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. :)
Hoe zou dat script bij mij van toepassing zijn?
Dit werkt namelijk niet echt ... :|
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
Kan iemand mij trouwens vertellen hoe dit heet? Wat dit eigenlijk voor een script is? De benaming zegmaar
Gewijzigd op 01/01/1970 01:00:00 door Bram
Ik zie dat het script wat nog niet werkt in principe hetzelfde ID krijgt als het deel wat je wilt kopieren. Moet dat niet een ander id krijgen?
Het is per slot van rekening een nieuwe enquete die je aanmaakt toch?
Het is per slot van rekening een nieuwe enquete die je aanmaakt toch?
Ik zie inderdaad een fout, hij koppeld het ID van de zo juist gemaakte Enquete aan het hoofdstuk. Dat is dus niet goed. Hij moet juist de aan te maken hoofdstukken koppelen aan het zojuist aangemaakte enqueteID ( $ID ). de variabel $ENQUETE is de enqueteid van de te kopieren enquete. $ID is dus de enqueteid waarnaar hij het moet kopieren
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.
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
Ik zou de query's los van elkaar doen, dat gaat volgensmij niet werken 2 soorten query's in 1.
Maak er anders dit van:
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 ?
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 ?
zo te zien ben ik id vergeten achter enquete! er moest staan enqueteid. Ik ben nu weer overgestapt op een while loop met querys omdat een query in een query nog steeds geen suc6 is. Als ik nu de while loop gebruik dan kopieerd hij de enquete EN het eerste hoofdstuk (inclusief titel e.d.) Er zijn echter vier hoofdstukken, kortom hij vergeet de andere 3...
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);
}
?>
Okee ik denk dat je het iets anders moet aanpassen.
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:
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:
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
ik kreeg nu indderdaad een error (na toevoeren or DIE) dat ik een duplicate aan het invoeren was, en dat hij daarom maar 1 record kopieerd (eerste dus).
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
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
Uhm jah dat kan ik proberen. Het aantalhoofdstukken kun je met een query uit de DB halen. Per enquete zijn er een aantal hoofdstukken. Is het aantal hoofdstukken altijd gelijk dan kun je $aantalhofdstukken = 4; doen bijv.
$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.
$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!
Dat is idd misschien een beter idee. Maar ik vroeg me af, is het wel mogelijk het zonder zo'n soort model te doen.
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 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.
Het aanpassen van de code hoeft volgens mij niet meer dan een uurtje te kosten. Het is alleen jammer dat je zo veel tijd hebt gespendeerd aan een verkeerde opzet, maar daar valt niets meer aan te doen.
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.
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.
is het niet bijv:
??
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'])";
?>
??




