Well, neither eval() nor ob_start() would be hugely useful....
Is your problem that you don't know in advance which fields will be asked for in the dbgetv call? Because if you want the code to look like
list( $firstname, $lastname, $age ) = dbgetv( $database, 'firstname','lastname','age' ) ;
when it's evaluated, then the obvious code to write would be
list( $firstname, $lastname, $age ) = dbgetv( $database, 'firstname','lastname','age' ) ;
On the other hand, if the fields requested are decided on at runtime, so that you're writing
dbgetv( $database, $field1, $field2, $field3 ) ;
then you don't want the variables to have the same names as the fields, because you won't know what the variables are named when you want to use them. What you'd really want to do in that case is have dbgetv() return an associative array, using the requested field names as keys.
If you can't change dbgetv then things get messier. I'm going to take a wild guess and assume that dbgetv() can take a variable number of arguments. Let's say you've got a list of the fields you're requesting in an array.
$fields_to_request = array('firstname', 'lastname', 'age');
And I'm going to take a further wild guess and assume that dbgetv() will return fields in the same order that they're asked in - otherwise you're stuffed.
$returned_values = call_user_func_array('dbgetv', $fields_to_request);
And then you just need to pair off the elements of $fields_to_request with the elements of $returned_values, so that you get $result['firstname']="Firstname", $result['lastname']="Lastname", etc. So that the results are finally in the form that dbgetv() should have returned them in in the first place.
The pairing off could be done in PHP5 by writing
$result = array_combine($fields_to_request, $returned_values);
. In earlier versions a loop would have to be written to do the task.