PHP 怎么优雅的在表单发生错误时重定向到原来页面并保留原表单的数据?

2015-11-09 09:34:46 +08:00
 cevincheung

能不能不用 session ,能不能不用 js

4927 次点击
所在节点    PHP
35 条回复
Wangxf
2015-11-09 10:08:51 +08:00
提交的时候把东西写进 localstorage (逃)
GGGG430
2015-11-09 10:16:17 +08:00
可以将当前页面的地址一起 post 过去
hisway
2015-11-09 10:17:24 +08:00
为什么不用 ajax 异步提交,不跳转页面数据都还在~
realpg
2015-11-09 10:22:39 +08:00
1. 一般框架都有自动填充数据的办法 就是有辅助的重新渲染一次模板
2. ajax 包治百病
3. history.back 可保留除了 input type=password 所有表单数据
zhs227
2015-11-09 10:23:47 +08:00
其实还是要仔细分析一下你为啥对 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
Chrics
2015-11-09 10:37:53 +08:00
session flash data.
yeyeye
2015-11-09 11:38:18 +08:00
js ajax 是最优雅的
js 返回上一页是最简单的

只用纯 php 不用 session 和 js 是可以实现的,只要你不嫌麻烦
简单说就是判断有错误后输入原先的表单页面,同时把 POST 来的数据一个个放入表单,这是 3 个方式里最复杂的。跟优雅一点关系都没有。除非是为了兼容客户端不支持 /不开启 JS ,否则……或许只有它适合你了
jaguar
2015-11-09 12:15:50 +08:00
大哥,你用 ajax 要屎啊?
dwhdrbdhs
2015-11-09 14:39:49 +08:00
如果不用 ajax 的话有个方法 lz 可以试一下
可以提交到本页里的一个隐藏的 iframe 去
<form action="toSubmit.php" target="hiddenIframe">
iframe :
<iframe id="hiddenIframe" name="hiddenIframe" width="0" height="0" frameborder="0" style="display:none"></iframe>

这样本页的表单数据都会保留了就
需要注意的是如果结果要返回字符串的 js 交互的话 控制原先表单页面需要加 parent
msxcms
2015-11-09 14:44:40 +08:00
前端体验的问题,就应该用 js 来实现
cst4you
2015-11-09 19:45:43 +08:00
@dwhdrbdhs 这是几年前经常在韩国网站见到的"无刷新提交"方式.
jugelizi
2015-11-09 21:31:48 +08:00
你都写 php ; 还在乎优雅
Light3
2015-11-09 21:56:06 +08:00
我以前觉得我想做个优雅的人 来到我现在的公司就是我才不管那 我没想这 get 提交就不错了(小公司的痛)
cxbig
2015-11-10 04:14:14 +08:00
用类处理,每个表单对应一个类,提交的数据自动储存到类,表单验证也由类处理,失败直接踢回给 edit 页面,你提交的数据都在里面了。
lansexinyu
2015-11-10 09:49:43 +08:00
那就把之前填写的信息继续输出到对应表单,找个地方显示提示信息!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/234690

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX