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();
?>