保留用户输入的错误数据

最近公司项目比较闲, 所以很多时间都在整理代码, 这几天就又有了一个这样的需求, 当用户提交了错误的信息, 提示错误并保留用户输入的数据。

起初第一个想法就是使用COOKIE, 后来又考虑使用$_SESSION, 其实两者无明显区别,大概流程是这样的, 每个请求的前面都加入下面的逻辑:

1
2
3
4
5
6
7
8
9
10
if(有保存的数据){
if(数据是不是本动作产生的){
如果是则取得数据
}
清空保存的数据
}

if(是一个POST请求){
保存用户的请求数据
}

这样处理的话消息处理需要中间页跳转,就是说错误提示是一个单独的页面,这样基本可以做到将数据保存到下一个请求。这个方法后来在显示上比较麻烦,就是需要判断有没有取得的数据,有的话输出没有的话不输出, 如果使用模板引擎的话处理起来更加复杂, 于是又提出了另一种解决方案。

将表单和处理程序放在一起(可能是一个function , MVC中应该是一个action中),这样的话需要显示表单或者处理数据要准备一套结构相同的数据传给页面,然后由本页显示错误消息, 不需要使用COOKIE.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function actionCreate(){
if(是POST请求){
过滤数据
验证数据并生成错误
if(没有错误){
向数据库插入数据
}else{
将错误数据提交给显示层
}
}else if(是GET请求并且必要参数正确){
从数据库取得显示数据提交给显示层
}else{
返回一个参数错误
}
$this->display('create.html');
}

可以说这个方法是比较完美的, 目前来说没有什么不足之处, 但是有很多细节是需要注意的, 比如form的action要提交给自身并且携带参数, 虽然参数无作用, 但可以用来刷新页面(window.location.href=window.location.href), 显示层刷新页面的功能是必须的, 因为如果是修改操作那么输入错误之后将会保留错误的信息。

接下来还可以通过控制错误消息的结构识别错误是由哪一个表单项产生的, 如果需要还可以对错误进行自动修改等等。