Olayın şu olması lazım, bildiğiniz gibi php kodları yukarıdan aşağıya sırayla çalışır. Önce daha önceden post işlemi olmadan submit ederseniz php bakıyor bu sessionun içi boş, sonra bakıyor post gelmiş sessionu atıyor sonra altta atanan session yazılıyor.
Daha önceden submit işlemi olduysa yine aynı şekilde en üstte önce bir önceki submit işleminden kalan session değerini yazıyor, sonra bakıyor post gelmiş onun içinde de session yeni değerini atayıp aşağıya da yeni değerini yazıyor.
Bu şekilde deneyin session_start();
if(!isset($_SESSION['ad'])){
echo "1. SESSION: Henüz bu değerin içi boş
";
} else
echo "1. SESSION (bir önceki değeri): ".$_SESSION['ad'].'
';
if ($_POST)
{
$_SESSION['ad']=$_POST['ad'];
echo "2. SESSION: ".$_SESSION['ad'].' olarak atandı.';
}

?>









echo "3. sessıon: ".@$_SESSION['ad'];
?>