【问题标题】:Web programming principles网络编程原则
【发布时间】:2011-09-27 11:01:46
【问题描述】:

由于有一点传统(如果生疏)的编程背景,我正忙于掌握网站的“无状态”性质。这是一种思维方式的转变!

我为我工作的团队创建了一个小型网站,用于在内部跟踪我们日常工作的某些方面。该网站功能齐全,我为自己的成果感到非常自豪,bla bla bla。

但是,我在某处读到了一些内容,表明我可能做得不好。特别是,团队网站的中心页面完成了大部分工作。它检查您来自哪里,然后“切换”以执行一些工作(在数据库中进行一些更改),然后再次呈现页面。

在许多情况下,页面只是调用自身!我要做的是展示一张桌子。每行的最后一列是一组 html 表单。每个表单都有一个提交按钮,至少有一个隐藏字段。 “提交”按钮具有名称/值,例如“删除”“修改”“存档”等。

如果$_POST['submit'] == "delete" 则我在由隐藏字段标识的行上执行该功能。对“存档”的访问。对于修改,我打开一个新页面,显示一个带有默认值的表单,当用户提交表单时,再次调用主 PHP 页面在显示表格之前执行 SQL 更新。

所以基本上靠近主页开始处的大型(并且不断增长的)案例结构完成了大部分工作,甚至包括登录按钮!

这样看起来很整洁,有条理,但我有两个问题:

  1. 当用户按下返回时,有没有办法消除“重新发送表单数据”提示?大多数时候,后退按钮在这个网站上没有多大意义,但我们在这里与人打交道。我注意到其他人发布了关于注销按钮等类似问题,但到目前为止我找到的答案对我来说意义不大或毫无意义。

  2. 这是不好的编程习惯,尤其是整个 PHP-calls-itself-from-a-form-action 概念....?

感谢您的宝贵时间!

【问题讨论】:

    标签: php design-principles


    【解决方案1】:

    对于您的问题:

    1. 您正在寻找类似 Post-redirect-get 的东西,这意味着在提交后您使用您的数据“完成工作”并立即重定向您的用户,因此点击后退按钮不会重新提交!

    2. 一般来说,这就是它的工作原理……一开始就是这样。过了一会儿,您应该看看 OOP(面向对象编程),或者对于初学者来说,只需将每个操作分成函数,甚至可以将这些函数分成单独的文件。查看functions 的 PHP 手册,或者如果您真的很想了解更多信息,OOP 将是圣杯,但这有点复杂;)

    【讨论】:

    • 感谢您...每次发布后重新设计也是一个不错的功能,不是吗;)
    • 谢谢丹。我确实使用函数,并且有一个用于通用站点范围函数的包含文件。我仍然需要深入了解 OOP,这是我所知道的基本理论。我的意思是知道。这一切都会很快回到我身边。
    • P.S.我仍在努力决定重定向方法是否适合我的具体情况。不过,由于我理解所提供解决方案在通用案例中的优点,并且由于没有人能从我给出的简短描述中确切知道我的风格、偏好和要求是什么,因此我给予了这一点。
    • 猜克里斯在这里有最好的主意,它涉及另一种语言,并且是客户端,需要用户打开 javascript - 但是(取决于您的听众)可能每个人都这样做。 OOP 本身就是一个完整的世界,但它真的很值得——从开发人员的角度来看,您必须为自己的代码而奋斗。就像一个通用示例一样,您可以编写一个单独的类来动态创建表单...
    【解决方案2】:

    Post-redirect-get 是一个非常干净地解决这个问题的模式。

    【讨论】:

    • 同上我的 P.S.对 Dan 发表评论 - 感谢您提供的解决方案。我相信它会解决问题,我将来可能会多次使用这种方法。与此同时,我仍在尝试确定在此实例中这是否是我的最佳解决方案。
    【解决方案3】:

    您开发的不是一个网站,而是一个 Web 应用程序。为了消除“后退按钮问题”,您应该考虑使用一些 JavaScript 魔法(例如 Ajax 可以帮助您消除打开另一个页面或提交到同一页面的需要,jQuery 可以帮助显示和隐藏部分页面哦基于用户交互)。

    对于第二个问题:将所有逻辑放在一个 php 文件中并没有错。当然,如果你有数以亿计的代码行,但对于一个小型应用程序,这可能会造成伤害......为什么不呢?!

    一般来说建议将逻辑和GUI分开。你可以阅读它here

    【讨论】:

    • 我必须感谢您对我的问题描述的深入了解!感谢您的建议和cmets!
    【解决方案4】:

    在处理完表单数据后,redirect 页面总是一个明智的想法。它避免了在页面刷新或返回按钮上重新发送表单。

    为了在 php 中重定向,你可以使用:

    header("Location: {url here without brackers}");
    

    【讨论】:

    • 谢谢。另请参阅我对其他 cmets 的其他回复!
    猜你喜欢
    • 2015-10-22
    • 2011-04-17
    • 2011-08-12
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多