saschard
Goto Top

Datensätze aus einem Dropdown-Menü auswählen (PHP, Javascript, MySQL)

Hallo zusammen,

ich bin gerade dabei mir eine kleine Informationsdatenbank für ein Spiel zusammen zu bauen. Grundkenntnisse im Umgang mit HTML, PHP, SQL und Javascript sind vorhanden. Jedoch stoße ich derzeit an ein Problem, welches ich nicht alleine gelöst bekomme.

Beschreibung:
Aus einem Dropdown-Menü können Werte ausgewählt werden (die Werte kommen aus einer MySQL Datenbank):

<code type="">Auslesen der Dropdown-Werte
function query(){
$reags = mysql_query("SELECT RName FROM reagenzien");
while($ausgabe = mysql_fetch_array ($reags)){
echo '<option value="' . $ausgabe['RName'] . '">' . $ausgabe['RName'] . '</option>';


Auf der Seite habe ich dann folgenden Code:
<code type="">
Ausgabe der Dropwdown-Werte
<label id="reags">Reagenzie:</label>
<select id="s_reags">
<option value="">Bitte auswaehlen..</option>
<?php query() ?>
</select>


Dieses Verfahren funktioniert einwandfrei! Ich möchte jetzt bei einem "select(Auswahl)" eines Werts aus dem Dropdown-Menü, die dazugehörigen Werte in eine Tabelle darunter anzeigen.

Fallbeispiel:
Ich wähle die Reagenzie "Knoblauch" aus dem Dropdown-Menü aus, dann möge bitte in der darunter liegenden Tabelle folgende Werte anzeigt werden:

Name Wirkung 1 Wirkung 2 Wirkung 3 Wirkung 4

Die Werte für die Wirkungen werden aus der Datenbank-Tabelle wirkungen ausgelesen.

Dazu habe ich dann ein Javascript geschrieben der bei einem "change(Wechsel)" eines Wertes aus dem Dropdown-Menü, die dazugehörigen Werte in eine Tabelle darunter ändern soll.

<code type="">OnChange Funktion bei Auswahl im Dropdown-Menü (Alert-Test)
<script type="text/javascript"">
$("#s_reags").change(function(){
alert("Aenderung!");
});
</script>


Dies funktioniert ebenfalls einwandfrei! Wenn ich jetzt jedoch Änderungen durchführe um die Daten auszulesen; funktioniert gar nichts mehr : (

<code type="">
OnChange Funktion bei Auswahl im Dropdown-Menü (Erweiterung)
<div id="d_post"></div>
<script type="text/javascript">
$("#s_reags").change(function(){
var v_reags = $("s_reags").val();
$.post("test.php", {v_reags:v_reags}, function(data){
$("#d_post").html(data);
});
});
</script>


<code type="">//Abfrage zum testen
<?php
if($_POST["v_reags"]){
include_once 'connect.php';
$post=mysql_query("SELECT * FROM reagenzien WHERE RName ='".$_POST["v_reags"]."'");
while $lpost=mysql_fetch_assoc($post)){
echo $lpost['RName'];
}
}
?>


Führe ich die "POST-Funktion" wieder mit einem Alert durch, wird mir der Alert-Text angezeigt..

Hat jemand eine Ahnung? Habe die Quellcodes auf Syntaxfehler überprüft etc. kann nichts entdecken.
unter http://alchemie.funpic.de könnt ihr euch mein jetzigen Stand ansehen!

Danke im Vorraus und Gruß, Sascha

Content-Key: 223523

Url: https://administrator.de/contentid/223523

Printed on: April 19, 2024 at 05:04 o'clock

Member: colinardo
Solution colinardo Dec 03, 2013, updated at Dec 04, 2013 at 21:58:01 (UTC)
Goto Top
Hallo Sascha,
diese Zeile kommt mir verdächtig vor:
var v_reags = $("s_reags").val();   
denke da hast du die Raute für die ID vergessen:
var v_reags = $("#s_reags").val();   
statt dem kannst du es auch so schreiben:
var v_reags = $(this).val(); 
Grüße Uwe
Member: SaschaRD
SaschaRD Dec 03, 2013 updated at 19:38:00 (UTC)
Goto Top
Hallo Uwe,

vielen Dank erst einmal für deine Antwort. Habe den Vorschlag deinerseits übernommen:
var v_reags = $(this).val();

Leider erhalte ich immer noch keinen Rückgabewert
 
//OnChange Funktion bei Auswahl im Dropdown-Menü (Erweiterung)
  <div id="d_post"></div>  
<script type="text/javascript">  
   $("#s_reags").change(function(){  
   var v_reags = $(this).val();
   $.post("test.php", {v_reags:v_reags}, function(data){  
      $("#d_post").html(data);   
   });
});
</script>

Für die test.php, habe ich zwei Inhalte:
 <?php
echo "test";  
?>

Und einmal den Inhalt:
<?php // Inhalt 2
  if($_POST["v_reags"]){  
  include_once 'connect.php';  
  $post = mysql_query("SELECT * FROM reagenzien WHERE RName='".$_POST["v_reags"]."'");  
  $lpost = mysql_fetch_assoc($post)
  echo $lpost["RName"];  
}
?>

Führe ich den Test durch mit Inhalt 1 erhalte ich die Ausgabe "Test".
Der Code aus "Inhalt 2" gibt mir leider keinen Rückgabewert.

Ich ja die "connect.php" auf. Die sieht wie folgt aus:

<code type=""><?php
include_once 'dbinfo.php';

function connect(){
mysql_connect(DBHOST, DBUSER, DBPW) or die("Verbindungsversuch fehlgeschlagen" . mysql_error());
mysql_select_db(DBNAME) or die("Konnte die Datenbank nicht waehlen" . mysql_error());
}

function close(){
mysql_close();
?>


Muss ich ja die connect(); Funktion aufrufen! Auch wenn ich diese einfüge! Erhalte ich keinen Rückgabewert : (
Member: colinardo
Solution colinardo Dec 03, 2013, updated at Dec 05, 2013 at 13:58:15 (UTC)
Goto Top
Zu aller erst schaltest du mal das Error-Reporting in deinen PHP-Dateien ein damit du auch Fehler beim Entwickeln wirklich zu Gesicht bekommst:
error_reporting(E_ALL);
dann ändere mal die Post-Variable die du an test.php sendest in einen anderen String z.B. par1
$.post("test.php", {par1:v_reags}, function(data){ 
da das v_reags ja eine Variable ist.
Entsprechend passt du dann deine Test.php an diesen Parameter an.

Außerdem fehlt der Aufruf der connect() Funktion in deiner Test.php

Grüße Uwe
Member: SaschaRD
SaschaRD Dec 04, 2013 at 19:43:06 (UTC)
Goto Top
Abend Uwe,

danke für die Hilfe und Informationen.

Habe das Problemchen behoben.

<?php // Inhalt 2
  if($_POST["v_reags"]){  
  include_once 'connect.php';  
  $post = mysql_query("SELECT * FROM reagenzien WHERE RName='".$_POST["v_reags"]."'");  
  $lpost = mysql_fetch_assoc($post) <<<<- HIER WURDE _array verwendet! Dann klappt es auch mit dem Nachbarn =)
  echo $lpost["RName"];  
}
?>

Was dann wie folgt aussieht:
<?php
	if($_POST["v_reags"]){  
		$post = mysql_query("SELECT * FROM reagenzien WHERE RName='".$_POST["v_reags"]."'");  
		while($lpost = mysql_fetch_array($post)){
			echo $lpost['RName'];  
		}
	}  
?>
Die Error-Console zeigt mir immer, dass das es ein Fehler in der Zeile "while....." gab.

Kaum ist man einen Schritt weiter, hängt man mit nicht genügend Know-How auch schon wieder face-sad
Den Code habe ich um einige Zeile erweitert bzw. geändert. Zurzeit werden die gewünschten Daten aus der Datenbank ausgelesen und bei einem Wechsel im Dropdown-Menü aktualisiert.
	if($_POST["v_reags"]){  
		$post = mysql_query("SELECT * FROM reagenzien WHERE RName='".$_POST["v_reags"]."'");  
		while($lpost = mysql_fetch_array($post)){
			echo "<tr>";  
					echo "<td>".$lpost['RName']."</td>";  
					echo "<td>".$lpost['RWirkung1']."</td>";  
					echo "<td>".$lpost['RWirkung2']."</td>";  
					echo "<td>".$lpost['RWirkung3']."</td>";  
					echo "<td>".$lpost['RWirkung4']."</td>";  
			echo "</tr>";  
		}
	}  
?>

Ist es möglich die mir ausgegebenen "RWirkungs"-Werte (Fremdschlüssel "WID") in den "WName" umzuwandeln?
Habe es über SQL versucht, da erhalte ich aber anstatt einer Ausgabe eine Multi-Ausgabe!
Hatte dazu folgendes Statement geschrieben:
	if($_POST["v_reags"]){  
		$post = mysql_query("SELECT r.RName as Name,a.Wirkung1,b.Wirkung2,c.Wirkung3,d.Wirkung4 FROM reagenzien r,  
			(SELECT r.RName,w.WName as Wirkung1 FROM reagenzien r, wirkungen w WHERE r.RWirkung1=w.WID) a,
			(SELECT r.RName,w.WName as Wirkung2 FROM reagenzien r, wirkungen w WHERE r.RWirkung2=w.WID) b,
			(SELECT r.RName,w.WName as Wirkung3 FROM reagenzien r, wirkungen w WHERE r.RWirkung3=w.WID) c,
			(SELECT r.RName,w.WName as Wirkung4 FROM reagenzien r, wirkungen w WHERE r.RWirkung4=w.WID) d
				WHERE r.RName='".$_POST["v_reags"]."'");  
		while($lpost = mysql_fetch_array($post)){
			echo $lpost['Name'];  
			echo $lpost['Wirkung1'];  
			echo $lpost['Wirkung2'];  
			echo $lpost['Wirkung3'];  
			echo $lpost['Wirkung4'];  
		}
	}

Danke im Vorraus!
Member: colinardo
Solution colinardo Dec 04, 2013, updated at Dec 05, 2013 at 13:58:35 (UTC)
Goto Top
verstehe nicht was du meinst, ich kenne deinen Tabellenaufbau nicht. Um mehrere Tabellen kombiniert abzufragen, machst du dies mit dem SQL Befehl JOIN
Member: Biber
Solution Biber Dec 04, 2013, updated at Dec 05, 2013 at 19:12:45 (UTC)
Goto Top
Moin SaschaRD,

ich möchte jetzt eigentlich weder über dein "Danke im Vorraus!" noch über deine Tabellenstruktur meditieren, auch wenn es mir schwerfällt.

Dein Statement sollte eher so ausssehen:
$post = mysql_query("SELECT r.RName as Name  
               , a.WName as Wirkung1
               , b.WName as Wirkung2
               , c.WName as Wirkung3
               , d.WName as Wirkung4
      FROM reagenzien r, wirkungen a, wirkungen b
           , wirkungen c, wirkungen d 
     Where r.Wirkung1=a.WID, r.Wirkung2=b.WID
             , r.Wirkung3=c.WID, r.Wirkung4=d.WID
    AND r.RName='".$_POST["v_reags"]."'");   

... was auch in endlicher Zeit ein Ergebnis liefert, sofern
a) du nur weniger Wirkungen in deiner "Wirkungen"-Tabelle hast als meine Ex-Schwiegermutti Haare auf der Brust
b) auch in alle 4 "reagenzien.WirkungN".Feldern auch gültige WID-Werte stehen.

Andernfalls (also z.B bei nur zwei statt vier angegebenen "Wirkungen") würde der ganze Resutset-Satz wegfallen, da 4 von 4 Wirkungen erforderlich sind.

-> Wahrscheinlich musst du also anstatt eines INNER JOINs einen LEFT JOIN (Wirkung1, 2, 3 , 4 KANN da sein, muss aber nicht) verwenden.

Grüße
Biber
Member: SaschaRD
SaschaRD Dec 05, 2013 at 07:15:50 (UTC)
Goto Top
Morgen zusammen,

zur Tabellenstruktur:
Table (reagenzien):
RID RName RWirkung 1 RWirkung 2 RWirkung 3 RWirkung 4
1 Alraunenwurzel 46 22 13 1
diese Tabelle hat 45 Datensätze.

In Table (wirkungen), sind die Wirkungen der Reagenzien festgehalten:
WID WName
1 Blindheit
etc. (insgesamt 49 Datensätze).

Wie Biber bereits richtig erkannt hat; gibt es einige Reagenzien die keinen 4ten Wirkungswert besitzen.
Werde das Ganze über LEFT JOIN versuchen!

Meine eigentliche Frage war: Wie löse ich die "WID"-Werte wieder in den "WName"-Werte auf? Zurzeit verwende ich folgende Abfrage auf der Webseite:
if($_POST["v_reags"]){  
		$post = mysql_query("SELECT * FROM reagenzien WHERE RName='".$_POST["v_reags"]."'");  
		while($lpost = mysql_fetch_array($post)){
			echo "<tr>";  
					echo "<td>".$lpost['RName']."</td>";  
					echo "<td>".$lpost['RWirkung1']."</td>";  
					echo "<td>".$lpost['RWirkung2']."</td>";  
					echo "<td>".$lpost['RWirkung3']."</td>";  
					echo "<td>".$lpost['RWirkung4']."</td>";  
			echo "</tr>";  
		}
	}  
?>
Ich weiß, dass ich in diesem Statement keinen Bezug auf die Datensätze von "wirkungen" habe.

Werde mich im Laufe des Tages nochmal melden, in diesem Sinne, Danke und schönen Tag..
Mist jetzt hatte ich den Beitrag bereits aufgelöst gesetzt -.-
Member: SaschaRD
SaschaRD Dec 05, 2013 at 13:57:45 (UTC)
Goto Top
Hallo nochmal,

habe es Dank dem Tipp von Biber mit "LEFT JOIN" zum Laufen bekommen. Hier der Code; falls jemand sich ebenfalls so etwas bauen möchte:

if($_POST["v_reags"]){  
	$post = mysql_query("SELECT RName as Name,  
a.WName as Wirkung1,
 b.WName as Wirkung2,
  c.WName as Wirkung3,
  d.WName as Wirkung4
FROM reagenzien r
LEFT JOIN wirkungen a ON r.RWirkung1=a.WID
  LEFT JOIN wirkungen b ON r.RWirkung2=b.WID
    LEFT JOIN wirkungen c ON r.RWirkung3=c.WID
      LEFT JOIN wirkungen d ON r.RWirkung4=d.WID
        WHERE r.RName ='".$_POST["v_reags"]."'");  
		while($lpost = mysql_fetch_array($post)){
			echo "<tr>";  
					echo "<td>".$lpost['Name']."</td>";  
					echo "<td>".$lpost['Wirkung1']."</td>";  
					echo "<td>".$lpost['Wirkung2']."</td>";  
					echo "<td>".$lpost['Wirkung3']."</td>";  
					echo "<td>".$lpost['Wirkung4']."</td>";  
			echo "</tr>";  
		}
	}  
?>

Jetzt muss um das Ganze nur noch eine Tabelle! Und dann kann es sozusagen für die andere Ausgabe "der Tränke" dupliziert werden.

Für die Ausgabe einer Tabellenstruktur und die Formatierung(Design der Tabelle), wirft man das Ganze am besten in eine .css-Datei? Oder sollte ich es direkt mit Angeben?

Meinen herzlichen Dank! an Euch zwei für die tatkräftige Unterstützung....

Gruß, Sascha
Member: colinardo
colinardo Dec 05, 2013, updated at Dec 06, 2013 at 07:48:29 (UTC)
Goto Top
Hallo Sascha,
ich würde solche Daten in deinem PHP-Script nicht schon vorformatiert bzw. mit Tags an deine Seite übergeben, sondern als JSON-Formatierten String der nur die eigentlichen Daten enthält, so bleibst du flexibel was die Gestaltung angeht und es gehen auch weniger Daten über den Äther face-wink(Ist zwar bei Dir nicht viel, aber das ist besserer Programmierstil). Außerdem brauchst du dann kein zweites PHP-Script wenn du die Daten mal auf einer anderen Seite benötigst die ein anderes Aussehen hat. Die Darstellung erzeugst du dann in der Hauptseite mit jQuery und Konsorten.
back-to-topBeispiel:
// das assoziative Array in JSON wandeln und über den Äther schicken...
echo json_encode($lpost);
In deiner Haupt-Seite kannst du diese Daten dann wieder so in deinem POST-Callback Event in JavaScript verwenden:
// JSON-String wieder zurück in ein nomales assoziatives JavaScript-Array wandeln
var arr_data = $.parseJSON(data);
var r_name = arr_data['Name'];  
var w1 = arr_data['Wirkung1'];  
var w2 = arr_data['Wirkung2'];  
var w3 = arr_data['Wirkung3'];  
var w4 = arr_data['Wirkung4'];  
und dann mit JQuery die Tabelle ergänzen oder neu zusammenbauen...
Formatierung machst du dann über die Zuweisung von Klassen und einer CSS-Datei in der dann die Formatierungen stehen.

Grüße Uwe