О, я воздержусь от примеров кода, чтобы у вас не было соблазна их использовать.
Вам нужно разделить код получения данных из БД и код вывода HTML в браузер.
Дальше можете действовать по алгоритму:
1) Сделать запрос "SELECT max(id), count(*) FROM `products`".
Количество нужно для определения числа страниц.
А max(id) может быть и не понадобится. Так как вывод отсортирован по убыванию (от новых к старым), а новые изображения могут добавляться в галерею, можно запоминать id первого изображения на первой странице.
2) Получить из $_GET номер нужной страницы (используйте функцию filter_input()).
3) Получить количество изображений на странице из конфига или тоже из $_GET, если вы хотите, чтобы пользователь мог управлять этим параметром.
4) Сделать запрос с БД 'SELECT id, name, description, price, image FROM products WHERE id <= $max_id ORDER BY id DESC LIMIT $limit OFFSET $offset';
где, $max_id это id самой новой записи в текущей сессии, $limit - количество картинок на странице, $offset = $limit * ($p-1), где $p - номер страницы (нумерация страниц с 1).
Используйте подготовленные запросы, как у вас в примере.
$stmt = $DB_con->prepare('SELECT id, name, description, price, image FROM products WHERE id <= ?
ORDER BY id DESC LIMIT ? OFFSET ?');
$stmt->execute(array($max_id, $limit, $offset));
5) Выбрать из БД нужные данные и передать в код отвечающий за представление.
В представлении (коде, генерирующем HTML) нужно не только вывести картинки текущей страницы, но и сформировать ссылки на другие страницы.
Количество страниц = количество записей в БД / $limit.
Сложность возникнет лишь, если у вас количество страниц так велико, что ссылки на них не помещаются на экран по ширине. Тогда нужно будет придумать алгоритм, по которому какие-то ссылки показывать, а какие-то нет.