Потому что вероятно файл подключения к бд не подключен или подключен ниже этого вызова.
Ну я просто хз, зачем нужно писать запросы через prepare, если туда потом ничего не подставляется. Просто эти запросы можно переписать на query()
По типу такого:
Тут не нужен prepare, во всяком случае в первом запросе, и втором
<?php
$count_cat = $db-> query("SELECT id FROM category"->rowCount(); //или через COUNT(*) -> fetch
if($count_cat !== '0') {
$cat = $db->query("SELECT * FROM category ORDER BY name"
?>
Добавлено 06.12.16 в 22:44:35:
Короче, я бы переписал такие запросы, и посмотрел, работает ли оно.
Если не работает, то только над одним запросом придется подумать, и решить проблему.