Так у тебя не аякс ругается, а видимо сама страница когда ты её без аякса запрашиваешь, потому что туда ничего не передали.
Проблема комплексная.
Не выводи в ответ ничего кроме редиректа, когда данные отправляются постом. Нефиг. Есть Гет для этого. Нет, это не значит что данные нужно отправлять гетом. Это значит что когда ГЕТ - отдавай верстку. А когда пост - сохраняй данные. Если нужно с Гета на Пост перейти и не потерять - есть сессия (привязана к тому кто запрашивал) или база (для всех, придется ввести признак, как ты поймешь что это его). Этот совет актуален когда ты запрашиваешь страничку через браузер.
В случае с Аяксом (параллельной отправкой) действуют правила API - компьютеры общаются между собой, им плевать что ты хотел нарисовать, они понимают только текст. Причем не понимают - они его передают и обрабатывают. А если еще точнее то они передают пакеты и им даже на текст плевать, но с текстом тебе привычнее работать. То есть в ответ на Пост пусть вылетает JSON с массивом а не верстка. Верстку строим потом на клиенте.
В третьих можно писать так $id = $_POST['id'] ?? null; если пыха (не бэха) семерка. На крайняк
$id = (! empty($POST['id']) ? $_POST['id'] : null;