A lot of the problem with frames is synchronisation: the client requests the frameset document, and then requests the individual frames; those frames are (typically) requested concurrently, could be requested in any order, the requests received in any order, and processed in any order. Whichever order they get processed in, they won't see the same session state.
On top of that is the hassle of keeping both frames synchronised on the client.
What you're doing with your framesets is effectively a client-side templating system. Perhaps you could consider doing it on the server instead? The shortest-distance modification from your current setup would be that, instead of having the main document be a frameset, it outputs an ordinary HTML page, and instead of containing <frame> elements, it uses <?php include ?> to fetch the appropriate "frame" content (which instead of being an entire page, would just be a <div>).
You'd still be using the session to persist data between requests, of course, but you won't need to try and use it for cross-frame communication as well.
Not to mention, modern CSS layout is far more flexible than framesets or tables!😃
You could get fancier, using JavaScript to request and update pages in situ, but that (a) assumes the use of JavaScript (thus locking out search engines), and (b) breaks the page URL in the same way that framesets do. It's better to avoid JavaScript if neither of those issues matter, and if JavaScript is necessary for the page's purpose anyway.