Chris2412: Verkettete Auswahllisten in Datenbank schreiben

Hallo Leute,

anhand diesem Beispiel habe ich mir ein dynamisches Dropdown-Menü erstellt.

Nun möchte ich nach der Auswahl die Daten in eine Datenbank schreiben, das funktioniert auch, jedoch werden nicht die "Namen" sondern die "Werte" übernommen.

Bsp.: Ich wähle aus:

Albers, Alfred → Katzen in der freien Wildbahn → Freitags 10 - 12

in der Datenbank steht:

p23 → l55 → t123

Da ich im Bereich Javascript ein ziemlicher Neuling bin, wollte ich mal hier mal nachfragen ob mir evtl. jemand helfen kann?

Danke

Grüße

Chris

  1. Hallo,

    in dem von Dir verlinkten Beispiel ist beim Abschnitt "Texte (Namen) der gewählten Optionen" (Ausgabe beim Aufruf des Beispiel) zu sehen, wie anstatt der Werte die Texte ausgelesen/ausgegeben werden (Nutzung der "text"-Eigenschaft, anstelle der "value"-Eigenschaft) - wo genau liegt Dein Problem?

    Ggf. wäre jedoch die Verwendung der Werte vorzuziehen, d.h. in der Datenbanktabelle werden nur die Werte gespeichert, die entspr. Texte werden separat gehalten. Hierdurch könnten die Texte unabhängig geändert werden. Es kommt jedoch auf den Anwendungsfall an, ob dies gewünscht ist.

    Gruss,
    Worf

    1. Danke erstmal für die Antwort Worf.

      Ich möchte die Texte in die Datenbank schreiben, da ich sie auf einer anderen Seite wieder anzeigen will. Der Einfachheit halber habe ich bis jetzt immer die Texte direkt in die Datenbank geschrieben.

      Ich habe versucht in deinen genannten Abschnitt value durch text zu ersetzten aber irgendwie war das Ergebnis gleich. Könntest du mir bitte genau sagen, was ich im Quellcode ändern soll. =)

      Gruß

      Chris

      1. Om nah hoo pez nyeetz, Chris2412!

        Ich möchte die Texte in die Datenbank schreiben, da ich sie auf einer anderen Seite wieder anzeigen will.

        Das geht mit JavaScript nicht. Da du schreibst "in der Datenbank steht aber" ist sicher auch ein serverseitiges Skript im Spiel. Was das mit den per POST oder GET übermittelten Daten macht, ist wichtig.

        Matthias

        --
        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Messer und Messergebnis.

        1. Mir ist schon klar das das mit Javascript nicht geht.
          Javascript liefert aber die Werte.

          Das schreiben in die Datenbank funktioniert ja auch (siehe Post1) jedoch werden die falschen Werte in die Datenbank geschrieben (Bsp. Post1).

          1. Om nah hoo pez nyeetz, Chris2412!

            Das schreiben in die Datenbank funktioniert ja auch (siehe Post1) jedoch werden die falschen Werte in die Datenbank geschrieben (Bsp. Post1).

            Was daran liegt, dass nur name und value der Formularfelder übertragen werden.

            Matthias

            --
            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Papi und Papier.

            1. Genau.
              Deshalb möchte ich ja das im Value der Text steht und somit übergeben wird. Jedoch weiß ich nicht wo ich das im Javascript ändern muss..

              Evtl. noch zum Verständnis der Code, wie die Daten in die Datenbank geschrieben werden....

                
               <?php  
              session_start();  
                
              $db_host = "localhost";  
              $db_user = "************";  
              $db_pass = "********";  
              $db_name = "********";  
                
              ?>  
              <head>  
                <title>Your Ticket</title>  
                <meta name="description" content="">  
                <meta name="keywords" content="">  
                <meta http-equiv="Content-Type"  
               content="text/html; charset=iso-8859-1">  
                <link href="css/style.css" rel="stylesheet" type="text/css">  
                
                <script type="text/javascript" src="gAuswahl.js"></script>  
              <script type="text/javascript" src="LinkedSelection.js"></script>  
              <script type="text/javascript">  
                
              /**  
               * Diese Callback-Funktion soll beim Abschliessen der Auswahlstrecke und beim  
               * Ändern der Auswahl in einer der Auswahllisten aufgerufen werden.  
               * @param selected ein Array mit den Daten der jeweiligen Auswahllisten  
               *                 (leer, wenn Strecke nicht abgeschlossen)  
               **/  
              function ergebnisZeigen( selected )  
              {  
                if( selected.length )  
                {  
                  /*  
                   * Auswahlstrecke wurde beendet  
                   */  
                
                  // Visualisierung der Auswahlsrecke  
                  var sel = '';  
                  var val = '';  
                  var txt = '';  
                  for( var i = 0; i < selected.length; i++ )  
                  {  
                    sel += ( i>0 ? ' &rarr; ' : '') + selected[i].id;  
                    val += ( i>0 ? ' &rarr; ' : '') + selected[i].value;  
                    txt += ( i>0 ? ' &rarr; ' : '') + selected[i].text;  
                  }  
                  var output =  
              	'<'+'/p>Werte:<p>' + val +  
              	'<'+'/p>Texte:<p>' + txt + '<'+'/p>';  
                }  
                else  
                {  
                  /*  
                   * Auswahlstrecke wurde noch nicht beendet  
                   */  
                
                  // Hinweis zur Auswahl in der nächsten Auswahlliste  
                 // var output = '<p>Wählen Sie eine Option aus der nächste Auswahlliste.<'+'/p>';  
                }  
                var ergebnisObj = document.getElementById( 'ergebnis' ).innerHTML = output;  
              };  
                
              window.onload = function()  
              {  
                var vk = new LinkedSelection( [ 'raum', 'geraetetyp', 'detail' ], ergebnisZeigen, gAuswahl );  
              }  
                
              </script>  
                
                
                
              </head>  
              <body>  
                
              <select class="belegt" id="raum" name="raum">  
                <option value="--">Bitte w&auml;hlen:</option>  
                <option value="p23">R101</option>  
                <option value="p24">R102</option>  
                <option value="p25">R103</option>  
                <option value="p26">R104</option>  
                <option value="p27">R105</option>  
                <option value="p28">R106</option>  
                <option value="p29">K01</option>  
                <option value="p30">K02</option>  
                <option value="p31">Cafetaria</option>  
                
              </select>  
                
              &raquo;  
              <select class="belegt" id="geraetetyp" name="geraetetyp">  
                <option value="--">------</option>  
              </select>  
                
              &raquo;  
              <select class="belegt" id="detail" name="detail">  
                <option value="--">------</option>  
              </select>  
              </p>  
                
              <div id="ergebnis"></div>  
              <p>&nbsp;</p>  
              <p>&nbsp;</p>  
              <p>&nbsp;</p>  
                
                
              <?php  
              if (isset( $_POST['eintragen'] ))  
              {  
                  // Maskierende Slashes aus POST entfernen  
                  $_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;  
                
                  // Inhalte der Felder aus POST holen  
              	$raum = $_POST['raum'];  
              	$geraetetyp = $_POST['geraetetyp'];  
              	$detail = $_POST['detail'];  
                
                  /* ************************************************************************************************ */  
                  /* *** Hier sollten und MUESSEN die Benutzereingaben geprueft werden um Schadcode abzufangen!!! *** */  
                  /* ************************************************************************************************ */  
                
                  // Sind alle Eingaben durch die Validierung gekommen werden sie in die DB geschrieben  
                  // Verbindung oeffnen und Datenbank ausweahlen  
                  $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );  
                  if ($conID)  
                  {  
                      mysql_select_db( $db_name, $conID );  
                  }  
                
                  // Anfrage zusammenstellen der an die DB geschickt werden soll  
                  $sql = "INSERT INTO `ticket`  
                              (`raum`, `geraetetyp`, `detail`)  
                          VALUES(  
                              '" .mysql_real_escape_string( $vorname ). "',  
              				'" .mysql_real_escape_string( $raum ). "',  
              				'" .mysql_real_escape_string( $geraetetyp ). "',  
              				'" .mysql_real_escape_string( $detail ). "'  
                              )";  
                  // Schickt die Anfrage an die DB und schreibt die Daten in die Tabelle  
                  mysql_query( $sql );  
                  // Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde  
                  if (mysql_affected_rows() == 1)  
                  {  
              		echo '<h3><font color="#0DC2F5">Ticket wurde angelegt!</font></h3>';  
                      // Hier kann weiterer Code stehen der ausgefuehrt werden soll  
                      // wenn ein Eintrag erfolgreich war. z.B. Email an den Admin schicken  
                      // der ueber den neuen Eintrag informiert  
                  }  
                  else  
                  {  
                      echo '<h3><font color="#DF0101">Ticket konnte nicht angelegt werden!</font></h3>';  
                      // Hier koennen Massnahmen ergriffen werden die ueber den Misserfolg informieren  
                      // wie z.B. den Benutzer darueber zu informieren, dem Admin eine Mail schicken  
                      // damit er sich um den Fehler kuemmern kann, etc pp  
                  }  
              }  
              ?>  
                
                
                
              </div>  
              </body>  
              </html>  
              
              
              1. Om nah hoo pez nyeetz, Chris2412!

                Deshalb möchte ich ja das im Value der Text steht und somit übergeben wird. Jedoch weiß ich nicht wo ich das im Javascript ändern muss..

                Im JavaScript gar nicht. <option value="R101">R101</option> oder versteh ich dich falsch?

                Evtl. noch zum Verständnis der Code, wie die Daten in die Datenbank geschrieben werden....

                Einige Anmerkungen:

                [code lang=php]
                <?php

                ...

                ?>
                <head>

                Du erzeugst ungültiges HTML. doctype und <html> fehlt.

                content="text/html; charset=iso-8859-1">

                Warum nicht UTF-8?

                <option value="--">Bitte w&auml;hlen:</option>

                Dann brauchst du auch die &Uuml;aute nicht verstümmeln und kannst statt "&raquo" "»" schreiben.

                <select class="belegt" id="geraetetyp" name="geraetetyp">
                  <option value="--">------</option>
                </select>

                select ohne option ist keine Option

                <div id="ergebnis"></div>

                ein leeres div?

                <p>&nbsp;</p>
                <p>&nbsp;</p>
                <p>&nbsp;</p>

                wozu das? Abstände werden mit CSS erzeugt.

                $raum = $_POST['raum'];
                $geraetetyp = $_POST['geraetetyp'];
                $detail = $_POST['detail'];

                Dieses Umkopieren ist nicht notwendig.

                $sql = "INSERT INTO ticket
                                (raum, geraetetyp, detail)

                Die backtics brauchst du nur, wenn deine DB-Elemente wie reservierte Wörter heißen sollen.

                '" .mysql_real_escape_string( $vorname ). "',
                '" .mysql_real_escape_string( $raum ). "',
                '" .mysql_real_escape_string( $geraetetyp ). "',
                '" .mysql_real_escape_string( $detail ). "'

                sprintf macht es u.U. etwas übersichtlicher

                mysql_query( $sql );

                Die mysql-Unterstützung wird künftig aus PHP verschwinden.

                  echo '<h3><font color="#0DC2F5">Ticket wurde angelegt!</font></h3>';  
                

                font ist bäh. Verwende CCS. h3 { color: #0DC2F5 }

                echo '<h3><font color="#DF0101">Ticket konnte nicht angelegt werden!</font></h3>';

                echo '<h3 class="error">Ticket konnte nicht angelegt werden!</h3>';
                im CSS h3.error { color: #DF0101 }

                </div>

                Wahrscheinlich ist dies das schließende von <div id="ergebnis">

                Matthias

                --
                Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Wachs und Wachstube.

                1. Danke -.-

                  Dann probier ich selber mal den Fehler zu finden...

                  Gruß

                  1. Om nah hoo pez nyeetz, Chris2412!

                    Dann probier ich selber mal den Fehler zu finden...

                    <option value="R101">R101</option> hast du gelesen?

                    Matthias

                    --
                    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Schweiß und Schweißroboter.

                    1. Om nah hoo pez nyeetz, Chris2412!

                      Dann probier ich selber mal den Fehler zu finden...

                      <option value="R101">R101</option> hast du gelesen?

                      Matthias

                      Ja. Das hab ich auch schon vorher ausprobiert. Bei den ersten Dropdown-Menu würde das noch funktionieren.  Jedoch darf jeder "value" in  dieser Javascript Datei nur einmal vorkommen und da ich als Unterkategorie öfter den selben Namen brauch funktioniert das nicht.

                      Ich weiß das die Datei nicht sauber geschrieben ist. Das ist auch mein erstes PHP-Projekt weshalb es erstmal funktionieren soll..

                      var gAuswahl = {  
                        'raum' : {  
                          'p23' : ['p23', 'R101'],  
                          'p24' : ['p24', 'R102'],  
                          'p25' : ['p25', 'R103'],  
                          'p26' : ['p26', 'R104'],  
                      	'p27' : ['p26', 'R105'],  
                      	'p28' : ['p26', 'R106'],  
                      	'p29' : ['p26', 'K01'],  
                      	'p30' : ['p26', 'R02'],  
                          'p31' : ['p27', 'Cafetaria']  
                        },  
                        
                        'geraetetyp' : {  
                       //R101  
                          'p23' : [  
                            ['l55', 'PC'],  
                            ['l56', 'Monitor'],  
                            ['l57', 'Drucker']  
                          ],  
                      //R102  
                          'p24' : [  
                            ['l65', 'PC'],  
                            ['l66', 'Monitor'],  
                            ['l67', 'Drucker']  
                          ],  
                      //R103  
                          'p25' : [  
                            ['l75', 'PC'],  
                            ['l76', 'Monitor']  
                          ],  
                      //R104  
                          'p26' : [  
                            ['l85', 'PC'],  
                            ['l86', 'Monitor'],  
                            ['l87', 'Drucker']  
                          ],  
                      //R105	  
                      	 'p27' : [  
                            ['l95', 'PC'],  
                            ['l96', 'Monitor'],  
                          ],  
                      //R106	  
                      	 'p28' : [  
                            ['205', 'PC'],  
                            ['206', 'Monitor'],  
                      	  ['207', 'Drucker'],  
                            ['208', 'Beamer']  
                          ],  
                      //K01  
                      	 'p29' : [  
                            ['215', 'PC'],  
                            ['216', 'Active-Board'],  
                            ['217', 'Beamer']  
                          ],  
                      //K02  
                      	 'p30' : [  
                            ['225', 'PC'],  
                            ['226', 'Drucker'],  
                            ['227', 'Touch-TV']  
                          ],	  
                      //Cafeteria	  
                          'p31' : [  
                            ['235', 'Beamer'],  
                            ['236', 'Access Point'],  
                          ]  
                        },  
                        
                        'detail' : {  
                      //R101  
                          'l55' : [  
                            ['t123', 'R101-PC-01'],  
                      	  ['t124', 'R101-PC-02'],  
                      	  ['t125', 'R101-PC-03'],  
                      	  ['t126', 'R101-PC-04'],  
                      	  ['t127', 'R101-PC-05'],  
                      	  ['t128', 'R101-PC-06'],  
                      	  ['t129', 'R101-PC-07']  
                          ],  
                          'l56' : [  
                            ['t130', '19 Zoll TFT'],  
                      	  ['t131', '23 Zoll TFT']  
                          ],  
                          'l57' : [  
                            ['t132', 'Konica MXC 800'],  
                            ['t133', 'HP Helix 7']  
                          ],  
                      //R102  
                          'l65' : [  
                      	  ['t133', 'R102-PC-01'],  
                      	  ['t134', 'R102-PC-02'],  
                      	  ['t135', 'R102-PC-03'],  
                      	  ['t136', 'R102-PC-04']  
                          ],  
                          'l66' : [  
                            ['t137', '19 Zoll TFT'],  
                      	  ['t138', '23 Zoll TFT']  
                          ],  
                          'l67' : [  
                            ['t139', 'Konica MXC 103'],  
                      	  ['t140', 'Konica  CLS 1337'],  
                            ['t141', 'HP Helix 7']  
                          ],  
                      //R103  
                          'l75' : [  
                            ['t142', 'R103-PC-01'],  
                      	  ['t143', 'R103-PC-02'],  
                          ],  
                          'l76' : [  
                            ['t144', '27 Zoll TFT IPS'],  
                          ],  
                      //R104  
                          'l85' : [  
                            ['t145', 'R104-PC-01'],  
                      	  ['t146', 'R104-PC-02'],  
                      	  ['t147', 'R104-PC-03'],  
                      	  ['t148', 'R104-PC-04'],  
                      	  ['t149', 'R104-PC-05'],  
                      	  ['t150', 'R104-PC-06'],  
                      	  ['t151', 'R104-PC-07'],  
                      	  ['t152', 'R104-PC-08'],  
                      	  ['t153', 'R104-PC-09']  
                          ],  
                          'l86' : [  
                            ['t154', '19 Zoll TFT'],  
                      	  ['t155', '23 Zoll TFT'],  
                      	  ['t156', '24 Zoll TFT']  
                          ],  
                          'l87' : [  
                            ['t157', 'HP Helix 11']  
                          ],  
                      //R105  
                          'l95' : [  
                            ['t158', 'R105-PC-01'],  
                      	  ['t159', 'R105-PC-02'],  
                      	  ['t160', 'R105-PC-03'],  
                      	  ['t161', 'R105-PC-04']  
                          ],  
                          'l96' : [  
                            ['t162', '23 Zoll TFT'],  
                      	  ['t163', '24 Zoll TFT']  
                          ],  
                      //R106  
                          '205' : [  
                            ['t164', 'R106-PC-01'],  
                      	  ['t165', 'R106-PC-02'],  
                      	  ['t166', 'R106-PC-03'],  
                      	  ['t167', 'R106-PC-04'],  
                      	  ['t168', 'R106-PC-05']  
                          ],  
                      	'206' : [  
                            ['t169', '19 Zoll TFT'],  
                      	  ['t170', '23 Zoll TFT'],  
                      	  ['t171', '24 Zoll TFT']  
                          ],  
                      	'207' : [  
                            ['t172', 'Xerox Cube One']  
                          ],  
                          '208' : [  
                            ['t173', 'Sony Bravia Beam']  
                          ],  
                      //K01  
                         '215' : [  
                            ['t174', 'K01-PC-01']  
                          ],  
                      	'216' : [  
                      	  ['t175', 'Sogatech Active']  
                          ],  
                      	'217' : [  
                            ['t176', 'Philips Burst-Beam']  
                          ],  
                      //K02  
                         '225' : [  
                            ['t177', 'K02-PC-01']  
                      	  ['t178', 'K02-PC-01']  
                          ],  
                      	'226' : [  
                      	  ['t179', 'Konica Cube']  
                          ],  
                      	'227' : [  
                            ['t180', 'Sony Touch-TV']  
                          ],  
                      //Cafetaria  
                         '235' : [  
                            ['t181', 'LG Full-Light-Beamer'],  
                          ],  
                      	'236' : [  
                      	  ['t182', 'Netgear Point-1'],  
                      	  ['t183', 'Netgear Point-2']  
                          ]  
                        }  
                      };  
                      
                      
                      1. Om nah hoo pez nyeetz, Chris2412!

                        PHP muss dieses Array kennen. Und dann kannst du die komplette HTML-Seite von PHP zusammenbauen lassen.

                        Matthias

                        --
                        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Reif und Reifrock.

                        1. Om nah hoo pez nyeetz, Chris2412!

                          PHP muss dieses Array kennen. Und dann kannst du die komplette HTML-Seite von PHP zusammenbauen lassen.

                          Matthias

                          Genau, jetzt hab ich in der Datenbank z.B.
                          p23 l55 t123
                          stehen.
                          Ich möchte aber natürlich die Namen und nicht die Werte anzeigen lassen. Ich weiß aber nicht, wie ich das Javascript Array in die Ausgabe mit einbinde. Bis jetzt hab ich einfach immer direkt die Werte aus der Datenbank ausgegeben über

                          $sql = "SELECT * FROM ticket;
                          $result = mysql_query($sql) or die($sql."<br/><br/>".mysql_error());
                          $ticket = mysql_fetch_array ($result);
                          -->
                           "echo $ticket['raum']"

                          zum Beispiel.

                          1. Om nah hoo pez nyeetz, Chris2412!

                            Zuallererst musst du einen ordentlichen DB-Entwurf machen.

                            In deiner DB sollte es eine Tabelle Raum geben, eine Tabelle Gerät, eine Tabelle Gerätetyp. Dann kannst du auch ein Ticketsystem aufbauen. Das Melden ist ja nur der erste Schritt. Bestimmt gibt es sowas fertig im Netz.

                            Raum                    Typ
                            ====                    ===
                            ID | Name               ID | Name
                            r01| Raum 101           1  | PC
                            r98| Cafeteria          2  | Drucker

                            Gerät

                            ID | Name |Seriennummer | ist_vom_typ | standort
                            g01| paul |SN0012.tr5   | 1           | r01

                            PHP-Pseudocode unvollständig, ungetestet, wahrscheinlich nicht fehlerfrei

                            $raum = db_abfrage('SELECT * from raum')  
                            $geraet = db_abfrage('SELECT ... JOIN ...')  
                              
                            //JavaScriptarray in den Quelltext schreiben  
                              
                            var gAuswahl = {  
                              'raum' : {  
                              <?php for ($k = 0; $k <= sizeof($raum); $k++): ?>  
                              '<?=$raum[$k][0]?>' : ['<?=$raum[$k][0]?>', '<?=$raum[$k][1]?>']<?php if($k < sizeof($raum): ?>,<?php endif; ?>  
                             },  
                            <?php endfor; ?>  
                              
                            //Verschachtelte For-Schleife für den gerätetyp.
                            

                            Du siehst, dein Vorhaben ist keineswegs trivial, dieses hat aber den Vorteil, dass bei Änderungen des Fundus dein PHP-Code nicht geändert werden muss.

                            Matthias

                            --
                            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Papi und Papier.

                            1. Ok, vielen Dank für die Hilfe.

                              Gruß