Как правильно предотвратить повторную отправку формы?
Я бы не стал хранить массив сообщений в сессии, это вообще дурная практика что-либо складировать в неё, кроме пары-тройки идентификаторов.
Для гарантии от дублирования есть приём: 
- на сервере генерируется идентификатор нового сообщения
- сервер передает этот идентификатор клиенту
- клиент заполняет сообщение и отсылает его серверу с тем же самым идентификатором
- сервер при получении ставит в соответствие идентификатору сообщение (т.е. заполняет соответствующее поле в БД, если оно было пустым)
Рассмотрим теперь сценарии при попытке отправки с клиента сообщения:
- идентификатор сообщения задан:
-- на сервере уже есть сообщение с таким id => отказ
-- на сервере нет такого id => отказ (возможно попытка поиска уязвимости)
- идентификатор не задан => отказ
Весь текст вопроса не читал, лень :)
Вот так делаю я, после чтения и обработки полей (полученных данных)$_POST = NULL;
header("Location: " . Url::$url);
exit();
данные передаются POST-омUrl::$url - содержит ссылку на текущую страницу.