$source is not defined in this extract. Do you mean $row['checked']?
Perhaps it would help to check that the values returned by the query are in fact the values that you expect to see. If you use the following lines, it will temporarily break your layout, but it will help you confirm that your query is functioning as expected.
while ($row=mysql_fetch_array($query)) {
echo '<input type="radio" name="source" value="'.$row['s_id'].'">'.$row['s_desc'];
echo '<br />checked: '.$row['checked'];
echo '<br />e_id: '.$row['e_id'];
echo '<br />e_desc: '.$row['e_desc'];
}
Where are you "checking" the state of rb1? My current guess is that the end user will be checking a radio button in an HTML page served by your PHP script... but you are looking in a database on the server for information on the locally checked state of the button. If my guess is right, you don't want to serve the page again after each click. Instead you can serve the page with all the possible buttons, and use CSS to hide the rb2 buttons whose rb1 button is not selected.
CAUTION: UNTESTED PHP
while ($row=mysql_fetch_array($query)) {
echo '<input type="radio" name="source" value="'.$row['s_id'].'"';
echo 'onclick=yourJavaScriptFunctionToDisplayTheRB2Button()';
echo '>'.$row['s_desc'];
echo '<input type="radio" name="exam" value="'.$row['e_id'].'"';
if (!$row['checked']) {
echo ' style="visibility=hidden"';
}
echo '>'.$row['e_desc'];
}
For yourJavaScriptFunctionToDisplayTheRB2Button(), see the jsFiddle example here.