Imam problem, ne mogu da nadjem pravo (organizaciono) resenje za kategorije. Pokusacu da vam obrazlozim problem sto je moguce detaljnije.
Imam MySQL tabelu:
CREATE TABLE `cats` (
`id` int(10) unsigned NOT NULL auto_increment,
`parent` int(10) unsigned NOT NULL default '0',
`name` varchar(32) NOT NULL default '',
...
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
Ta tabela drzi informacije o kategorijama. Kategorije mogu da imaju ista imena ako se nalaze na razlicitom hijerarhijskom nivou. Zato imam id i parent, a name je samo opis. Znaci, opisi mogu biti isti, ali ne na istom nivou. U adminu proveravam da li postoji red u bazi sa istim parent-om i name-om, ako ima, ne moze da se unese novi. Primer: znaci, putanja do kategorije moze da bude i 'cat24/cat13/cat24/cat45a', a da name='cat24' imaju dva reda u bazi, s tim da ce jednom parent biti 0 (jer je toplevel), a drugom ce parent biti id polja ciji je name 'cat13'.
Jos je vazno da napomenem da ostala polja iz tabele (ona '...') sadrze informacije koje child-ovi nasledjuju od parent-a.
E sad, problem.
Kad hocu da izvucem red iz baze sa tekucom (pod)kategorijom x, a imam putanju npr. cat1/cat2/catx, to radim ovako:
$x = 'cat1/cat2/catx';
$x1 = explode('/', $x);
$sql_str = "SELECT * FROM cats WHERE name IN ('" . implode ("', '", array_unique ($x1)) . "')";
$sql_return = mysql_query($sql_str);
while ( $out = mysql_fetch_assoc($sql_return) ) $niz[] = $out;
Posle ovoga poredjam $niz po putanji (odnosno po nizu $x1), pa vadim tekuci ( $tekuci = $niz[count($x1)-1] ) koji je ujedno i poslednji, a onda od predzadnjeg trcim redom ka toplevel-u (for ciklusom) i radim update parent-ovim podacima ako tekuci nema naveden taj podatak (to je ono '...' u SQL strukturi).
To radi kako treba (sto kazu, 'drzi vodu'), mada pretpostavljam da i to moze elegantnije da se resi.
Jedino sto mi u ovoj organizaciji nije jasno, to je kako da dobijem isti rezultat na kraju (tj. niz sa podacima o tekucem) ako krecem od:
$x = x; (id kategorije)
a ne sa putanjom ($x = 'c1/c2/...';)
Znaci, pitanje je: kako da nadjem odredjenu (pod)kategoriju (po mogucstvu, sa svim podesenjima koje moze da nasledi od parent-a) ako imam samo njen id? Koliko ja znam, MySQL nema rekurzivne funkcije, ali ne znam kako da ih simuliram u PHPu, a da ne radim na pocetku "SELECT * FROM cats". To mi ipak deluje malo neoptimizovano...
Ima li neko ideju kako ovo resiti, ili bar savet? Nadam se da necu morati zbog ovog problema da radim restruktuiranje baze. A ipak bih zeleo taj deo maksimalno da optimizujem jer se izvrsava u prepend-u svake stranice...
Unapred hvala.