Не знаю конкретной проблемы, потому что сессия должна быть действительной, если вы случайно не где-то вызываете session_destroy (). Несколько советов по отладке - убедитесь, что session_id () соответствует страницам; если нет, то происходит что-то смешное. Можно попробовать явно вызвать session_write_close (). Кроме того, установите значение в $ _SESSION для случая ошибки (когда пользователь не существует), чтобы убедиться, что это не простая логическая ошибка. Кроме того, не используйте md5, пожалуйста. Используйте какой-нибудь вариант ша и посолите.
Редактировать: вы упоминаете session_name ()
Этот вызов фиксирует имя сеанса, чтобы вы могли обращаться к нему на других страницах. Если вы выполняете session_start () на другой странице, не называя сеанс одинаковым образом, он порождает новый сеанс с новым идентификатором.
Примечание из документации php: имя сеанса сбрасывается до значения по умолчанию, которое хранится в файле session.name во время запуска запроса. Таким образом, вам нужно вызывать session_name () для каждого запроса (и перед вызовом session_start () или session_register ()).