Meerdere kolomnamen benoemen via INSERT met MySql

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Allan de Bruin

Allan de Bruin

05/02/2012 22:13:44
Quote Anchor link
Hallo allemaal,
IK vroeg mij af of het mogelijk is om meerdere kolomnamen dynamisch te benoemen met MySQL als je een INSERT doet?

Dus:

$insertSQL = sprintf("INSERT INTO (kolomnaam_a, kolomnaam_b, kolomnaam_C, kolomnaam1, kolomnaam_d) VALUES........etc

Kolomnaam1 zou dus oploppend herhaalt moeten worden. Dus dat ik dan het volgende zou krijgen:

$insertSQL = sprintf("INSERT INTO (kolomnaam_a, kolomnaam_b, kolomnaam_C, kolomnaam1, kolomnaam2, kolomnaam3, kolomnaam4, kolomnaam_d) VALUES........etc



De reden dat ik dit zou willen is omdat ik nu op dit moment maar 1 kolom hoef toe te voegen in de tabel en dit dus ook gelijk op de pagina's zal worden doorgevoerd op het scherm en in een formulier.
Nu wil ik deze waarden vanuit het formulier dus in de tabel zetten.

Ik hoop dat iemand mij kan helpen :)

aanvulling: als het gehele script nodig is zal ik deze ook even plaatsen
Gewijzigd op 05/02/2012 22:28:23 door Allan de Bruin
 
PHP hulp

PHP hulp

04/12/2024 10:26:17
 
- Ariën  -
Beheerder

- Ariën -

05/02/2012 22:31:25
Quote Anchor link
Dat wil je juist niet. Kolomnamen moeten nooit genummerd zijn. Je wilt je database altijd zo schaalbaar mogelijk hebben zonder je structuur steeds aan te passen.

Verdiep je eens in normalisatie.
 
Allan de Bruin

Allan de Bruin

05/02/2012 22:32:35
Quote Anchor link
maar kan het wel?
heb je misschien ergens een voorbeeld?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/02/2012 23:05:28
Quote Anchor link
Het is inderdaad niet aan te bevelen, maar het kan wel.
Maar het kan nog makkelijker.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$fields
= "("
$values = "VALUES ("
foreach ($_POST as $fieldname => $value) {
    $fields .= $fieldname . ",";
    $values .= "'" . $value . "',";
}

$fields = substr($fields, 0, -1); //laatste komma weghalen
$values = substr($values, 0, -1); // idem
$sql = "INSERT INTO tabelname " . $fields . ") " . $values . ")";
?>

Voorwaarde is natuurlijk wel dat dat de namen van de invoervelden overeenkomen met de kolomnamen in de tabel.
Gewijzigd op 05/02/2012 23:06:15 door Ger van Steenderen
 
Allan de Bruin

Allan de Bruin

06/02/2012 01:07:35
Quote Anchor link
Beste Ger,
Ik snap even niet de werking van dit geheel.

Wat ik heb gedaan is de velden als volgt gedefinieerd:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
while ($vraag < $AantalVragen + 1)
    {
    echo "<INPUT NAME=\"Vraag$vraag\" TYPE=\"hidden\" ";
        foreach ($_POST['Vraag'.$vraag++] as $Field)
        {
        echo "VALUE=\"$Field\" />";
        @$totaal += $Field;
   }
}


Aan de hand hiervan worden de waarden uit een vorige pagina hier in een hidden veld geplaatst.
deze wil ik dan in de database plaatsen.
Mijn intentie was ook om de veldnamen over1 te laten komen met de kolomnamen.

Wat vragen:
Als ik jouw script zo bekijk dan is het dus de bedoeling dat ik de velden nu de naam $fieldname moet gaan geven?
 
Erwin H

Erwin H

06/02/2012 01:22:12
Quote Anchor link
Probeer eens uit te leggen wat je hiermee van plan bent. Want volgens mij gaat dit schreeuwend fout:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    echo "<INPUT NAME=\"Vraag$vraag\" TYPE=\"hidden\" ";
        foreach ($_POST['Vraag'.$vraag++] as $Field)
        {

        echo "VALUE=\"$Field\" />";
        @
$totaal += $Field;
   }

?>

Heb je al eens in je HTML gekeken wat er dan terecht komt?
Gewijzigd op 06/02/2012 01:22:41 door Erwin H
 
- Ariën  -
Beheerder

- Ariën -

06/02/2012 01:28:47
Quote Anchor link
Allan de Bruin op 05/02/2012 22:32:35:
maar kan het wel?
heb je misschien ergens een voorbeeld?


Maar.... waarom wil je het? Met een structuur met genummerde kolomnamen wordt het erg lastig om straks nog leuke queries uit te kunnen poepen.
 
Allan de Bruin

Allan de Bruin

06/02/2012 01:32:14
Quote Anchor link
Wat er in de html komt is het volgende:
<INPUT NAME="Vraag1" TYPE="hidden" VALUE="1" />
<INPUT NAME="Vraag2" TYPE="hidden" VALUE="2" />
<INPUT NAME="Vraag3" TYPE="hidden" VALUE="3" />
<INPUT NAME="Vraag4" TYPE="hidden" VALUE="4" />
<INPUT NAME="Vraag5" TYPE="hidden" VALUE="5" />
<INPUT NAME="Vraag6" TYPE="hidden" VALUE="6" />
<INPUT NAME="Vraag7" TYPE="hidden" VALUE="7" />
<INPUT NAME="Vraag8" TYPE="hidden" VALUE="8" />
<INPUT NAME="Vraag9" TYPE="hidden" VALUE="9" />
<INPUT NAME="Vraag10" TYPE="hidden" VALUE="10" />
etc tot en met Vraag39 (het aantal kolommen met vragen).

Wat ik precies doe is het volgende:
Een tabel met 39 vragen.
Deze vragen staan in de COMMENTS van het veld in de tabel.
Die roep ik op via:

SHOW FULL COLUMNS FROM tblvragenlijst WHERE Comment > '0'

Dus alleen die velden waar een waarde staat bij Comment zal worden getoond.

Pagina met vragen. Op deze pagina heb ik de vragen uit de tabel.
Deze kunnen worden geselecteerd aan de hand van radioboxjes

Die worden als volgt weergegeven, maal 10
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="1" />


Deze kan de bezoeker de waarden verzenden naar een volgende pagina met een overzicht van de gegeven antwoorden + daar zal de bezoeker nog 3 velden moeten invullen. (naam, email en woonplaats).


Dan is het de bedoeling dat vanaf deze pagina de gegevens in de tabel komen.

Heb ik hier antwoord gegeven op jouw vraag?

Toevoeging op 06/02/2012 01:34:41:

- Aar - op 06/02/2012 01:28:47:


Maar.... waarom wil je het? Met een structuur met genummerde kolomnamen wordt het erg lastig om straks nog leuke queries uit te kunnen poepen.


nah, ik dacht dat het misschien wel een passende en makkelijke manier was.
Het is alleen een vragenlijst die ik, persoonlijk gezien dan, makkelijk zou kunnen onderhouden door er alleen maar een kolomnaam in te voeren..
Gewijzigd op 06/02/2012 01:32:45 door Allan de Bruin
 
Erwin H

Erwin H

06/02/2012 01:54:06
Quote Anchor link
Allan de Bruin op 06/02/2012 01:32:14:
Heb ik hier antwoord gegeven op jouw vraag?

Ja, behalve dan of je de code die ik quote al hebt getest. Want volgens mij gaat daar nooit uitkomen wat je wilt, als er al iets uitkomt. Je doet namelijk een foreach op een $_POST element dat volgens mij geen array is. Dat kan dus helemaal niet, dat zou een foutmelding moeten opleveren. Of, als het wel een array is, dan krijg je meerdere values in je hidden input. Dat kan ook niet natuurlijk.
 
Allan de Bruin

Allan de Bruin

06/02/2012 09:35:33
Quote Anchor link
Ik zal de code even geheel insluiten.

Als eerste de pagina met de vragen, met beperkte HTML code

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
//database connectie maken om vragen op te halen
mysql_select_db($database_ziv, $ziv);
$query_rsGetVragen = "SHOW FULL COLUMNS FROM tblvragenlijst WHERE Comment > '0'";
$rsGetVragen = mysql_query($query_rsGetVragen, $ziv) or die(mysql_error());
$row_rsGetVragen = mysql_fetch_assoc($rsGetVragen);
$totalRows_rsGetVragen = mysql_num_rows($rsGetVragen);



Dan het formulier waar de vragen worden weergegeven:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<form method="POST" name="frmVragenLijst" id="frmVragenLijst" action="vragenlijst_stap3.php">
       <strong>
        <?php if ($totalRows_rsGetInstelling == 0) { // Show if recordset empty ?>
          Deze instelling is nog niet geactiveerd door de contactpersoon van de organisatie.
          <?php } // Show if recordset empty ?>
        </strong>
       <table width="100%" border="0" cellpadding="2" cellspacing="0" class="tekst_normaal">
         <tr>
           <td colspan="2" valign="top"><h1>Vragenlijst: <?php echo $row_rsGetInstelling['InstNaam']; ?></h1></td>
          </tr>
         <tr>
           <td colspan="2" valign="top" class="td_vergelijkingstabel"><?php echo $row_rsGetInstelling['InstAdresStraat']; ?> <?php echo $row_rsGetInstelling['InstAdresNr']; ?>, <?php echo $row_rsGetInstelling['InstPostCijfer']; ?> <?php echo $row_rsGetInstelling['InstPostLetter']; ?> <?php echo $row_rsGetInstelling['InstPlaats']; ?>. Onderdeel van: <a href="Koepelorganisatie-bekijken.php?KoepelId=<?php echo $row_rsGetInstelling['KoepelId']; ?>"><?php echo $row_rsGetInstelling['KoepelNaam']; ?></a></td>
          </tr>
         <tr>
           <td colspan="2" valign="top">&nbsp;</td>
          </tr>
         <tr>
           <td colspan="2" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
             <tr>
               <td width="560" valign="top"><strong>Welk cijfer geeft u voor:
                 <input name="InstId" type="hidden" id="InstId" value="<?php echo $row_rsGetInstelling['InstId']; ?>" />
                                 <input type="hidden" name="AantalVragen" id="AantalVragen" value="<?php echo $totalRows_rsGetVragen ?>" />
                 </strong></td>
               <td align="center" valign="top"><strong>&nbsp;1</strong></td>
               <td align="center" valign="top"><strong>&nbsp;2</strong></td>
               <td align="center" valign="top"><strong>&nbsp;3</strong></td>
               <td align="center" valign="top"><strong>&nbsp;4</strong></td>
               <td align="center" valign="top"><strong>&nbsp;5</strong></td>
               <td align="center" valign="top"><strong>&nbsp;6</strong></td>
               <td align="center" valign="top"><strong>&nbsp;7</strong></td>
               <td align="center" valign="top"><strong>&nbsp;8</strong></td>
               <td align="center" valign="top"><strong>&nbsp;9</strong></td>
               <td align="center" valign="top"><strong>&nbsp;10</strong></td>
               </tr>
             <?php do { ?>
                
               <tr onmouseover=style.backgroundColor="#99CC66" onmouseout=style.backgroundColor="#FFFFFF">
                 <td valign="top"><?php echo htmlentities($row_rsGetVragen['Comment']); ?></td>
                
                 <td colspan="10" align="center" valign="top">  <span id="<?php echo $row_rsGetVragen['Field']; ?>">
              
                 <input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="1" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 <input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="2" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 <input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="3" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 <input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="4" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 <input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="5" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 <input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="6" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 <input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="7" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 <input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="8" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 <input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="9" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 <input type="radio" name="<?php echo $row_rsGetVragen['Field']; ?>[]" value="10" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                
                 <span class="radioRequiredMsg">*</span></span>
                
                  </td>
                
              
                 </tr>
                <script type="text/javascript">
var spryradio1 = new Spry.Widget.ValidationRadio("<?php echo $row_rsGetVragen['Field']; ?>");
     </script>
               <tr>
                 <td colspan="11" valign="top" class="td_vergelijkingstabel"><img src="images/pixel.jpg" width="1" height="1" /></td>
                 </tr>
                
               <?php } while ($row_rsGetVragen = mysql_fetch_assoc($rsGetVragen)); ?>
            </table></td>
         </tr>
         <tr>
           <td valign="top"><input type="reset" id="button" value="Formulier opnieuw invullen" /></td>
           <td align="right" valign="top"><input type="submit" value="Antwoorden opslaan" /></td>
         </tr>
  </table>
     </form>


Dan de pagina om de gegevens te tonen en in de database te plaatsen.
Hier zit nog geen INSERT in:

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
$vraag = 1;
$AantalVragen = $_POST['AantalVragen']; //aantal vragen tonen

<FORM name="frmAddVragenlijst" ACTION="vragenlijst_stap4_einde.php" METHOD="POST" id="frmAddVragenlijst">
<?php
//formulier velden opstellen om in de tabel te plaatsen
while ($vraag < $AantalVragen + 1)
    {

    echo "<INPUT NAME=\"Vraag$vraag\" TYPE=\"hidden\" ";
        foreach ($_POST['Vraag'.$vraag++] as $Field)
        {

            echo "VALUE=\"$Field\" />";
            @
$totaal += $Field;
        }
}

//ipadres ophalen van de invullen zodat deze niet twee keer de lijst kan invullen.
if (!empty($_SERVER["HTTP_CLIENT_IP"]))
    {

         //check for ip from share internet
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    }

elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    {

        // Check for the Proxy User
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }

else
    {
        $ip = $_SERVER["REMOTE_ADDR"];
    }


?>

<table width="100%" border="0" cellpadding="2" cellspacing="0" class="tekst_normaal">
  <tr>
    <td colspan="3" valign="top"><h1>Vragenlijst: <?php echo $row_rsGetInstelling['InstNaam']; ?></h1></td>
  </tr>
  <tr>
    <td colspan="3" valign="top"><?php echo $row_rsGetInstelling['InstAdresStraat']; ?> <?php echo $row_rsGetInstelling['InstAdresNr']; ?>, <?php echo $row_rsGetInstelling['InstPostCijfer']; ?> <?php echo $row_rsGetInstelling['InstPostLetter']; ?> <?php echo $row_rsGetInstelling['InstPlaats']; ?>. Onderdeel van: <a href="Koepelorganisatie-bekijken.php?KoepelId=<?php echo $row_rsGetInstelling['KoepelId']; ?>"><?php echo $row_rsGetInstelling['KoepelNaam']; ?></a>&nbsp;</td>
  </tr>
  <tr>
    <td colspan="3" valign="top">&nbsp;</td>
  </tr>
  <tr>
    <td colspan="3" valign="middle">Uw gemiddelde cijfer is een
    
<?php
$totaalpunten
= $totaal;
$Gemiddeld = $totaal / $AantalVragen;
echo "<span class=GegevenCijfer>" . number_format($Gemiddeld, 1, ',', '') . "</span>";
echo "<br />Totaal alles opgeteld: ". $totaalpunten . " gedeeld door ".  $AantalVragen . " vragen";

?>
</td>
  </tr>
  <tr>
    <td colspan="3" valign="top">&nbsp;</td>
  </tr>
  <tr>
    <td colspan="3" valign="top">Om deze vragenlijst compleet te maken vragen wij u alleen nog de volgende gegevens:</td>
  </tr>
  <tr>
    <td colspan="3" valign="top">&nbsp;</td>
  </tr>
  <tr>
    <td valign="top">Uw naam</td>
    <td colspan="2" valign="top"><span id="sprytextfield2">
      <input name="InvullerNaam" type="text" id="InvullerNaam" size="50" maxlength="255" />
      <span class="textfieldRequiredMsg">*</span></span></td>
  </tr>
  <tr>
    <td width="17%" valign="top">Uw emailadres</td>
    <td colspan="2" valign="top"><span id="sprytextfield1">
      <input name="InvullerEmailadres" type="text" id="InvullerEmailadres" size="50" maxlength="255" />
      <span class="textfieldRequiredMsg">*</span></span></td>
  </tr>
  <tr>
    <td valign="top">Uw woonplaats</td>
    <td colspan="2" valign="top"><span id="sprytextfield3">
      <input name="InvullerWoonplaats" type="text" id="InvullerWoonplaats" size="50" maxlength="255" />
      <span class="textfieldRequiredMsg">*</span></span></td>
  </tr>
  <tr>
    <td valign="top">Aanvullingen</td>
    <td colspan="2" valign="top"><span id="sprytextarea1">
    <textarea name="VragenOverigeInformatie" id="VragenOverigeInformatie" cols="45" rows="5"></textarea><br />
U heeft al <span id="countsprytextarea1">&nbsp;</span> karakters ingevuld.<span class="textareaMaxCharsMsg">U kunt maximlaal 5000 karakters invullen.</span></span></td>
  </tr>
  <tr>
    <td valign="top">

    <input name="InstId" type="hidden" id="InstId" value="<?php echo $row_rsGetInstelling['InstId']; ?>" />
    <input name="InvullerIpadres" type="hidden" id="InvullerIpadres" value="<?php echo $ip ?>" />
    <input name="KoepelId" type="hidden" id="KoepelId" value="<?php echo $row_rsGetInstelling['KoepelId']; ?>" />
    <input name="VraagStatus" type="hidden" id="VraagStatus" value="0" />
    <input name="AantalVragen" type="hidden" id="AantalVragen" value="<?php echo $AantalVragen ?>" /></td>
    <td colspan="2" valign="top">&nbsp;</td>
  </tr>
  <tr>
    <td valign="top">&nbsp;</td>
    <td width="37%" align="right" valign="top"><input type="submit" value="Vragenlijst afronden" /></td>
    <td width="46%" valign="top">&nbsp;</td>
  </tr>
  <tr>
    <td colspan="3" valign="top">&nbsp;</td>
  </tr>
</table>
 
</FORM>


Ik hoop dat ik hier wat meer inzicht heb kunnen geven in waar ik naar op zoek ben.
Gewijzigd op 06/02/2012 09:36:22 door Allan de Bruin
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

06/02/2012 10:01:18
Quote Anchor link
Ten eerste:
Je slaat een gegeven op in de comment van de kolom. Die is daar helemaal voor bedoeld.
Dus als je dat gegeven zou moeten wijzigen moet je de tabel wijzigen (met ALTER TABLE). In SQLite kan dat zelfs niet.
Ten tweede pleur je alle info in 1 tabel
Ga nu eerst je database is goed opzetten, als je op deze manier doorgaat vraag je om problemen. Hint: tabel voor vragen, tabel voor invullers en een tabel voor antwoorden.
Gewijzigd op 06/02/2012 10:02:43 door Ger van Steenderen
 
Allan de Bruin

Allan de Bruin

06/02/2012 11:10:28
Quote Anchor link
Thanks Ger! :)
Ik denk dat ik het dan helemaal om ga gooien. Is nog best complex :)
Bedankt iig voor je tijd en de moeite. nog goede bronnen over het opzetten van een strakke db?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

06/02/2012 12:38:10
Quote Anchor link
Geen dank. Goed dat je de adviezen opvolgt.

Lees eerst wat over. normalisatie.

En maak dan gewoon een opzetje, en post dat hier
 



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.