This line
$SpecialFields = explode( "," , $FL[SpecialFieldOptions]);
suggests that you need to rethink your database design a bit, to include an additional table (Google for "database normalization" for details).
$faninfo will already be visible inside the foreach() loop (a local variable's scope covers the entire function).
One thing that will no doubt be necessary:
if ($SpecialField == $faninfo['SpecialField']) { // $foo[bar] is bad. Quote associative array indices
$selected_option="selected=\"selected\"";
}
else {
$selected_option="";
}
Otherwise once $selected_option is set to "selected=\"selected\", there's nothing to reset it to blank (plus it means that $selected_option has a value every time you try to use it. Always develop with error_reporting set to E_ALL to catch mistakes like this).
Are $FanID and $FanlistingID set? If they're coming from a form, then you should be using $GET['FanID'] or $POST['FanID'] depending on how the form was submitted (and you should turn register_globals off as it is a significant security risk).
The name attribute of the <select> tag should be just name="FL[FanlistingSpecialField]" - the $ is not necessary.
What exactly is $faninfo? Where does it come from, what is its value? Presumably it's one of the things that might be in the $SpecialFields array.