Artikel von Subkategorien abfragen

alex130

Erfahrenes Mitglied
Hallo,
ich habe ein Problem und zwar, habe ich zwei Tabellen, die eine ist die für die Kategorien:
Code:
id - name - parent_id
1 - Hardware - 0
2 - Eingabegeräte - 1
3 - Kabellos - 2
4 - Tastaturen - 3
5 - Mäuse - 3
6 - Kabelgebunden - 2
7 - Software - 0

und die zweite Tabelle
Artikel
Code:
id - name - category
1 - Logitech MX 518 - 5

Und wenn ich nun die Kategorie mit der ID 2 anklicke (Eingabegeräte), dann will ich dass alle Artikel aus dieser und deren Unterkategorien aufgelistet werden.
Doch wie kann ich das umsetzen, da im Artikel ja nur die ID 5 also "Mäuse" steht.
Kann mir bitte jemand helfen?

Danke
 
Zuletzt bearbeitet:
Hier musst du rekursiv arbeiten, genau wie beim löschen der Kategorien.
Du hast eine Funktion, die eine Id übergeben bekommt und einen Rückgabewert hat: Die Artikel.
Zuerst guckst du, ob diese Kategorie Unterkategorien hat, wenn ja, rufst du dieselbe Funktion nochmal für diese IDs auf.
Wenn nicht, holst du nur alle Artikel aus dieser Kategorie und lässt sie von der Funktion zurückgeben.
 
Hallo,
danke für deine Antwort.
Soweit klingt das schonmal logisch und verständlich, aber mein Problem ist, dass ich nicht weiß, wie ich die Artikel aus den Subkategorien bekomme.
Ich dachte irgendwie, dass ich in einer Schleife die ganzen unterkategorien auslesen muss und dann mit den ganzen ID's die Artikel suchen, also where a.category = ... OR...
Aber ich denke es wäre auch nicht beste Lösung und vor allem weiß ich nicht wie viele Kategorien es gibt, das ist immer unterschiedlich.
Danke
 
Ok, schauen wir mal:
Wir haben eine Funktion, die anhand einer ID die Artikel aus dieser Kategorie holt. Zusätzlich prüft diese Funktion noch, ob es Unterkategorien gibt und wenn ja, dann wird diese Funktion auch für die Unterkategorien ausgeführt.
Die Funktion gibt ein Array zurück, in dem die ganzen Artikel stehen.

Bis dahin verstanden? Wenn ja, probier mal das umzusetzen, ich gucke jetzt Fußball und melde mich in der Halbzeit wieder.

So wie du es beschrieben hast, geht es auch und schont dabei die Datenbank. Aber auch hier kommst du um Rekursion nicht herum, ohne viel Aufwand zu betreiben.
 
Hallo,
hab das mal eben in zwei Funktionen aufgeteilt.
Die erste prüft, ob es noch eine Subkategorie gibt, wenn ja gibt sie die ID zurück andernfalls gibt sie false zurück.
Die zweite liefert alle Artikel aus der Kategorie.

PHP:
function getSubCategories($id)
{
	$sql = $db->query('SELECT * FROM categories WHERE submenu = "'.(int)$id.'"');
	if($sql)
	{
		$category = $db->get_row('SELECT * FROM categories WHERE submenu = "'.(int)$id.'"');
		return $category->id;
	}
	else
	{
		return false;	
	}
}

function getArticles($id)
{
	$articles = $db->get_results('SELECT * FROM artikel WHERE catid = "'.(int)$id.'"');
	return $articles;
}

Nun weiß ich nicht weiter :D
Danke
 
Immerhin schon ein Anfang;)

Ich dachte aber eher an sowas:
PHP:
function hole_Artikel(id)
{
 sql_string = Hole alle Artikel aus dieser ID
 
 wenn(Diese Kategorie hat Unterkategorien)
 {
  //Ja
  sql_string .= hole_Artikel(id)
 }
}
 
Meinst du so?
PHP:
<?php

function getSubCategories($id)
{
    $sql = $db->query('SELECT * FROM categories WHERE submenu = "'.(int)$id.'"');
    if($sql)
    {
        $category = $db->get_row('SELECT * FROM categories WHERE submenu = "'.(int)$id.'"');
        return $category->id;
    }
    else
    {
        return false;    
    }
}

function getArticles($id)
{
	$articles = $db->get_results('SELECT * FROM artikel WHERE catid = "'.(int)$id.'"');
	
	if(getSubCategories($id))
	{
		$articles .= getArticles($id);
	}
	else
	{
		// keine Subkategorie	
	}
}  

?>
Wobei das jetzt nicht wirklich funktionieren kann, oder?
Da ich das Array habe und hinten dran gehängt ist der Funktionsaufruf.

Danke

Lg
 
Sieht schonmal gut aus, die Frage ist jetzt nur, willst du die Ergebnisse zurückgeben oder die IDs und nacher alle mit einem SQL-Statement abfragen?
Darauf habe ich im letzten Post hingearbeitet.

Was gibt dir denn get_row() zurück?

€dit:
Ich schreibe mal wie ich es ohne DB-Klasse gemacht hätte, zurückgegeben werden die IDs in einem String:
PHP:
function get_Articlesid($id)
{
 $articlesid = " OR catid = '".$id."'";



 $sql = "SELECT * FROM categories WHERE submenu = '".$id."'";
 $result = mysql_query($sql);
 
 if(mysql_num_rows($result) >= 1)
 {
  while($row = mysql_fetch_assoc($result))
  {
   $articlesid .= get_Articlesid($row['id']);
  }
 }
}
Dann musst du am Ende noch so etwas machen:
PHP:
$sql = "SELECT * FROM artikel WHERE ".substr(get_Articlesid($id),3)
 
Zuletzt bearbeitet:
Äh... Ja... Genau...
$articlesid sollte zurückgeliefert werden:
PHP:
function get_Articlesid($id)
{
 $articlesid = " OR catid = '".$id."'";



 $sql = "SELECT * FROM categories WHERE submenu = '".$id."'";
 $result = mysql_query($sql);
 
 if(mysql_num_rows($result) >= 1)
 {
  while($row = mysql_fetch_assoc($result))
  {
   $articlesid .= get_Articlesid($row['id']);
  }
 }
 return $articlesid;
}

Und dann so:
PHP:
$sql = "SELECT * FROM artikel WHERE ".substr(get_Articlesid($id),2);
 
Zuletzt bearbeitet:
Zurück