[PHP] recursieve functie loopt

Pagina: 1
Acties:
  • 266 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • whitehouse
  • Registratie: Maart 2000
  • Laatst online: 18-09-2019
ik heb de volgende recursieve functie die ergens door schijnt te loopen :

code:
1
2
3
4
5
6
7
8
9
10
11
12
function showrecords($id=0) {
    $sql = "select * from item where parent_id=$id";
    $result=mysql_query($sql);
    if(mysql_num_rows($result)>0) {
        echo "<ul>";
        while ($row = mysql_fetch_object($result)) {
            $teller=$teller++;
            echo "<li>".$row->item_id."</li>";
            showrecords(mysql_result($result,$teller,'item_id'));   
        }
    }
}


waardoor komt mijn functie in een never-ending loop? (phpfreakz kon mij geen antwoord geven :'(

| www.everythingisspiritual.com | www.mosaic.org |


Acties:
  • 0 Henk 'm!

  • joggie
  • Registratie: November 2004
  • Laatst online: 03-02 15:00

joggie

Wie niet gek is, is saai

whitehouse schreef op maandag 09 januari 2006 @ 23:57:
ik heb de volgende recursieve functie die ergens door schijnt te loopen :

code:
1
2
3
4
5
6
7
8
9
10
11
12
function showrecords($id=0) {
    $sql = "select * from item where parent_id=$id";
    $result=mysql_query($sql);
    if(mysql_num_rows($result)>0) {
        echo "<ul>";
        while ($row = mysql_fetch_object($result)) {
            $teller=$teller++;
            echo "<li>".$row->item_id."</li>";
            showrecords(mysql_result($result,$teller,'item_id'));   
        }
    }
}


waardoor komt mijn functie in een never-ending loop? (phpfreakz kon mij geen antwoord geven :'(
Misschien kun je dit eens proberen:
code:
1
   $sql = "select * from item where parent_id=".$id;

En als ik naar je functie aanroep kijk, blijft deze altijd op nul staan!
code:
1
function showrecords($id=0)

veranderen in
code:
1
function showrecords($id)

Joggie ;)


Acties:
  • 0 Henk 'm!

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Een record waarbij item_id == parent_id wellicht?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

joggie schreef op dinsdag 10 januari 2006 @ 00:03:
Misschien kun je dit eens proberen:
code:
1
   $sql = "select * from item where parent_id=".$id;
Dat is exact hetzelfde. ;)
En als ik naar je functie aanroep kijk, blijft deze altijd op nul staan!
code:
1
function showrecords($id=0)

veranderen in
code:
1
function showrecords($id)
Omdat? Er is niets mis met het opgeven van een defaultwaarde hoor, al zie ik in dit geval niet echt in hoe het nut kan hebben.

Verder is wat Orphix zegt het enige dat ik kan bedenken wat dit gedrag kan veroorzaken. Ik kan in elk geval in de code geen fout ontdekken waardoor het oneindig zou moeten loopen, dus grote kans dat het inderdaad in de data zit.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

joggie schreef op dinsdag 10 januari 2006 @ 00:03:
[...]
En als ik naar je functie aanroep kijk, blijft deze altijd op nul staan!
code:
1
function showrecords($id=0)
Dat is gewoon de default value, zie ook http://www.php.net/manual...nctions.arguments.default

edit:

-NMe- was me voor blijkbaar.

[ Voor 7% gewijzigd door Verwijderd op 10-01-2006 00:13 ]


Acties:
  • 0 Henk 'm!

  • joggie
  • Registratie: November 2004
  • Laatst online: 03-02 15:00

joggie

Wie niet gek is, is saai

mjah had het in de gate 8)7 nevermind die comment van mij dus ;)

edit:
ga ik het nu nog eens proberen:

code:
1
while ($row = mysql_fetch_object($result))


dit is toch wel een toekenning, en niet een vergelijking??

[ Voor 57% gewijzigd door joggie op 10-01-2006 00:17 ]

Joggie ;)


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Begin eens met bovenin je functie
PHP:
1
echo "Trying to print data for parent ID : ". $id  . "<br />\n";

neer te zetten, met eventueel een flush() erachter als je geen output krijgt, of een globale variabele $i die je increment en een die() als $i > 100 is, zodat je iig uit je enorme loop komt.

Gewoon standaard debuggen dus :P

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

joggie schreef op dinsdag 10 januari 2006 @ 00:15:
edit:
ga ik het nu nog eens proberen:

code:
1
while ($row = mysql_fetch_object($result))


dit is toch wel een toekenning, en niet een vergelijking??
Ja, en dat moet ook? :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

joggie schreef op dinsdag 10 januari 2006 @ 00:15:
mjah had het in de gate 8)7 nevermind die comment van mij dus ;)

edit:
ga ik het nu nog eens proberen:

code:
1
while ($row = mysql_fetch_object($result))


dit is toch wel een toekenning, en niet een vergelijking??
Ja, aan $row wordt de waarde van mysql_fetch_object() toegekend en diezelfde waarde is ook waarop getest wordt in je lus.

edit:
weeral te laat :(

[ Voor 4% gewijzigd door Verwijderd op 10-01-2006 00:21 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
PHP:
1
           $teller=$teller++;

Grapjas, zo heeft de ++ geen nut.
Gewoon $teller++; doen en klaar ben je. :)

{signature}


Acties:
  • 0 Henk 'm!

  • DRAFTER86
  • Registratie: April 2002
  • Laatst online: 10:15
whitehouse schreef op maandag 09 januari 2006 @ 23:57:
ik heb de volgende recursieve functie die ergens door schijnt te loopen :

code:
1
2
3
4
5
6
7
8
9
10
11
12
function showrecords($id=0) {
    $sql = "select * from item where parent_id=$id";
    $result=mysql_query($sql);
    if(mysql_num_rows($result)>0) {
        echo "<ul>";
        while ($row = mysql_fetch_object($result)) {
            $teller=$teller++;
            echo "<li>".$row->item_id."</li>";
            showrecords(mysql_result($result,$teller,'item_id'));   
        }
    }
}


waardoor komt mijn functie in een never-ending loop? (phpfreakz kon mij geen antwoord geven :'(
Het gaat om de regel $teller = $teller++;
Dat blijft altijd 0. Het moet zijn $teller++;
Probeer dit script maar eens voor de gein:
code:
1
2
3
4
5
6
7
8
<?
$teller = 0;
for($i=0;$i<10;$i++)
{
    $teller=$teller++;
    echo $teller."<br />";
}
?>


Edit: Ja hoor, damn you Voutloos! :P

[ Voor 20% gewijzigd door DRAFTER86 op 10-01-2006 00:31 ]


Acties:
  • 0 Henk 'm!

  • joggie
  • Registratie: November 2004
  • Laatst online: 03-02 15:00

joggie

Wie niet gek is, is saai

Voutloos schreef op dinsdag 10 januari 2006 @ 00:30:
PHP:
1
           $teller=$teller++;

Grapjas, zo heeft de ++ geen nut.
Gewoon $teller++; doen en klaar ben je. :)
lol nie eerlijk!
dat wou ik net zeggen :p

ik heb dit uitgeprobeerd net:

gaat fout:
code:
1
2
3
4
5
6
   $teller = 0;
   echo $teller."<br />\r\n";
   $teller=$teller++;
   echo $teller."<br />\r\n";

   output is 2 x 0

gaat goed:
code:
1
2
3
4
5
6
   $teller = 0;
   echo $teller."<br />\r\n";
   $teller++;
   echo $teller."<br />\r\n";

   output is 0 1

[ Voor 9% gewijzigd door joggie op 10-01-2006 00:39 ]

Joggie ;)


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
offtopic:
Leuk, al die spuit 11 reacties in dit topic. :P

joggie: carriage return-line feed (CRLF) is \r\n en niet \n\r. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Ik zou niet snel een query uitvoeren in een recursieve functie. Mocht het een beetje diep gaan dan voer je tig queries uit om een simpel menutje weer te geven... Ongetest, maar eens gedebugged ongetwijfeld performanter is iets als het volgende (jaja bloated met comments for educational purposes):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//let's define a line-break troughout our app
define ('CRLF'. "\r\n");


/**
 * fetches all data for the item tree
 */
function fetchItemData() {

    $sql = 'SELECT * FROM `item`';
    $result = mysql_query($sql);

    if(mysql_num_rows($result) > 0) {
        while ($row = mysql_fetch_object($result)) {

            //store in $data[$parent][$child] = $object format for easy recursion
            $output[$row->parent_id][$row->item_id] = $row;
        }
    }
    return $output;
}


/**
 * renders the item tree in an HTML list.
 * Depends on fetchItemData()
 */
function showrecords($id=0) {

    //fetch data only once
    static $data;
    if (empty($data)) {
        $data = fetchItemData();
    }

    //let's output a list
    echo '<ul>' .CRLF;
    
    //loop trough current parent level
    foreach($data[$id] as $childId => $object) {
        echo '<li>' .$object->importantData .CRLF;
        
        //recurse when a child has children
        if (isset($data[$childId])) {
            showrecords($childId);
        }

        //end the list item
        echo .'</li>' .CRLF;
    }

    //the list should be closed aye
    echo '</ul>' .CRLF;
}

[ Voor 7% gewijzigd door T-MOB op 10-01-2006 02:19 ]

Regeren is vooruitschuiven

Pagina: 1