Datenbankeintrag mit Explode trennen + Überprüfung

Caralynn

Mitglied
Hallo,

wie der Titel schon sagt, habe ich eine Frage zu Explode und einer foreach-Anweisung.
In meiner Spiel-Datenbank sind bei jedem Medikament verschiedene Anwendungsgebiete angegeben, der Spaltentyp ist SET und da kann man ja schön am "," trennen. Klappt auch so weit ganz gut, aber wenn mehrere Anwendungsgebiete vorhanden sind, klappt es nicht mehr so schön.

Sagen wir mal, das Tier hat eine Bindehautentzündung.
Das Medikament #1 hat als Anwendungsgebiet: Bindehautentzündung,Hornhautverletzung,Bissverletzung.
Das Medikament #2 hat als Anwendungsgebiet:
Schnupfen,Lungenentzündung

Ist ja nun klar, dass der Gesundheitszustand des Tieres nicht besser wird, wenn man Medikament #2 nimmt, aber bei Medikament #1 kann er besser werden. Ja, nur macht das Script das nicht, weil ja die Krankheit ungleich Hornhautverletzung und ungleich Bissverletzung ist. Wie muss ich die Anweisung korrekt formulieren?

PHP:
	//Schaue, ob das richtige Medikament gewählt wurde
	$gebiet = $medi["anwendungsgebiet"];
	$anwendungsgebiet = explode(",", $gebiet);
	foreach($anwendungsgebiet as $anwendung) 
           { 
           if($anwendung !== $tier["krankheit"])
		     {
			 $medi["gesundheitspunkte"] = "0";
			 }
		   else
		     {
			 //+Gesundheitspunkte aus der DB nicht überschreiben
			 } 
           }
Ich schätze mal, dass überschreibt einfach die Variable immer wieder, für jeden Durchgang, aber wie stoppe ich es? exit(); beendet ja das ganze Script.

Aus der Datenbank werden mittels SELECT ausgelesen, nicht, dass sich wer wundert: $medi["gesundheitspunkte"], $medi["anwendungsgebiet"], $tier["krankheit"].

Hat jemand eine Idee? :(

LG,
Cara
 
Öhh.. irgendwie ist das sehr viel Fachchinesisch für so früh am Tag.

http://www.tinohempel.de/info/info/datenbank/normalisierung.htm <- habe mir das dann mal angeschaut.

Bezogen auf meine Tabelle Medikamente würde das bedeuten, dass ich jedes Medikament für jedes Anwendungsgebiet eintrage, d.h. wenn ich 3 Anwendungsgebiete habe, steht das Medikament 3 mal in der Datenbank?

Wie sieht denn dann die Abfrage der Datensätze in einer While-Schleife ohne Wiederholung aus? Die Spieler müssen ihre Medikamente ja auch erst kaufen...

Oder lege ich mir jetzt noch eine Tabelle namens Anwendungen zu?

Und im Grunde ist es mit Spaltentyp SET doch auch einfach, neue Anwendungsgebiete einzutragen, wenn man mal außen vor lässt, dass die Anwendungsgebiete eh "beschränkt" in ihrer Zahl sind, da es sonst sehr, sehr komplex wird?!

LG,
planlose Cara
 
Nicht ganz: Es geht vor allem darum, dass alle Daten atomar vorliegen, dass es also beispielsweise keine Auflistungen etc. gibt. In deinem Fall würden zwei neue Tabellen benötige: eine für die Anwendungsgebiete und eine um die Medikamente mit den Anwendungsgebieten in Verbindung zu bringen.
 
Uhm ja, dacht ich mir...

Also:
Tabelle Medikamente mit ID, Name, Gesundheitspunkte, Beschreibung, Preis
Tabelle Anwendungsgebiete mit ID, Name
Tabelle Medikamente_Anwendung mit ID, Medikament_ID, Anwendungsgebiet_ID

Dazu kommt noch die Tabelle "Mitgliederapotheken", in der steht, welches Medikament welcher Spieler in welcher Menge besitzt.

Klingt ja ganz schön und gut und vielspaltig, aber wie binde ich das nun ein? - Ein Spieler geht mit seinem Tier zum Tierarzt, eine Krankheit wird festgestellt und in die Datenbank eingetragen.

Der Spieler möchte das Tier behandeln lassen und auf der Behandlungs-Seite wird die Tabelle Mitgliederapotheken ausgelesen, damit er weiß, welche Medikamente ihm zur Verfügung stehen.

Er wählt eines der Medikamente aus und das Formular leitet ihn weiter *zonk*

Jetzt muss:
- Gesundheit und Krankheit des Tieres ausgelesen werden aus der Tabelle Tiere
- Gesundheitspunkte aus der Tabelle Medikamente: $medi["gesundheitspunkte"]

- Das Anwendungsgebiet des Medikamentes muss mit der Krankheit des Tieres übereinstimmen, sonst wird $medi["gesundheitspunkte"] = 0 gesetzt, d.h. keine Besserung, ergo es muss eine Art JOIN-Query zwischen Medikamente, Anwendungsgebiete und Medikamente_Anwendung sein? :confused:
(einen dreier-Join hab ich noch nie gemacht)

- Addition der Werte.
- Abzug der Einheit aus der Mitglieder-Apotheke
- Auffrischen der Tier-Tabelle inkl. Überprüfung, ob es gesund ist

So ungefähr?

LG,
Cara
 
Hmm... ich werd's mal ausprobieren, aber ein paar Fragen hab ich noch:

1. Wie frage ich dann ab, wenn ich herauskriegen möchte, ob das gewählte Medikament für die Krankheit geeignet ist?
Tiertabelle enthält ein Feld namens Krankheit ^= Anwendungsgebiet

2. Der Datenbank macht es nichts aus, wenn die Daten aus verschiedenen Tabellen kommen, d.h. sie schwächelt nicht?
 
Caralynn hat gesagt.:
1. Wie frage ich dann ab, wenn ich herauskriegen möchte, ob das gewählte Medikament für die Krankheit geeignet ist?
Tiertabelle enthält ein Feld namens Krankheit ^= Anwendungsgebiet
Dazu gibt es den Join, beispielhaft alle Medikamente für ein bestimmtes Anwendungsgebiet:
SQL:
select *
from medikaemt
join medikamentFuerAnwendungsgebiet
  on medikament.id=medikamentFuerAnwendungsgebiet.medikamentId
join anwendungsgebiet
  on medikamentFuerAnwendungsgebiet.anwendungsgebietId=anwendungsgebiet.id
where anwendungsgebiet.name LIKE 'Bindehautentzündung'
Du kannst natürlich noch weiter zur Tiertabelle joinen (auf Basis von tier.krankheitId und anwendungsgebiet.id) und im Where-Teil die Id des Tieres prüfen.

Wenn ein Tier auch mehr als eine Krankheit haben kann, solltest Du auch hier eine "TierHatKrankheit"-Tabelle (TierId, KrankheitId) anlegen, die zu einer Krankheitstabelle oder direkt zur Anwendungsgebiet-Tabelle verweist.

Caralynn hat gesagt.:
2. Der Datenbank macht es nichts aus, wenn die Daten aus verschiedenen Tabellen kommen, d.h. sie schwächelt nicht?
Nein, das macht der Datenbank nichts aus. Dazu müsste die Anzahl der Datensätze schon in die Millionen gehen. Aber dann lahmt sie auch, wenn Du in einer einzelnen Tabelle suchst.

Die Verknüpfungstabelle benötigt übrigens keine eigene ID. Der Primärschlüssel setzt sich aus den beiden Fremdschlüsseln zusammen.

Gruß hpvw
 
Zuletzt bearbeitet:
Zurück