Before I go into what could be a problem, I'll just point out one way you could optimize this code.
If you examine what you are echo'ing, you should notice the only difference is the class you make the container div element. Thus, you shouldn't repeat yourself, and could optimize your code with a ternary operator like this.
echo "<div class=\"post".(($i % 2) ? '2' : '')."\">";
echo "<div class=\"date\"> <span class=\"month\">".$r[month]."</span><pan class=\"day\">".$r[day]."</span></div>";
echo "<p> <span class=\"title\">".$r[title]."</span>";
echo "<a href=\"?page=entries&id=".$id."\">View</a> :: Total Views - ".$r[views]." :: Author - $author :: Category - ".$r[cat]."</p>";
echo "</div>";
Just a little tip.
Now, as to your problem, I fear you might be subject to a very common problem most programmers un-knowingly run into when using loops: miscounting. Be careful when you are starting at 0 for use in arrays, and the using an ending number equal to how many items you are iterating. Your code does look correct, in that you are starting at index 0, then continuing while your $i variable is less than the total number of rows. Try debugging your $numofrows variable and make sure it is correct.
Also, I'm wondering if your method of iterating database results is correct... shouldn't each iteration of your main loop (while loop) be where you execute finding the results? In other words, it looks like you are going through each result, then doing a loop of that record several times. Your code should look like this.
while($r = mysql_fetch_array($result)){
$r = mysql_fetch_array($result);
$id = $r['id'];
echo '<div class="post"'.(($i % 2) ? '2' : '').'>';
echo '<div class="date"> <span class="month">'.$r['month'].'</span><span class="day">'.$r['day'].'</span></div>';
echo '<p><span class="title">'.$r['title'].'</span>';
echo '<a href="?page=entries&id='.$id.'">View</a> :: Total Views - '.$r['views'].' :: Author - '.$author.' :: Category - '.$r['cat'].'</p>';
echo '</div>';
}
The while loop will automatically exit when all results have been iterated, as mysql_fetch_array() will return a value that will make the while loop condition not true when it has passed the pointer in the fetched query.
Also be wary of your usage of quotes, use single quotes for array indexes and when you don't need to parse variables within quotes. Just good habit to get into for performance and readability reasons.