Autor Zpráva
Ivorius
Profil
Zdravím, mám tuto funkci, která mi má na základě url vrátit ID kategorie případně FALSE pokud kategorie neexistuje

function idfromurl(){
      $i=1;   
      while (isset($_GET["category".$i])){
         $castikategorie[]=$_GET["category".$i];
         $i++;
      } 
      $i = 1;
      do{   
        $aktualnikat = (count($castikategorie)-$i);
        $sql="SELECT id, nadkat, url FROM kategorie WHERE url='".$castikategorie[$aktualnikat]."'";
        $vysledek = MySQL_Query($sql) or die ("Dotaz neproveden");
        
          if(!mysql_num_rows($vysledek)) { //Neexistuje kategorie
            $return = FALSE;
            break;
          }
          else { //Kategorie existuje
            if(mysql_num_rows($vysledek) > 1) { //je více výsledku s tímto url
               .....
            }
            else { //existuje pouze jedno url
              $row = mysql_fetch_assoc($vysledek); 
              $id=$row["id"];
              $return = $id; //Navrat id poslední kategorie
            }
          }
         $i++;
        }
        while ($aktualnikat != 0);      //procházej dokud nedojdeme na hlavní kategorie
  
  return $return;
}


Situace je taková, že mohou existovat v url různé category (např. category1, category2, atd..) Přičemž category2 a další mohou mít stejné url pokud nemají stejnou nadřazenou category. V databázi mám vždy krom id, url a dalších informací také sloupec nadkat který mi právě odkazuje na nadřazenou kategorii.

Zatím mi to funguje, pokud není více kategorií které mají stejnou url. Mohl by mi někdo poradit jak doplnit
if(mysql_num_rows($vysledek) > 1) { ..... } tak abych mohl zjistit id té kategorie na základě jejich nadřazené kategorie která je v url?
Joker
Profil
Ivorius
Možná úplně nerozumím otázce, ale:
Přičemž category2 a další mohou mít stejné url
Možná je lepší ukládat do tabulky konečné URL (tj. něco jako nadkategorie/podkategorie), což bude unikátní. Sice to jde proti normalizaci databázových tabulek (v tabulce se uchovávají dopočitatelná data), ale IMHO obhajitelné přínosy, které to bude mít.

Další věc, nechápu, proč se to dělá takhle komplikovaně. Kdyby výsledkem byly nějaké "hezké" URL, tak budiž, ale tady bude výsledkem category1, category2,... To už je jednodušší mít adresu třeba ...?category=5 a celé hledání kategorie se zjednoduší na: "SELECT id, nadkat, url FROM kategorie WHERE id=".intval($_GET["category"]);
Ivorius
Profil
Nene, výsledkem je např. neco.cz/kategorie1/kategorie2/kategorie3/ ...Ale to samozřejmě přes .htaccess jde na index.php?category=1&category2...
Ivorius
Profil
ale může např. nastat situace kdy budu mít

neco.cz/latky/40cm/odstin-bile
neco.cz/latky/70cm/odstin-bile
neco.cz/bavlna/40cm/odstin-bile

a já to právě potřebuji nějak rozlišit jaké to odstin-bile má id na základě předešlých údajů v url.
Joker
Profil
Ivorius
Jo, tak už to snad chápu.
Nicméně v tom případě ten .htaccess bude jen na omezený počet kategorií, ne?

No, každopádně, jsou asi dvě možnosti. První je to, co jsem psal výše: že u každé kategorie by byla uložená plná cesta, tj. například "bavlna/40cm/odstin-bile", což by bylo jednoznačné. Nevýhoda je, že v databázi budou uložené dopočitatelné (a tím pádem nadbytečné) údaje a při přejmenování nějaké kategorie bude potřeba aktualizovat i všechny podkategorie.

Druhý způsob je adresu kategorie "poctivě sestavovat" z údajů v databázi. Tak to dělám třeba na svém webu.
Ovšem tady je ale problém, že jestli aktuálně jediný údaj určující umístění dané kategorie ve stromu je ID její nadkategorie, bude potřeba tu tabulku pozměnit. Tady doporučuju nějaký článek na téma ukládání hierarchické struktury do databáze, například tady je to docela pěkně vyložené (ovšem v angličtině): http://www.sitepoint.com/article/hierarchical-data-database

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: