Avatar billede djthomas Nybegynder
08. januar 2006 - 17:46 Der er 8 kommentarer og
1 løsning

Fejl når method kalder sig selv

Hej jeg har en klasse med disse 3 funktioner:

function get_category_by_id( $id, $select = "*" ){
   
        $sql = "SELECT
                   
                    " . $select . "
               
                FROM
                   
                " . $this->table . "
                   
                WHERE
                                   
                    id = " . $id;
       
        $result = mysql_query( $sql ) or die( "Kunne ikke hente produktkategorien" );

            if( $result )
            {
                return mysql_fetch_assoc( $result );
            }
   
    }

    function get_parent_category( $id ){
   
        $thisCategory = $this->get_category_by_id( $id, "id, childOf" );
       
        $sql = "SELECT name, id FROM " . $this->table . " WHERE childOf = " . $thisCategory["childOf"];

        $result = mysql_query( $sql );

        if( $result ){
       
            return mysql_fetch_assoc( $result );           

        }

    }

    function get_all_parent_categories( $id ){

        if( $id <> 0 ){
       
            $parent_id = $this->get_parent_category( $id );

            $this->get_all_parent_categories( $parent_id["id"] );

            return $parent_id["name"] . " :: ";

        } else {
            exit;
        }
   
    }

MEN når jeg i functionen "get_all_parent_categories" kalder denne linje "$this->get_all_parent_categories( $parent_id["id"] );" fejler hele class'en. Hvorfor gør den det?
Avatar billede nielle Nybegynder
08. januar 2006 - 18:13 #1
Det kunne f.eks. skyldes at din get_all_parent_categories() ikke returnere et resultat i tilfældet hvor exit bliver kaldt.

Måske sådan her?

function get_all_parent_categories( $id )
{
    if ( $id <> 0 )
    {
        $parent_id = $this->get_parent_category( $id );
        $this->get_all_parent_categories( $parent_id["id"] );
        return $parent_id["name"] . " :: ";
    }
    else
    {
        return 0;
    }
}
Avatar billede djthomas Nybegynder
08. januar 2006 - 18:16 #2
Nej den fejler stadigvæk når jeg går det...
Avatar billede nielle Nybegynder
08. januar 2006 - 18:23 #3
PÅ hvilken måde fejler den? Hvad sker der ikke? Hvad sker der? Hvad forventer du at der skulle ske? Hvilke fejlmeddelelser får du?
Avatar billede djthomas Nybegynder
08. januar 2006 - 18:34 #4
Faktisk så får jeg ikke nogen fejlmeddelser, for classen vises af en eller anden grund ikke når den fejler - don't know why...
Avatar billede nielle Nybegynder
08. januar 2006 - 19:28 #5
Jeg kan ikke lige gennemskue din kode og dine tabeller nok til at rette eksemplet. Men jeg kan fortælle hvor det er den går galt.

Antag at du starter med et id, f.eks. 13. Med dette kaldes:

get_all_parent_categories( 13 )

og dermed:

get_parent_category( 13 );

og dermed:

get_category_by_id( 13, "id, childOf" );

hvilket resultere i følgende SQL:

SELECT id, childOf FROM dinTabel WHERE id = 13

Resultatet af denne returneres til get_parent_category. Lad os antage at værdien af chieldOf er 42. Resultatet er derfor følgende SQL:

SELECT name, id FROM dinTabel WHERE childOf = 42

Resultatet af denne returneres til get_all_parent_categories:

$parent_id = $this->get_parent_category( $id );
$this->get_all_parent_categories( $parent_id["id"] );

Da $parent_id["id"] er lig med 13, så kalder du altså:

get_all_parent_categories( 13 );

Men det var jo netop det du startede med. Du har med andre ord skabt dig en uendelig løkke!

Der er simpelthen det der er fejlen, men der er også andre problemer med din kode. Det primære af dette er at dine funktioner ikke altid returnere en værdi. Det skal de gøre, om ikke andet så værdien null.
Avatar billede djthomas Nybegynder
08. januar 2006 - 19:53 #6
Det er ikke helt rigtigt det du skriver. Der startes ikke end uendelig lykke. Jeg kan også se at scriptet bliver færdigt ret hurtigt.

og der blir heller ikke kaldt nogle værdier som giver en uendelig lykke.

Eks kan jeg kalde 42, som er childOf 13. 13 er childOf 3. Og 3 er childOf 0 og så skal funktionen blot returnere 0 og derved ikke køre i "loop" mere
Avatar billede nielle Nybegynder
08. januar 2006 - 20:05 #7
Jeg har nu tjekket min analyse en gang til, og jeg står stadig ved den.
Avatar billede djthomas Nybegynder
17. januar 2006 - 21:02 #8
jeg måtte lave det omvent, for at det virkede, men jeg holder stadig på at analysen ikke er rigtig i det her tilfælde - men derfor behøver vi jo ikke starte 3. verdenskrig. Så jeg lukker og slukker blot...
Avatar billede nielle Nybegynder
18. januar 2006 - 00:00 #9
Som du vil - jeg tager det ikke specielt ilde op (men min analyse var korrekt - bzzzzt ;^).
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