проверка на mysql_num_rows не имеет смысла.
Как бы делал я. 
	
	
	
		PHP:
	
	
		<?
include 'bootstrap.php';
$pagetitle = "Инвайты";
$DATA = dbget(3,"SELECT * FROM num WHERE category=%s",$_GET['category']);
$tpl = "tpl_links.php";
include "tpl_main.php";
	 
 Вот весь код. 
Как можно заметить, практически весь он здесь значимый, имеющий смысл только в контексте данной страницы. Никаких повторяющихся из кода в код, не несущих никакой полезной нагрузки функций типа prepare или fetch_array.
Весь вывод делается в tpl_links.php:
	
	
	
		PHP:
	
	
		<h2><?=$pagetitle?></h2>
<? if ($DATA): ?>
<ul>
<? foreach($DATA as $row): ?>
  <li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li>
<? endforeach ?>
<ul>
<? elseif: ?>
Пока ничего нет
<? endif ?>
	 
 В файле bootstrap.php подключаются настройки, часто используемые функции, происходит коннект к БД.
В частности, функция dbget, которая, хоть и неказиста с виду, но даст сто очков вперёд голой PDO.
	
	
	
		PHP:
	
	
		function dbget() {
  /*
  usage: dbget($mode, $query, $param1, $param2,...);
  $mode - "dimension" of result:
  0 - resource
  1 - scalar
  2 - row
  3 - array of rows
  */
  $args = func_get_args();
  if (count($args) < 2) {
    trigger_error("dbget: too few arguments");
    return false;
  }
  $mode  = array_shift($args);
  $query = array_shift($args);
  $query = str_replace("%s","'%s'",$query); 
  foreach ($args as $key => $val) {
    $args[$key] = mysql_real_escape_string($val);
  }
  $query = vsprintf($query, $args);
  if (!$query) return false;
  $res = mysql_query($query);
  if (!$res) {
    trigger_error("dbget: ".mysql_error()." in ".$query);
    return false;
  }
  if ($mode === 0) return $res;
  if ($mode === 1) {
    if ($row = mysql_fetch_row($res)) return $row[0];
    else return NULL;
  }
  $a = array();
  if ($mode === 2) {
    if ($row = mysql_fetch_assoc($res)) return $row;
  }
  if ($mode === 3) {
    while($row = mysql_fetch_assoc($res)) $a[]=$row;
  }
  return $a;
	 
 При этом если делать её классом, то получится в сто раз удобнее и мощнее. 
К вопросу о том, зачем писать "классами".
Как можно увидеть, весь код очень простой, никаких супер-наворотов. Всё довольно логично и привычно.
Но при этом соблюдаются все базовые принципы постройки приложения. 
Это, в принципе, конечно тоже ужас, но хотя бы осмыленный. Такой "идеальный говнокод".