V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cevincheung
V2EX  ›  PHP

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

  •  1
     
  •   cevincheung · 2015-11-09 09:34:46 +08:00 · 5107 次点击
    这是一个创建于 3304 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    35 条回复    2015-11-10 09:49:43 +08:00
    66beta
        1
    66beta  
       2015-11-09 09:36:11 +08:00
    可以啊,提交过来的数据,填到页面里去
    cevincheung
        2
    cevincheung  
    OP
       2015-11-09 09:37:14 +08:00
    @66beta
    提交页面: submit.php
    处理页面: save.php

    save 验证表单发生了错误,怎么再回去并保留数据
    odirus
        3
    odirus  
       2015-11-09 09:39:39 +08:00   ❤️ 1
    最好还是用 session 吧,很多框架都提供了 flash data 功能。
    frjalex
        4
    frjalex  
       2015-11-09 09:40:12 +08:00
    @cevincheung Ajax json POST
    cevincheung
        5
    cevincheung  
    OP
       2015-11-09 09:40:41 +08:00
    @odirus 那是怎么 flash 呢?
    doushiyinweini
        6
    doushiyinweini  
       2015-11-09 09:40:52 +08:00   ❤️ 2
    header('Cache-control: private, must-revalidate');
    tibbers
        7
    tibbers  
       2015-11-09 09:41:03 +08:00
    如果只是单纯的页面跳转, js 的 history.go(-1),就行了,其实就是返回上一页面,数据不会丢
    TangMonk
        8
    TangMonk  
       2015-11-09 09:41:07 +08:00
    何必重定向,直接重新 render 。

    if valid
    redirect
    esle
    render "edit"
    oott123
        9
    oott123  
       2015-11-09 09:42:23 +08:00 via Android
    <form method=post>
    <input name=a value="<?=$_POST['a']?:'';>">
    shuax
        10
    shuax  
       2015-11-09 09:42:36 +08:00
    提交数据不要刷新页面不就行了
    cevincheung
        11
    cevincheung  
    OP
       2015-11-09 09:43:15 +08:00
    @doushiyinweini
    然后 location 回到之前的页面数据还在么?
    phpcxy
        12
    phpcxy  
       2015-11-09 09:43:30 +08:00   ❤️ 1
    像 laravel 的 falsh data 使用 session ,他的 session 可以用 Redis 驱动,不知楼主觉得这样算不用 session 吗
    linauror
        13
    linauror  
       2015-11-09 09:46:29 +08:00   ❤️ 1
    异步提交
    cevincheung
        14
    cevincheung  
    OP
       2015-11-09 09:47:19 +08:00
    @phpcxy 其实个人对 session 有点厌恶。一般用户登录什么的都是存加密的 cookie 。最近又开始纠结到底用不用 session 了……- -#
    adexbn
        15
    adexbn  
       2015-11-09 09:47:51 +08:00
    基本不用 Form ,都是手动 js 异步提交的
    odirus
        16
    odirus  
       2015-11-09 09:50:24 +08:00
    @cevincheung 其实就是在你进行提交的时候, session 中可以保存一些数据,这些数据只会被取出一次,之后就会被删除。你看一下这个,应该对你有帮助, http://laravel-china.org/docs/5.0/session
    cevincheung
        17
    cevincheung  
    OP
       2015-11-09 09:57:21 +08:00
    @odirus 所以还是存到 session 中。每次请求都判断如果有就取出并删除如果没有就不做操作。就像 ci 的 userdata
    cevincheung
        18
    cevincheung  
    OP
       2015-11-09 09:57:43 +08:00
    @odirus

    然后如果有需要就自动填充到表单里。
    Lucups
        19
    Lucups  
       2015-11-09 10:00:03 +08:00
    wizardforcel
        20
    wizardforcel  
       2015-11-09 10:03:02 +08:00 via Android
    渲染表单所在的模板 把传进来的参数再填回去就行了

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

    只用纯 php 不用 session 和 js 是可以实现的,只要你不嫌麻烦
    简单说就是判断有错误后输入原先的表单页面,同时把 POST 来的数据一个个放入表单,这是 3 个方式里最复杂的。跟优雅一点关系都没有。除非是为了兼容客户端不支持 /不开启 JS ,否则……或许只有它适合你了
    jaguar
        28
    jaguar  
       2015-11-09 12:15:50 +08:00 via Android
    大哥,你用 ajax 要屎啊?
    dwhdrbdhs
        29
    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
        30
    msxcms  
       2015-11-09 14:44:40 +08:00
    前端体验的问题,就应该用 js 来实现
    cst4you
        31
    cst4you  
       2015-11-09 19:45:43 +08:00
    @dwhdrbdhs 这是几年前经常在韩国网站见到的"无刷新提交"方式.
    jugelizi
        32
    jugelizi  
       2015-11-09 21:31:48 +08:00
    你都写 php ; 还在乎优雅
    Light3
        33
    Light3  
       2015-11-09 21:56:06 +08:00
    我以前觉得我想做个优雅的人 来到我现在的公司就是我才不管那 我没想这 get 提交就不错了(小公司的痛)
    cxbig
        34
    cxbig  
       2015-11-10 04:14:14 +08:00   ❤️ 1
    用类处理,每个表单对应一个类,提交的数据自动储存到类,表单验证也由类处理,失败直接踢回给 edit 页面,你提交的数据都在里面了。
    lansexinyu
        35
    lansexinyu  
       2015-11-10 09:49:43 +08:00
    那就把之前填写的信息继续输出到对应表单,找个地方显示提示信息!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3340 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:30 · PVG 20:30 · LAX 04:30 · JFK 07:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.