Если внимательно посмотреть на то что действительно написано, то это будет
$products_data = [];
if ($query) {
$sql = "SELECT * FROM `products`";
$products_data = $db->query($sql)->fetchAll(\PDO::FETCH_ASSOC);
}
Но, к счастью, вы вместо логичного поведения кода, соответствующего тому что действительно написано в исходнике, получаете ошибку от pdo, который не может понять, почему вы передали параметры в запрос, в котором не было мест для параметров.
Потому что where строковой_литерал это или заведомо невыполнимый запрос, 0 строк (если строковой литерал пустая строка) или истина для всех строк таблицы. Почему это строковой литерал? Ну, потому что таков синтаксис SQL, строка в одинарных кавычках - литерал.
А вот что вы подразумевали дальше, мне догадаться сложнее. Если в $query записано то что в вопросе, то что тогда такое должно быть :product_Id1?