Need to condense the following into a looping function
You seem to always end with the check: Is there another parent? Or as it can be formulated, while there is another parent, grab that parent.

Luckily for you, there are while loops.

while (!empty($parent)) {
    $query = $connection-&gt;query("SELECT * FROM pages WHERE filename='$parent'");        
    while($row = $query-&gt;fetch_array()) {
        $path_arr = explode('/',$row['path_to']);
        end($path_arr);
        $key = key($path_arr)-1;
        $parent = $path_arr[$key];
        break; // break from the inner loop that fetches each row
    }
}


This code will continue looping while there is a parent available. Note that the new parent uses the same variable as the previous one, this is an important part in making this loop work.

Other suggestions:


Use prepared statements! It is good that you seem to sanitize your inputs by using the real_escape_string method. But prepared statements is always better. And then you wouldn't have to use the real_escape_string call.
Since this code only gets the first result, you don't need the inner while loop and can replace it by a if instead.

while (!empty($parent)) {
    $query = $connection-&gt;query("SELECT * FROM pages WHERE filename='$parent'");        
    if ($row = $query-&gt;fetch_array()) {
        $path_arr = explode('/',$row['path_to']);
        end($path_arr);
        $key = key($path_arr)-1;
        $parent = $path_arr[$key];
    }
}

I do have to ask though: What's the point in just grabbing the parent until there are no more parents? To store all the parents in an array, let's do like this:

$parents = array();
while (!empty($parent)) {
    $parents[] = $parent; // add parent to the array
    $query = $connection-&gt;query("SELECT * FROM pages WHERE filename='$parent'");        
    if ($row = $query-&gt;fetch_array()) {
        $path_arr = explode('/',$row['path_to']);
        end($path_arr);
        $key = key($path_arr)-1;
        $parent = $path_arr[$key];
    }
}



Now, when this loop finishes, $parents contains all the parents that was not empty. Now you can loop through that using a foreach loop, or use it with implode or whatever you'd like :)