Скорее всего, mysql_query возвращает false.
Попробуйте написать:
$result = mysql_query("SELECT * FROM directory WHERE id = $id") or die("Invalid query: " . mysql_error());
Проверьте, что лежит в переменной $id.
Вообще, нехорошо в функции брать значение переменной из $_GET параметра, лучше сделать $id аргументом функции:
function directory_val($id, $val) {
...
}
А вызывать так:
$id = (int) $_GET['id'];
directory_val($id, 'title');
К тому же - зачем вам цикл по строкам, если у вас id уникальный?
Напишите хотя бы так:
$result = mysql_query("SELECT * FROM directory WHERE id = $id LIMIT 1") or die("Invalid query: " . mysql_error());
$row = mysql_fetch_assoc($result);
if(key_exists($val, $row)) {
echo $row[$val];
}