Попробуйте это ...
Я думаю, что он, возможно, падает, потому что после того, как вы проанализировали набор результатов по категориям, для первого сайта ничего не получится при следующем вызове mysql_fetch_array. Таким образом, сделав это заранее и поместив результаты в переменную, исправим это.
Я добавил "\ t" и "\ n" в строки, чтобы сделать формат html красиво в исходном представлении.
$result = mysql_query("select * from tmp_sites");
$categories = mysql_query("select * from tmp_cats");
$select_options = "";
while ($roar = mysql_fetch_array($categories, MYSQL_ASSOC)):
$select_options .= "\t\t<option value=\"". $roar["category"] ."\">". $roar["category"] ."</option>\n";
endwhile;
echo "<table>";
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)):
echo "\t<tr>\n";
echo "\t\t<td>". $row["site_description"] ."</td>\n";
echo "\t\t<td>". $row["url"] ."</td>\n";
echo "\t\t<td><select>\n";
echo $select_options;
echo "\t\t</select></td>\n";
echo "\t</tr>\n";
endwhile;
echo "</table>"