Avatar billede bgjensen Nybegynder
19. februar 2006 - 21:52 Der er 18 kommentarer og
1 løsning

linkdatabase med kategorier

Jeg er igang med at lave en linkdatabase. Men nu er det sådan at jeg gerne vil have linkene ind i kategorier, men hvordan laver man det bedst/nemmest. Skal jeg bruge en sql tabel til kategorierne, eller et array eller noget helt trejde, det skal være nemt at kunne tilføje flere kategorier, samt underkategorier. Nogle som har nogle ideer??? Jeg behøves ikke en færdig kode bare noget at gå efter!
Avatar billede jakobdo Ekspert
19. februar 2006 - 21:56 #1
Jeg ville lave det sådan her:

kategori-tabel:
id = int autoincrement primary
navn = varchar (indeholder navnet på kategorien)

link-tabel:
id = int autoincrement primary
navn = varchar (linkets navn, f.eks. Eksperten)
url = varchar 255 (og måske man skulle bruge text)
kategori = int (skal matche kategori-id fra kategori-tabellen)
Avatar billede bgjensen Nybegynder
19. februar 2006 - 21:59 #2
nu ville jeg gerne have underkategorier også, så der skal være noget som forbinder en underkategori men en overkategori.
Avatar billede greew Nybegynder
19. februar 2006 - 23:22 #3
så kan du evt. udvide kategori-tabellen til at indeholde et ekstra felt:

overkategori = int (id'et på den kategori, som denne kategori ligger under)

hvis du har fat i en topkategori kan du evt. lade feltet være 0 eller NULL eller noget andet.. så længe dit script forstår at det er en top-kategori..
Avatar billede bgjensen Nybegynder
19. februar 2006 - 23:59 #4
ok men hvad gør jeg så hvis jeg vil lave et udtræk som viser alle de kategorier som er oprettet, så de bliver listet rigtigt eks: (hvis jeg benytter den måde greew foreslog)

Test1
Test1_1
Test1_2
Test2
Test1_2
OSV.
Avatar billede jakobdo Ekspert
20. februar 2006 - 08:18 #5
Det kan du så ikke lave udelukkende i SQL, så skal du efterfølgende sortere det via php...
Måske du kan bruge dette som eksempel:
http://www.codebreaker.dk/exp/644538menu.php
Avatar billede greew Nybegynder
20. februar 2006 - 08:41 #6
jakobdo: det var præcis sådan noget, jeg havde forestillet mig :)
Avatar billede jakobdo Ekspert
20. februar 2006 - 08:48 #7
Det er også et spørgsmål som er blevet stillet mange gange her på eksperten.
Avatar billede bgjensen Nybegynder
20. februar 2006 - 08:55 #8
takker lige havd jeg manglede, tak for det. smid et svar.
Avatar billede jakobdo Ekspert
20. februar 2006 - 09:04 #9
Svar!
Avatar billede jakobdo Ekspert
20. februar 2006 - 09:10 #10
Takker for point!
Avatar billede bgjensen Nybegynder
20. februar 2006 - 09:54 #11
jakobdo -> nu har jeg benytte mig at dit script, men kan du fortælle mig hvorfor at det kun er den første hovedmenu som ikke bliver rykket ind eks.

Test1_0  -Hovedmenu
Test1_1  -Undermenu
  Test1_2 -Undermenu
Test2_0  -Hovedmenu

Så alle hovedmenuer undtagen den først bliver rykket ind så det ser ud som om de er en undermenu, selvom de er en hovedmenu.
Avatar billede bgjensen Nybegynder
20. februar 2006 - 09:55 #12
ok den fjernede nogle mellemrum da jeg postede, men håber du forstår :)
Avatar billede jakobdo Ekspert
20. februar 2006 - 10:30 #13
Prøv at vis mig den kode du bruger!
Avatar billede bgjensen Nybegynder
20. februar 2006 - 10:32 #14
<?php
include_once('config.php');
extract($_REQUEST);

function SubSearch(&$array, &$dest_Arr, $owner)
{
    while (list($key) = each($array))
    {
        if ($array[$key]['overkategori'] == $owner)
        {
            $tempArr = $array[$key];
            SubSearch($array, $tempArr, $array[$key]['id']);
            $dest_Arr['submenu'][] = $tempArr;
            unset($array[$key]);
        }
    }
    reset($array);
}

function printMenu($mArray,$level)
{
    foreach($mArray as $row)
    {
        echo printSpaces($level) . "<a href=\"#\" onClick=\"document.edit.overkategori.value='".$row['id']."';\">" . $row['navn'] . "</a><br>\r\n";
       
        if($row['submenu'])
        {
            printMenu($row['submenu'],++$level);
        }
    }
}

function printSpaces($num)
{
    $output = "";
    for($i = 0; $i < $num; $i++)
    {
        $output .= "&nbsp;&nbsp;";
    }
    return $output;
}

function getMenues()
{
    $output = "<option value=\"0\">Hovedmenu</option>";
    $query = mysql_query("SELECT id, navn FROM kategori ORDER BY id");
    if(mysql_num_rows($query)>0)
    {
        while($row = mysql_fetch_object($query))
        {
            $output .= "<option value=\"".$row->id."\">".$row->navn."</option>";
        }
    }
    return $output;
}

$menuArray = array();

$query = mysql_query("SELECT id, navn, overkategori FROM kategori ORDER BY overkategori, id");
if(mysql_num_rows($query) > 0)
{
    while($row = mysql_fetch_assoc($query))
    {
        $menuArray[] = $row;
    }
}
else
{
    $menuArray = array("Ingen menupunkter, opret nogle");
}

while (list($key) = each($menuArray))
{
    if ($menuArray[$key]['overkategori'] == 0)
    {
        $tempArr = $menuArray[$key];
        SubSearch($menuArray, $tempArr, $menuArray[$key]['id']);
        unset($menuArray[$key]);
        $MyMenu[] = $tempArr;
    }
    reset($menuArray);
}

$db_felter = array('navn','overkategori');

if($submit)
{
  foreach ($db_felter as $name)
  {
    if (get_magic_quotes_gpc())
    {
        $$name = stripslashes($$name);
      }
     
    if ($sets) $sets .= ', ';
    $sets .= "$name = '".addslashes($$name)."'";
  }

  $insert = 'INSERT INTO kategori SET '.$sets;
  mysql_query($insert);
  echo 'Databasen er opdateret.';
}
else
{
  printMenu($MyMenu,0);
?>

<form name="edit" action="kategori.php" method="POST">
<input type="hidden" name="id" value="<?= $id; ?>">

<table border="0">
  <tr>
    <td>Titel:</td>
    <td><input type="text" name="navn" value="<?= $navn; ?>"></td>
  </tr>
  <tr>
    <td>Over kategori:</td>
    <td><select name="overkategori">
    <?= getMenues(); ?>
    </select></td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" name="submit" value="Gem"></td>
  </tr>
</table>

</form>

<?php
}
?>
Avatar billede jakobdo Ekspert
20. februar 2006 - 10:37 #15
Prøv at lave en
echo "<pre>":
print_r($MyMenu);
echo "</pre>";
exit();
istedet for printMenu();

Så kan vi lige se hvad dit array indeholder...
Avatar billede bgjensen Nybegynder
20. februar 2006 - 10:42 #16
Array
(
    [0] => Array
        (
            [id] => 1
            [navn] => test
            [overkategori] => 0
            [submenu] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [navn] => test1
                            [overkategori] => 1
                        )

                )

        )

    [1] => Array
        (
            [id] => 5
            [navn] => ny kat
            [overkategori] => 0
        )

    [2] => Array
        (
            [id] => 7
            [navn] => ny kat igen
            [overkategori] => 0
            [submenu] => Array
                (
                    [0] => Array
                        (
                            [id] => 8
                            [navn] => bøhh
                            [overkategori] => 7
                        )

                )

        )

)
Avatar billede jakobdo Ekspert
20. februar 2006 - 10:58 #17
Det ser rigtigt ud...
Der må være noget galt i min kode! :o(
Prøv at lav noget debug omkring printSpaces.
Måske den skal starte på 1 eller lign.
Gider ikke lige teste igennem nu. :o)
Avatar billede bgjensen Nybegynder
20. februar 2006 - 11:01 #18
ok men tak for hjælpen
Avatar billede jakobdo Ekspert
20. februar 2006 - 11:07 #19
Det var ihf så lidt!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester