Вы получаете ошибку, потому что у вас есть :products.catid
Измените это на products.catid
Также, если вы хотите удалить записи из обеих таблиц, вы должны использовать псевдонимы.
DELETE c,p FROM categories c
INNER JOIN products p ON c.cat_id = p.catid
WHERE cat_id = :cat_id
Также необходимо изменить
$delete = $stmt->execute(array('cat_id' =>$catid));
на
$delete = $stmt->execute(array(':cat_id' =>$catid));
Приведенный выше пример не работает, если вы используете SQL Server.В этом случае вы должны использовать 2 отдельных запроса на удаление.
Также, когда вы связываете параметры в функции execute как массив, который связывается как строки.Это также может вызвать некоторые проблемы в зависимости от структуры вашей базы данных.Использование $stmt->bindParam()
обычно является лучшим вариантом.