Я бы включл лог медленных запросов, и посмотрел фактические запросы которые приходят в Mysql. У вас есть уверенность, сто внутри ничего не модифицирует этот запрос?
Потому что выражение html_entity_decode($product_info['equipment'], ENT_QUOTES, 'UTF-8'); возвращает значение NULL. Почему? Это вопрос уже другой темы.
По поводу input - post все ок, я не досмотрел. 4. Создаешь 2 отдельных шаблона header и footer. Затем в любом создаваемое шаблоне делаешь include header и include footer. И между ними твой шаблон. 5. Выносить нужно блоки, которые напрямую относятся к 1 функциональности. Сделать так, чтобы эту функциональность можно было бы использовать и в другом проекте или контроллере. Так будет легче сопровождать проект, и переиспользовать написанный код. Возможно сразу это не понятно, но нужно стремится к тому, чтобы твой код читался как книга: while (alive()){doJob();}
Mitrandil: $option_data[] = array( ..... стоит внутри цикла foreach. Этот цикл проходит по массиву $product['option'] . Этот массив пустой? Если да - то тогда нужно смотреть модель, которая вытаскивает все продукты в контроллере, обычно это метод getProducts().
Смотреть выше по коду контроллера. Когда вытягиваламь информация о товаре - опции есть? Если их нет - то смотреть метод модели. Если они есть - то где-то ниже не вставили их в продукт.