Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Pokemon Datenbank Problem

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von lolimov, 2 Dezember 2013.

  1. lolimov

    lolimov Benutzer

    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:

  2. akretschmer

    akretschmer Datenbank-Guru

    Du suchst 2 Dinge:

    • eine Aggregation. In MySQL ist das wohl group_concat().
    • die Hilfe hier im Forum, wie man korrekt Code-Blöcke und anderes so schreibt, daß es lesbar ist.
     
    lolimov gefällt das.
  3. lolimov

    lolimov Benutzer

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru


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

    Nee, im Ernst, http://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.
     
  5. lolimov

    lolimov Benutzer

    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. ;)
     
  6. lolimov

    lolimov Benutzer

    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?
     
  7. akretschmer

    akretschmer Datenbank-Guru


    Die Frage habe ich schon mehrfach beantwortet, z.B. kürzlich im Thread "kleinster Wert bei gleicher ID" hier.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Aua.
     
  9. lolimov

    lolimov Benutzer

    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.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Jo, und das schon sooo lange!!!1elf
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden