Avatar billede naesbygaard Nybegynder
29. april 2002 - 08:24 Der er 15 kommentarer

Omskriv/forbedre sql/php !

function get_cat_path($id){
$res = mysql_query("SELECT * FROM shop_cats WHERE id = '$id'") or die(mysql_error());
$row = mysql_fetch_array($res);
    if($row["parent"] != "0"){
        return get_cat_path($row[parent])." > ".$row["name"];
    }else{
        return $row["name"];
    }
}

Ovenstående kode skriver en total/komplet kategori sti. Men hvis jeg kalder den 60 gange på samme side får jeg en timeout :(
Er der nogen der har en ide til hvordan dette kan forbedres? Det er jo lidt at en hård en med så mange sqls i rap!
shop_cats tabellen består af: id, name og parent. Hvis en kategori er sin egen "herre" altså en absolut topkategori har den parent = '0', ellers er parent den der er "far" til den nye underkategori.
Pt går kategorierne ikke længere ned en 3 "generationer". Men der er da er ca. 60 kategorier i alt, bliver det noget af en langhåret omgang at skulle liste dem alle på en side. (i en dropdown-menu)

/NbG
Avatar billede limemedia Nybegynder
29. april 2002 - 08:41 #1
Den er ikke helt skræddersyet til dig. Jeg har kategori forbindelser i én tabel og titler i en anden - for at en kategori reelt kan optræde flere steder i et træ.

Koden er som følger
---

<?php
    function treestructure_fetch_nodes() {
        $res = array();
        $sql = mysql_query("SELECT id, title, description FROM category ORDER BY title") or die(mysql_error());
        if (!mysql_num_rows($sql)) {
            return $res;
            exit;
        }

        while ($foo = mysql_fetch_array($sql)) {
            $res[$foo["id"]] = $foo;
        }

        return $res;
    }
   
    function treestructure_fetch_connection() {
        $parentarray = array();
        $sql = mysql_query("SELECT id, parentid FROM category_connect ORDER BY id") or die(mysql_error());
        if (!mysql_num_rows($sql)) {
            return $parentarray;
            exit;
        }

        while ($foo = mysql_fetch_array($sql)) {
            $parentarray[$foo["parentid"]][] = $foo["id"];
        }
       
        ksort ($parentarray);
        reset ($parentarray);
       
        $res = array();
        $indent = 0;
        for($i=0;$i<sizeof($parentarray[0]);$i++) {
            $foo["value"] = $parentarray[0][$i];
            $foo["indent"] = $indent;
            $res[] = $foo;
            $res = treestructure_display_tree($res, $parentarray, $parentarray[0][$i]);
        }

        return $res;
    }   

    function  treestructure_display($treenode, $treestructure) {
        $res = array();
        $indent = array();

        for($i=0;$i<sizeof($treestructure);$i++) {
            $foo["title"] = "";
            $indent[$treestructure[$i]["indent"]] = $treenode[$treestructure[$i]["value"]]["title"];

            $foo["value"] = $treestructure[$i]["value"];

            for($j=0;$j<$treestructure[$i]["indent"];$j++) $foo["title"] .= $indent[$j]." &raquo; ";
            $foo["title"] .= $treenode[$treestructure[$i]["value"]]["title"];

            $res[] = $foo;
        }

        return $res;
    }
   
    $tree = treestructure_display(treestructure_fetch_nodes(), treestructure_fetch_connection());
?>

Jeg kan prøve at assistere hvis det er, men skal til møde først. Der er ihvertfald noget at arbejde ud fra
Avatar billede disky Nybegynder
29. april 2002 - 09:38 #2
ljweb:
Ikke også dig nu skuffer du mig.

Dette her er en MYSQL gruppe, php kode hører ikke hjemme her, men i PHP gruppen !
Avatar billede Slettet bruger
29. april 2002 - 09:55 #3
disky>

Ville det være bedre hvis spørgeren lukkede, og oprettede igen? Nej, det eneste det ville medføre var en masse støj.

Men hvis du kan løse problemet udelukkende med SQL queryes er jeg imponeret...
Avatar billede limemedia Nybegynder
29. april 2002 - 09:55 #4
disky >> ahh, havde ikke set det var mysql kategorien... :)) han spørger da om php direkte... (læs : dårlig undskyldning for at være blind)
Avatar billede disky Nybegynder
29. april 2002 - 11:06 #5
ljweb:

Det er okay, sådanne noget sker når man 'hænger' med hovedet nedaf. (bor næsten 'down under' ) :-)))

Går det ellers godt dernede ?
Avatar billede limemedia Nybegynder
29. april 2002 - 11:25 #6
glimragende tak :))

NbG >> har du kigget på noget, udtænkt en plan eller hvad ?
Avatar billede naesbygaard Nybegynder
29. april 2002 - 13:38 #7
Ja, jeg har kigget en masse på det, og tak for det iøvrigt.
Problemet er lidt at systemet er indrettet således at jeg jeg kalder en function med et id som så returnerer den "fulde" sti. Dette kan godt lade sig gøre da det kun giver nogle få kald. Problemet er når jeg skal liste alle mine kategorier. Når jeg så lister alle mine kategorier (alle sammen!!!) så ville jeg jo alligevel kalde denne funktion en halv mia. gange. Derfor er det en lidt omfattende opgave at skulle omskrive alle de sider der lister kategorier. (heldigvis er det kun i administrationsmodulet, så det er til at have med at gøre)

Men jo jeg har tænkt over det, men er gik lidt i stå ved flerdimensionelle arrays. Mest hvordan det skulle bygges op og så smides ud på igen.
Kan du evt. forklare hvad der skulle ske? Hvilken dimension af arrayet der bærer hvilke informationer. Hvordan listen skal udføres.
Det jeg gerne skulle opnå er et resultat formateret som nedenstående:

hardware > apple > bærbare
hardware > pc > bærbare
software > Adobe > photoshop

men det eneste den får af vide er jo id, name og parent.

Takker mange gange for den flittige indsats so far

/NbG
Avatar billede limemedia Nybegynder
29. april 2002 - 14:18 #8
naes >> det min kode - til et helt andet site og opbygning gør, er at beregne alle referencerne til kategorierne, altså det såkaldte "breadcrumb navigation" som det jo læner sig voldsomt op af. På den måde, vil du med kun to sql kald kunne liste samtlige, fremfor flere kald for at vise én.

Jeg leger lidt med det og vender tilbage. Har du noget db ht="må lege med ? Eller skal jeg selv finde på det
Avatar billede naesbygaard Nybegynder
29. april 2002 - 14:44 #9
db ht? hvad er det?
Avatar billede limemedia Nybegynder
29. april 2002 - 14:53 #10
jeg havde nu skrevet "vi" - ved ikke hvorfor det engang imellem går helt galt her på eksperten med mine indlæg.
Avatar billede naesbygaard Nybegynder
29. april 2002 - 15:01 #11
hvad vil i have?
Avatar billede limemedia Nybegynder
29. april 2002 - 15:09 #12
gerne et dump af din "shop_cats" tabel
Avatar billede naesbygaard Nybegynder
29. april 2002 - 15:13 #13
#
# Struktur dump for tabellen shop_cats
#

CREATE TABLE shop_cats (
  id int(10) DEFAULT '0' NOT NULL auto_increment,
  name varchar(30) NOT NULL,
  parent int(10) DEFAULT '0' NOT NULL,
  UNIQUE id (id)
);

#
# Data dump for tabellen shop_cats
#

INSERT INTO shop_cats VALUES (1, 'Hardware', 0);
INSERT INTO shop_cats VALUES (3, 'Markzware', 2);
INSERT INTO shop_cats VALUES (4, 'Techno Design', 2);
INSERT INTO shop_cats VALUES (5, 'Plugins', 0);
INSERT INTO shop_cats VALUES (6, 'PDF', 2);
INSERT INTO shop_cats VALUES (7, 'Flightcheck', 3);
INSERT INTO shop_cats VALUES (12, 'Biler', 1);
INSERT INTO shop_cats VALUES (10, 'PC', 1);
INSERT INTO shop_cats VALUES (27, 'Skærme', 0);
INSERT INTO shop_cats VALUES (14, 'Service', 0);
INSERT INTO shop_cats VALUES (15, 'Software', 0);
INSERT INTO shop_cats VALUES (24, 'Compaq', 1);
INSERT INTO shop_cats VALUES (23, 'Bærbare', 21);
INSERT INTO shop_cats VALUES (21, 'Apple', 1);
INSERT INTO shop_cats VALUES (18, 'Arbejdsstationer', 10);


Jeg har lige fundet ud af at der er en fejl i mit rekursive kald. Somehow kører den i ring, og det er derfor den timerout! Men jeg kan ikke lige forstå hvorfor. :(

/NbG
Avatar billede disky Nybegynder
30. april 2002 - 12:19 #14
i enhver rekursiv metode skal der på et tidspunkt opstå en situation hvor den IKKE kalder sig selv rekursivt mere.

Folk glemmer det meget tit.
Avatar billede naesbygaard Nybegynder
29. august 2002 - 00:14 #15
LJ, Det er dit svar der er det gode! Vil du ha nogle af de dersens point som jeg har??? :)

/NbG
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
Computerworld tilbyder specialiserede kurser i database-management

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