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='colorurple;'>";
}
}
?>
<?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>
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='colorurple;'>";
}
}
?>
<?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>