А кодировки везде правильные? Если при подключении клиент сообщает, что у него одна кодировка, а по факту данные передаёт при этом в другой, то подобная путаница тоже может происходить.
green300, если поле id там целочисленное и автоинкрементное (счётчик или что-то подобное) - то можно перед запихиванием в параметр запроса его обработать, например, привести к (int), тогда даже если что-то не то пользователь скормит, приведётся к нулю. В случае нуля и отрицательных чисел можно тогда и не дёргать базу вообще, т.к. таких id гарантированно не будет.
Правильное условие в WHERE указать? По вашему описанию задачи, как-то так:
$stmt = $pdo->prepare("SELECT * FROM category WHERE `id`=:id");
$stmt->execute(['id'=>$_GET['cat_id']]); // перед этим где-то выше проверить $_GET['cat_id'] на isset, чтоб базу не дёргать, если юзер не передаст в GET-запросе
Как полагаю, текст выводится в браузер? Если так, то нужно указать кодировку через HTTP-заголовок Content-Type, а не надеяться на автодетект со стороны браузера.
В данной ситуации - стечение обстоятельств. Плагины выполняются под теми правами, под которыми на данном сайте работает PHP, если злоумышленник получил к нему доступ и сумел перезаписать .htaccess - точно также он может переписать и любой другой файл, доступный этому пользователю.
Тем не менее, против ботов, которые нацелены на перезапись .htaccess, переход на nginx спасёт, но против живого взломщика или более продвинутых ботов не поможет.