其实还是要仔细分析一下你为啥对 SESSION 厌恶。我记得很早以前(大概 03 年)看过一本书,其中有一章专门讲述了用 mysql 重新实现一个 SESSION handler ,所以 SESSION 不过是一个 KV 的存储系统, K 来自于 cookie , V 来自服务器。和你在项目中使用了 mysql 没有啥本质的区别。
分析一下你的厌恶感来源,对症下药,不一定准确。
1. 如果你厌恶的是 SESSION 存储目录的那一大堆乱七八糟的文件,完全可以采用 memcached 或者 Redis 来做 session 存储。
2. 如果你厌恶 ci_session 这么招摇的名字,可以在 php.ini 里换个名字
3. 如果你本身也讨厌 cookie ,呃,当我没说。这个世界上基本上涉及到帐号的系统都会用到 cookie
4. 接上条,不存 cookie 也有一个办法,把 session id 放在 query string 里,比如
example.com/?ci_session=xxxxxxx说的有点长了。基于问题本身,楼上提到了很多,无外乎
1. ajax 请求,后台判断错误了不提交。
2.在错误页面直接 render 表单,换句话说在 save.php 里面实现和 submit.php 里完全相同的表单,这样出现错误以后,所有的数据都是在$_POST 里现成的,就不用存 SESSION 了。 codeigniter 的 Validator 实现的是类似的方案,表单和存储都在同一个表页完成,不使用 POST-Redirect 方案。
根因分析:
要实现数据不丢失,基本的一条是页面跳转以后把值传到其它页面;
解决方法 1 ,对应上面的 1 ,不跳转,这样就不需要传值;
解决方法 2 ,对应上面的 2 ,$_POST 传值跳转。
所以应该还有其它解决方案,包括但不限以下:
在 save.php 里面,用$_POST 再把数据提交到 submit.php
通过数据库把值从 save.php 传入到 submit.php