Общая логика (если Вы профиль храните в сессионной переменной): Вижу, что Вы используете USER_ID, отсюда предполагаем, что пользователь у Вас логинится, так Вот в момент успешного залогинивания, Вы из БД заполняете сессионную переменную, в том числе и городом.
Ну и в момент изменения(записи) города, обновляете в 2х местах сразу и в сессионной переменной и в БД.
Плюс очень странная конструкция if(empty($_POST['city']))
и запись в БД, пустого значения ?
Полагаю, что структура сессионной переменной по факту отличается от того, что Вы в ней ожидаете, попробуйте var_dump($_SESSION);
Как раз и Выясните что происходит
P.S. еще момент: $_SESSION['user']['city'] т.к в разрезе сессии ['user'] излишен