Jump to content


Photo

Php Recursion Problem - Value Returns Null... Variable Scope Issue?


  • Please log in to reply
3 replies to this topic

#1 thedust2010

thedust2010
  • Members
  • PipPip
  • Member
  • 13 posts

Posted 29 June 2006 - 10:08 PM

In my 3 years of PHP application development I don't think I've ever been this perplexed. It is rather difficult to explain, but hopefully it makes sense. For brevity I'm not giving details about the database table structures. Really it is irrelevant for what my problem is, which appears to be some sort of variable scope issue. The problem appears to be something really elementary...

I have a database-driven system of files and folders with permission to view these contents specified on a per-user basis. Occasionally this means assigning a folder a new parent folder if the user is blocked from seeing it. I've provided a visual aid that makes this much easier to comprehend:

[img src=\"http://dustwurks.com/nested_folders.gif\" border=\"0\" alt=\"IPB Image\" /]

So here in this example we would be looking to assign "TEST2" as the parent of "INSIDE 4". To do this, I have a recursive function that finds the new parent ID that should be assigned. It looks like this:

function findParentID($userID, $folderID) {
    global $DB;
    
    $SQL = "SELECT folderID FROM navAccessFolders WHERE folderID=".$folderID." AND userID=".$userID;
    $Row = $DB->GetRow($SQL);
    if ($Row) {
        echo "value to return: ".$folderID."<br>"; // for troubleshooting
        return $folderID;
    } else {
        $SQL = "SELECT parentID FROM folders WHERE folderID=".$folderID;
        $Row = $DB->GetRow($SQL);
        findParentID($userID, $Row["parentID"]);
    }
}

Now let's say the folder ID for "INSIDE 4" is 138. To get the parentID I would use:

$parentID = findParentID(1, 138); // using "1" as a sample user ID
echo "value returned: ".$parentID."<br>"; // for troubleshooting

This functionality WORKS if the findParentID function never calls upon itself again. Then the value returns null. But here is the part I don't think anyone can explain to me. The actual output from the code used above is:

value to return: 135
value returned: 

I am echoing the value just before the function returns it and it IS in fact the correct value. However, it is not returning the value that I am seeing in the output. It returns null. How can this be? There is not one line of code between the echo and the return. And again, this ONLY is happening when the function calls upon itself again. The function works but the value returns null anyways.

If someone can figure this one out, you will have made my list of all-time top coders (and maybe we can hire you for some work sometime??). Any advice or help is much appreciated. I'm so close...

#2 nogray

nogray
  • Members
  • PipPipPip
  • Advanced Member
  • 930 posts
  • LocationSan Francisco CA

Posted 29 June 2006 - 10:17 PM

I think you are missing a return in the else part.

return findParentID($userID, $Row["parentID"]);

this just a guess, but give it a shot.

NoGray.com


#3 Guest_Dustin Hansen_*

Guest_Dustin Hansen_*
  • Guests

Posted 30 June 2006 - 08:27 PM

That COMPLETELY did it.  I didn't realize I had to have the "return" there in the else statement.  I figured it just recursively looped until it was true and then returned that value.  I'll need to wrap my head around this one.  Thanks very very much!!

#4 nogray

nogray
  • Members
  • PipPipPip
  • Advanced Member
  • 930 posts
  • LocationSan Francisco CA

Posted 30 June 2006 - 08:39 PM

a recursive is just like any other function instead it calls itself.

So basically it works kinda like this

function,
  return match if true,

  return function if false,
    return match if true

    return function if false.
        etc etc....

so, after looping so and so times, each function call must return a result until it reach the top function which will return the final result. A bit odd at first, but it's simple when you get it.

NoGray.com





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users