Verkettete Auswahllisten in Datenbank schreiben
Chris2412
- javascript
0 Worf0 Chris2412
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
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
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
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
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).
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
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 ? ' → ' : '') + selected[i].id;
val += ( i>0 ? ' → ' : '') + selected[i].value;
txt += ( i>0 ? ' → ' : '') + 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ä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>
»
<select class="belegt" id="geraetetyp" name="geraetetyp">
<option value="--">------</option>
</select>
»
<select class="belegt" id="detail" name="detail">
<option value="--">------</option>
</select>
</p>
<div id="ergebnis"></div>
<p> </p>
<p> </p>
<p> </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>
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ählen:</option>
Dann brauchst du auch die Üaute nicht verstümmeln und kannst statt "»" "»" 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> </p>
<p> </p>
<p> </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
Danke -.-
Dann probier ich selber mal den Fehler zu finden...
Gruß
Om nah hoo pez nyeetz, Chris2412!
Dann probier ich selber mal den Fehler zu finden...
<option value="R101">R101</option> hast du gelesen?
Matthias
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']
]
}
};
Om nah hoo pez nyeetz, Chris2412!
PHP muss dieses Array kennen. Und dann kannst du die komplette HTML-Seite von PHP zusammenbauen lassen.
Matthias
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.
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
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
Ok, vielen Dank für die Hilfe.
Gruß