Query in insertQuery met WHILE

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bram

Bram

19/09/2006 17:07:00
Quote Anchor link
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!


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
<?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);            
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Bram
 
PHP hulp

PHP hulp

07/11/2024 17:52:58
 
PHP erik

PHP erik

19/09/2006 17:09:00
Quote Anchor link
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
 
Frank -

Frank -

19/09/2006 17:13:00
Quote Anchor link
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.
 
Bram

Bram

20/09/2006 08:53:00
Quote Anchor link
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. :)
 
Bram

Bram

20/09/2006 09:10:00
Quote Anchor link
Hoe zou dat script bij mij van toepassing zijn?

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

?>


Dit werkt namelijk niet echt ... :|
Gewijzigd op 01/01/1970 01:00:00 door Bram
 
Bram

Bram

20/09/2006 09:31:00
Quote Anchor link
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
 
Gerben van Erkelens

Gerben van Erkelens

20/09/2006 11:30:00
Quote Anchor link
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?
 
Bram

Bram

20/09/2006 11:41:00
Quote Anchor link
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


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
//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
 
Gerben van Erkelens

Gerben van Erkelens

20/09/2006 11:46:00
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?
// 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 ?
 
Bram

Bram

20/09/2006 12:09:00
Quote Anchor link
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)
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
<?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);            
}


?>
 
Gerben van Erkelens

Gerben van Erkelens

20/09/2006 12:26:00
Quote Anchor link
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:
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
<?
$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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
mysql_query($query_insert_hoofdstuk) or die (myqsl_error());
?>
Gewijzigd op 01/01/1970 01:00:00 door Gerben van Erkelens
 
Bram

Bram

20/09/2006 12:46:00
Quote Anchor link
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
 
Gerben van Erkelens

Gerben van Erkelens

20/09/2006 13:25:00
Quote Anchor link
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.
 
Frank -

Frank -

20/09/2006 14:21:00
Quote Anchor link
Bram:
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. :)
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.

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!
 
Gerben van Erkelens

Gerben van Erkelens

20/09/2006 16:12:00
Quote Anchor link
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.
 
Frank -

Frank -

20/09/2006 19:34:00
Quote Anchor link
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.
 
Leroy Boerefijn

Leroy Boerefijn

20/09/2006 19:43:00
Quote Anchor link
is het niet bijv:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'])"
;
?>

??
 



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.