Pokemon Datenbank Problem

lolimov

Benutzer
Beiträge
5
Hallo Leute,

Ich habe ein kleines Problem. Ich lege eine Pokemon Datenbank (Nur für den Offline Gebrauch) an und möchte dafür ein kleines PHP Script mit Suche in Kategorien und Sortierung usw. erstellen.
Ich habe meine Datenbank versucht so weit wie Möglich zu normalisieren, aber stoße deshalb auf Probleme in der Abfrage und PHP Umsetzung.

Es geht darum, dass Pokemon 1 oder 2 Typen haben können. Deshalb habe ich mit DBdesigner folgende Tabellen erstellt. poke -- poke_has_typ -- typ . Also eine n zu m Beziehung.
Nun wollte ich es so machen, dass auf der Ergebnisseite der Suche
a) Der Pokemonname
b) Die Pokemonnummer
c) Der Pokemontyp oder beide Typen stehen

Am Anfang habe ich es mit einer einfachen Abfrage versucht und habe dabei zwar alle Typen bekommen, aber die Pokemon, welche 2 Typen haben, wurden auch zweimal angezeigt.

Also ungefähr so:

Name: Bisasam
Nr: 1
Typ: Gift

Name: Bisasam
Nr: 1
Typ: Pflanze

Möchte aber gerne:

Name: Bisasam
Nr:1
Typ: Gift, Pflanze

usw ....

Nun habe ich in Erfahrung gebracht, dass man mit zwei ineinander verschachtelten Queries die Typen seperat ausgeben könnte. Leider hapert es da schon an den Queries, weil ich absolut keinen Anhaltspunkt habe wie man im 2ten Querie, der nur für die Typen zuständig ist, die Informationen der einzelnen Pokemon damit zu verknüpfen. Am Ende haben bei mir alle angezeigten Pokemon, alle die gleichen Typen und vor allem mehr als 2.

Ich weiß einfach nicht mehr weiter. Eine einfache Lösung wäre natürlich Typ1 und Typ2 direkt in die Poke Tabelle zu schreiben, aber dann wär es nich mehr in der Normalform, da Eigenschaften, die mehrere Werte haben in eine seperate Tabelle ausgelagert werden solltenl. XD

Ich lade das Bild des Datenbankschemas mal hoch.

Es wäre super nett, wenn sich jemand mit dem Problem beschäftigen würde und mir helfen würde.
LG Kevin
und vielen Dank!

Hier der Quelltext der php-Datei mit den betreffenden statements!
und ohne HTML Teil.

<?php



// Funktion, damit die Checkboxen nach der Abfrage weiter aktiviert bleiben.


function checkboxsel($name,$att) {
if (isset($_POST['button']) and isset($_POST[$name])) {
for ($i = 0; $i < count($_POST[$name]); $i++) {
if ($_POST[$name][$i] == $att) {
echo "checked";
} }
}
}

//Poketypen sollen in verschiedenen Farben dargestellt werden.

function colorchoose($typ) {
if ($typ == "Pflanze") {
return $Farbe = "<span style='color:green;'>";
}
else if ($typ == "Feuer") {
return $Farbe = "<span style='color:red;'>";
}
else if ($typ == "Flug") {
return $Farbe = "<span style='color:grey;'>";
}
else if ($typ == "Gift"){
return $Farbe = "<span style='color:purple;'>";
}
}

?>

<?php
if (isset($_POST['button'])) {

//Verbindung aufbauen
$connection = mysql_connect("localhost", "root", "");

if (!$connection) {
echo "Error: " . mysql_error();
}

$db = mysql_select_db('pokemon2');

if (!$db) {
echo "Error: " . mysql_error();
}

// Funktion, um die WHERE Bedingung zu individualisieren.

if (isset($_POST['attribut'])) {
$max = count($_POST['attribut']);
If ($max == 1){
$bedingung[0] = " " . "Where " . "typ.name LIKE " . "\"" . $_POST['attribut'][0] . "\"" . " " ;
}
else {
$bedingung[0] = " " . "Where " . "typ.name LIKE " . "\"" . $_POST['attribut'][0] . "\"" . " OR" ;
for ($i = 1 ; $i < $max; $i++) {
if ($i == $max - 1) {
$bedingung[$i] = " " . " typ.name LIKE " . "\"" . $_POST['attribut'][$i] . "\"" . " " ;
}
else {
$bedingung[$i] = " " . " typ.name LIKE " . "\"" . $_POST['attribut'][$i] . "\"" . " OR" ;
}
}
}
$bed_text = implode('',$bedingung);
}
else {
$bed_text = "";
}

$sortierung = $_POST['desas'];

//Queries je nach Sortierungsbedingung.

if ($_POST['desas'] == "alauf") {

$query = "SELECT poke.nr, poke.idpoke, poke.name, typ.name AS typ FROM poke
INNER JOIN poke_has_typ ON poke.idpoke = poke_has_typ.poke_idpoke
INNER JOIN typ ON poke_has_typ.typ_idTyp = typ.idTyp" . $bed_text .
" ORDER BY poke.name ASC ";

}

if ($_POST['desas'] == "alabs") {

$query = "SELECT poke.nr, poke.idpoke, poke.name, typ.name AS typ FROM poke
INNER JOIN poke_has_typ ON poke.idpoke = poke_has_typ.poke_idpoke
INNER JOIN typ ON poke_has_typ.typ_idTyp = typ.idTyp" . $bed_text .
" ORDER BY poke.name DESC";
}

if ($_POST['desas'] == "nrauf") {

$query = "SELECT poke.nr, poke.idpoke, poke.name, typ.name AS typ FROM poke
INNER JOIN poke_has_typ ON poke.idpoke = poke_has_typ.poke_idpoke
INNER JOIN typ ON poke_has_typ.typ_idTyp = typ.idTyp" . $bed_text .
" ORDER BY poke.nr ASC";

}

//Problemqueries! Alles was ab hier geschrieben ist, ist das Ergebnis von vielen Tüftelein die nicht zum Ergebnis führten.
//Mir ist auch klar, dass diese Queries ein total dämliches Ergebnis ausgeben, was nichts mit der eigentlichen Sache zu tun hat, habe sie nur nicht mehr weiter editiert, weil ich nicht wusste wie ich weitermachen soll. -.-


if ($_POST['desas'] == "nrabs") {

//Durch das GROUP BY geht immer eine Attributinformation, wenn das Pokemon 2 Typen hat.

$query = "SELECT poke.nr, poke.idpoke, poke.name, typ.name AS typ FROM poke
INNER JOIN poke_has_typ ON poke.idpoke = poke_has_typ.poke_idpoke
INNER JOIN typ ON poke_has_typ.typ_idTyp = typ.idTyp" . $bed_text .
" GROUP BY poke.name ORDER BY poke.nr DESC" ;

$query1 = "SELECT poke.nr, typ.name AS typ FROM poke
INNER JOIN poke_has_typ ON poke.idpoke = poke_has_typ.poke_idpoke
INNER JOIN typ ON poke_has_typ.typ_idTyp = typ.idTyp"
. $bed_text .
" GROUP BY typ.name ";
}

echo $query;
$result = mysql_query($query);


while($row = mysql_fetch_array($result)) {
$nr = $row['nr'];
echo "<div id='ausgabe'><p> Nummer: " . $row['nr'] . "<br /> Name: " . "<a href='poke.php?show$nr'>" . $row['name'] . "</a>" . "<br /> Typ: " ;
$result1 = mysql_query($query1);

// Das Problem bei der inneren Query ist, dass alle Typen der Pokemon aufgenommen werden und auch bei jedem Pokemon ausgegeben werden.
// Keine Ahnung wie man nun die einzelnen Typen der Abfrage individualisiert auf die einzelnen Pokemon ausgeben kann.

while($row1 = mysql_fetch_array($result1)) {

$maxi = mysql_num_rows($result1); //kläglicher Versuch irgenwie die Ausgaben zu begrenzen. XD bzw. einziges Artefakt was übrig geblieben ist.
$Farbe = colorchoose($row1['typ']);

echo $Farbe . " " . $row1['typ'];

}

}
}
?>

</body>
</html>
 

Anhänge

  • pokemondb.png
    pokemondb.png
    263,3 KB · Aufrufe: 1
Werbung:

lolimov

Benutzer
Beiträge
5
Ok Danke für den Hinweis. Dachte mir schon, dass sowas kommt. Hatte nämlich beim Posten schon das Gefühl, dass ich selber keine Lust hätte den Code nachzuvollziehen.
Ich bitte um Verzeihung, da ich blutiger Anfänger bin.
Achja und danke für die Antwort auf mein eigentliches Problem. Damit wird es sich sicher lösen lassen.

LG Kevin
 

akretschmer

Datenbank-Guru
Beiträge
9.731
Achja und danke für die Antwort auf mein eigentliches Problem. Damit wird es sich sicher lösen lassen.

LG Kevin


Ein Punkt, ein Punkt, ich hab mal wieder einen Punkt! ;-)

Nee, im Ernst, https://www.datenbankforum.com/help/bb-codes , und schon ist das um Größenordnungen besser lesbar.

PS.: die PHP-MySQL - Dingens da ist kurz vor tot, nutze lieber mysqli. Oder PDO. Oder gleich eine richtige Datenbank.
Und ja: Dein Code sieht nach einer massiven Einladung für SQL-Injection aus.
 

lolimov

Benutzer
Beiträge
5
Jo is klar, da ich das sowieso nur als Arbeit für die Uni nutzen möchte und es Offline bleibt is mir die Sicherheit egal und den Dozenten auch. Die bringen uns lieber veraltete Methoden beibringen, als die sicheren Sachen. Liegt vielleicht daran, dass ich nich unbedingt in nem Informatikstudiengang bin und die Leute die es können irgendwie mittlerweile so ein krankes Misstrauen in die Jugend entwickelt haben. So nach dem Motto: "Die können ja eh nix". *g* Aber danke für die Tipps, da ich mich auch mehr dafür interessiere, als es in der Uni mitgeteilt wird. ;)
 

lolimov

Benutzer
Beiträge
5
Sorry für Doppelpost, aber was meinst du mit einer richtigen Datenbank?
Das mysqli habe ich noch recherchiert, (improved sql) PDO keine Ahnung.
Aber was meinst du mit richtiger Datenbank?
 

lolimov

Benutzer
Beiträge
5
Jo das mit den Dozenten und den Unimenschen is traurig. Man zahlt viel Geld und kriegt den Mist beigebracht, den sie vor 10 Jahren gelernt haben. Dozenten auf er Uni sollten eigentlich immer wechseln und Leute sein, die in der Praxis am Puls der Zeit arbeiten.
Wenigstens sind ein paar Basics immer die gleichen. Wie zum Beispiel die Normalformen und logisches Denken XD.

Naja aber zu deinem letzten Beitrag. Das was du da empfiehlst in dem anderen Thread is zwar schön und gut, aber ich muss den Mist ja in MySQL machen.
Aber ist echt interessant! Wusste garnicht, dass MYSQL schon so veraltet ist.
 
Werbung:
Oben