PHP has four magic constants, __FILE__, __LINE__, __FUNCTION__ and __CLASS__ that can be used to backtrack to the source of the problem.

<?php
// generic database query wrapper 
// Use pecl/filter or mysql_real_string to avoid sql injection here
function query_wrapper($query$file$line$class$function)
{
    
$r mysql_query($query);
        if (!
$r) {
        
trigger_error("Failed executing query '{$query}' on {$file}:{$line}
inside "
.($class "{$class}::" '')."{$function}()",  E_USER_ERROR);
    }
        return 
$r;
}
            
// fetch message based on a numeric identifier
function get_message($id$file$line$class$function)
{
    
$result query_wrapper("SELECT * FROM msg WHERE id=".$id$file$line$class$function);
    return 
fetch_object_wrapper($result);
}

// main code
function foo()
{
    
$message get_message($_GET['id'], __FILE____LINE____CLASS____FUNCTION__);
}

foo();
?>