Hoi allemaal,

ik ben bezig met een webwinkel, en nu heb ik een tweetal dingen waar ik niet uitkom:

1. Menu
Ik wil graag subcategorieen kunnen gebruiken. Heb een tabel met 3 velden: id, naam, parent. Huigde SQL:

 
$rQueryCat = mysql_query ( "SELECT * 
  					FROM products_categorieen 
					WHERE categorie_id IN 
					     (SELECT categorie_parent 
					     FROM products_categorieen 
					     WHERE categorie_parent != 0)
					ORDER BY categorie_naam ASC ")


Nu krijg ik dus wel de hoofdcategorieen, maar niet de subs. En ik wil dit tot een aantal niveau's kunnen doen. Hoe kan ik dit wel doen??

2. Subpagina
Ik heb in mijn db nu het volgende:

Hoofd_1
Sub_1A
Sub_1B
Hoofd_2
Sub_2A
Sub_2B

Wanneer ik nu bijv. Hoofd_2 aanklik wil ik daar een aparte pagina hebben. Ook als ik op bijv. Sub_2A klik, zou ik nu daar de producten krijgen. Als ik echter een Sub_2_1A zou maken, dan wil ik een ander soort pagina hebben...

Misschien wat vaag omschreven maar dat komt later wel anders...vraag 1 vind ik belangrijker :)

Tnx alvast...
Iemand die na de Kerst nog een goed idee voor mij heeft??
Tabel: categories
category_id - parent_id - order_nr
1 - 0 - 1
2 - 0 - 2
3 - 0 - 3
4 - 1 - 1
5 - 1 - 2
6 - 2 - 1
7 - 2 - 2
8 - 3 - 1
9 - 3 - 2
10 - 4 - 1


Hoofd category query:
SELECT * FROM categories WHERE parent_id = 0


sub category query (subcategorieën van category 1):
SELECT * FROM categories WHERE parent_id = 1


Eventueel nog een order_nr kolom toevoegen voor de volgorde.
Dan wordt een hoofd category query:
SELECT * FROM categories WHERE parent_id = 0 ORDER BY order_nr


Van kolommen parent_id en order_nr moet je een index maken.

edit:

Een hele mooie optie is om een subcategorie te kunnen koppelen aan meerdere parents. Want je hebt soms subcategorieën die je bij meerdere hoofdcategorieën kunt indelen.
@Martijn!

Begrijp ik het dan goed dat je in een while lus elke keer de subcategorien ophaalt die onder de categorie vallen die je in de while lus aan het ophalen bent?

<?php
while('haal_hoofdcategorie_op'){
$query = "WHERE parent_id = hoofdcategorie_id";
}
?>
Een aantal menu's kun je makkelijk met 1 query uit de database halen.

zo bijvoorbeeld:
SELECT * FROM categories WHERE parent_id IN (0,1,4) ORDER BY parent_id, order_nr


Die 1,4 zie je dan ergens in het URL. Om het resultaat te laten zien zou je een recursieve functie kunnen gebruiken.

Met de query hierboven laten we eigenlijk categorie 10 zien en alle parents daarvan. Je hebt dan bijvoorbeeld dit URL "categorie.php?p=1,4".
Je zou die "1,4" ook in een aparte kolom kunnen opslaan, dus:
Tabel: categories
category_id - parent_id - order_nr - backtrace
10 - 4 - 1 - 1,4


Voordeel hiervan is dat je niet je hele URL vol hebt met nummers maar gewoon 1 nummer hebt (het categorieID).
Het URL wordt dan bijvoorbeeld "categorie.php?c=10".

De qeury wordt dan:
SELECT * FROM categories WHERE parent_id IN (SELECT backtrace FROM categories WHERE category_id = 10) ORDER BY parent_id, order_nr


Misschien dat je er beter 2 queries van kunt maken. Zelf heb ik er twee van gemaakt.
Ik snap je bedoeling, maar nog niet helemaal hoe ik het nu moet doen. Het voordeel hiervan, is dus dat een bepaalde categorie onder A kan vallen, maar ook onder G (ik noem maar wat).

Huidige db:

CREATE TABLE `products_categorieen` (
  `categorie_id` int(5) NOT NULL auto_increment,
  `categorie_naam` varchar(255) NOT NULL default '',
  `categorie_parent` int(5) NOT NULL default '0',
  PRIMARY KEY  (`categorie_id`)
);


Huidige sql:


$rQueryCat = mysql_query ("SELECT *				FROM products_categorieen 
	WHERE categorie_id IN 
	(SELECT categorie_parent 
	FROM products_categorieen 
	WHERE categorie_parent != 0)
	ORDER BY categorie_naam ASC ") or die (mysql_error) );
Het voordeel hiervan, is dus dat een bepaalde categorie onder A kan vallen, maar ook onder G (ik noem maar wat).


Daar heb ik het helemaal nog niet over gehad :D
Hiervoor zul je een aparte tabel moeten maken denk ik. Maar daar ben ik zelf ook nog niet uit.

SELECT * FROM products_categorieen 
    WHERE categorie_id IN 
    (SELECT categorie_parent 
    FROM products_categorieen 
    WHERE categorie_parent != 0)
    ORDER BY categorie_naam ASC


Hier heb je helemaal geen subquery nodig omdat je deze info uit $_GET haalt.

Bijvoorbeeld (kort door de bocht): categorie.php?menus=1,2,3
<?php
$sQuery = 'SELECT * FROM products_categorieen
WHERE categorie_parent IN
(' . $_GET['menus'] . ')
ORDER BY categorie_naam ASC'
?>
Volgens mij gaan we langs elkaar heen...wat ik wil is gewoon dit:

Cat. 1
- Subcat 1A
- Subcat 1B
Cat. 2
- Subcat 2A
> Subcat 2A_1
> Subcat 2A_2
- Subcat 2B

etc...een sub hoeft niet onder meerdere te vallen! Dat kan altijd nog ;)

<?php
$rQueryCat = mysql_query ( "SELECT * 
							FROM products_categorieen
							WHERE categorie_parent = 0 
							ORDER BY categorie_naam ASC ") or die ( mysql_error() );
			while ( $aQueryCat = mysql_fetch_assoc ( $rQueryCat ) )
			{
				echo '&nbsp;&nbsp;-<a href="index.php?pagina=webwinkel&amp;cat='.stripslashes ( $aQueryCat['categorie_id'] ).'">'.stripslashes ( $aQueryCat['categorie_naam'] ).'</a><br />';
				$QuerySub = mysql_query ( "SELECT *
											FROM products_categorieen
											WHERE categorie_parent = ". $aQueryCat['categorie_id'] ." 
											ORDER BY categorie_naam ASC ") or die ( mysql_error() );
				while ( $QuerySub2 = mysql_fetch_assoc ( $QuerySub ) )
				{
					echo '&nbsp;&nbsp;--<a href="index.php?pagina=webwinkel&amp;cat='.stripslashes ( $QuerySub2['categorie_id'] ).'">'.stripslashes ( $QuerySub2['categorie_naam'] ).'</a><br />';
				}
			}
?>


alleen nu de vraag:
1. Dit werkt tot 1 niveau...hoe krijg ik dit voor meerdere niveau's??
2. Hoe krijg ik die tussenpagina's?
Ik ben nog even aan het prutsen geweest en probeerde er een functie voor te maken.

De aanroep:

<?php							
	$rQueryCat = mysql_query ( "SELECT * 
								FROM products_categorieen
								WHERE categorie_parent = 0 
								ORDER BY categorie_naam ASC ") or die ( mysql_error() );
	while ( $aQueryCat = mysql_fetch_assoc ( $rQueryCat ) )
	{												
		echo '&nbsp;&nbsp;-<a href="index.php?pagina=webwinkel&amp;cat='.stripslashes ( $aQueryCat['categorie_id'] ).'">'.stripslashes ( $aQueryCat['categorie_naam'] ).'</a><br />';
		bepaalSub($aQueryCat['categorie_id']);
	}
?>


Functie:

function bepaalSub($parent_id)
{
	$QuerySub = mysql_query ( "SELECT *	FROM products_categorieen WHERE categorie_parent = ". $parent_id ." 
							   ORDER BY categorie_naam ASC ") or die ( mysql_error() );
	while ( $QuerySub2 = mysql_fetch_assoc ( $QuerySub ) )
	{
		$QuerySub3 = mysql_query ( "SELECT * FROM products_categorieen WHERE categorie_parent = ". $QuerySub2['categorie_id'] ."
									ORDER BY categorie_naam ASC ") or die ( mysql_error() );

		echo '&nbsp;&nbsp;&nbsp;&nbsp;-<a href="index.php?pagina=webwinkel&amp;cat='.stripslashes ( $QuerySub2['categorie_id'] ).'">'.stripslashes ( $QuerySub2['categorie_naam'] ).'</a><br />';

		while ($QuerySub4 = mysql_fetch_assoc ( $QuerySub3 ) )
		{
			echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-<a href="index.php?pagina=webwinkel&amp;cat='.stripslashes ( $QuerySub4['categorie_id'] ).'">'.stripslashes ( $QuerySub4['categorie_naam'] ).'</a><br />';			
		}
	}
}


Toch werkt dit niet zoals ik wil...ik wil onbeperkte subs tonen. Maar dan zou je de functie nogmaals moeten aanroepen. Wie weet raad??
mod-edit:

Bumpen
Bumpen is het herhaaldelijk posten in je eigen topic om hem weer bovenaan in de lijst te krijgen. Omdat het zéér opdringerig overkomt is bumpen is pas na 24 uur toegestaan. Bumpen kan een reden zijn voor de admins en mods om een topic te sluiten. Gebruik het knopje om je tekst aan te passen indien nodig.
Ik heb even een voorbeeldje gemaakt:
<?php
error_reporting(E_ALL);

# De sleutels zijn dus de parentIDs
$aCat = array(
0 => array( array('catID' => '1', 'naam' => 'categorie 1'),
array('catID' => '2', 'naam' => 'categorie 2'),
array('catID' => '3', 'naam' => 'categorie 3')),
1 => array( array('catID' => '4', 'naam' => 'categorie 4'),
array('catID' => '5', 'naam' => 'categorie 5'),
array('catID' => '6', 'naam' => 'categorie 6')),
2 => array( array('catID' => '7', 'naam' => 'categorie 7'),
array('catID' => '8', 'naam' => 'categorie 8'),
array('catID' => '9', 'naam' => 'categorie 9')),
3 => array( array('catID' => '10', 'naam' => 'categorie 10'),
array('catID' => '11', 'naam' => 'categorie 11'),
array('catID' => '12', 'naam' => 'categorie 12')),
10=> array( array('catID' => '13', 'naam' => 'categorie 13'),
array('catID' => '14', 'naam' => 'categorie 14'),
array('catID' => '15', 'naam' => 'categorie 15')),
4=> array( array('catID' => '16', 'naam' => 'categorie 16')),
16=> array( array('catID' => '17', 'naam' => 'categorie 17')),
17=> array( array('catID' => '18', 'naam' => 'categorie 18')),
18=> array( array('catID' => '19', 'naam' => 'categorie 19')),
19=> array( array('catID' => '20', 'naam' => 'categorie 20')),
20=> array( array('catID' => '21', 'naam' => 'categorie 21'))
);

function show_tree( $_aCat, $_iParent = 0 )
{
static $iLevel = 0;

foreach( $_aCat[$_iParent] as $v )
{
echo ( $iLevel > 0 ? str_repeat('--', $iLevel) . '&gt;' : '' ) , '<a href="' , $v['catID'] , '">' , $v['naam'] , '</a><br />';

if( !empty($_aCat[$v['catID']]) )
{
$iLevel++;

show_tree($_aCat, $v['catID']);

$iLevel--;
}
}

} # end function show_tree

show_tree($aCat);
?>

We roepen de functie show_tree steeds recursief aan hierdoor kun je oneindig veel submenu's hebben. Je zou deze functie in een klasse kunnen maken en dan van de parameter $_aCat een attribuut maken. Omdat we steeds de functie aanroepen kopiëren we steeds $_aCat, dit is niet de beste manier.

Reageren