Submitted by gouki on 2008, July 2, 11:13 PM
自从有表单提交开始,这就是一直被人关注的话题。
搜索一下google,你可以搜到N条纪录,可是真正对你有用的有几条呢?
你搜索到的大多数都是讲的ASP网站下如何处理,少数讲了.net的,java的都放到框架里了,剩下的PHP的都是说用Session来解决。当然也有人回复直接加header标签,让他永远过期。就不会重复提交了。。
事实有用吗?我们一一看来,ASP的我们直接忽略,当然也可以参考他的一些方法而且PHP实现,但现在不看。一来,类似的方法PHP也有,二来,不喜欢ASP(这可以算个理由吧)
1、用session,表面上很不错,就和验证码似的,提交的时候判断是否与session的赋值相等,如果相等就提交,同时再注销这个session变量。不错,确实可行,但,如果表单的显示、提交、处理都在同一个页面里怎么办?根本无法处理,直接无视
2、JS控制,说是在没有提交的时候,var一个变量为false,onsubmit的时候,将它赋值为true,同时判断,如果是true就不让提交。听听是不错,可惜,实现起来并不是想象的这么容易。一旦提交后在跳转时按F5,这些就是白搭 。
3、disabled提交按钮。有用吗?效果同上
4、用COOKIE,有用吗???真的有用吗???或许吧,但是如果客户端关闭了cookie怎么办?那岂不是永远不会被提交了?
5、header过期。我开始也以为有用,并且在跳转函数前加上了这些。共四行代码哦。具体什么代码,我就不贴了,网上一搜一大堆。但实际中,如果问题和第一条相同,这点根本无法处理。
我现在怎么做?我现在是记录提交时间,刷新的时候用当前时间减去这个提交时间,如果在一定时间内就提示不能刷新。然后置时间为0,并强行跳转到列表页。
其实现在的很多框架都已经有处理。TP就是内置的。
很多论坛里面也有类似的处理,象discuz等等,可是,就象我说的,如果提交、显示都在同一个页面,那处理起来就复杂了。
虽然很多人说,这样并不建议,但已经这样了,我也总要找个解决方法的吧??对不?
Tags: 表单, 防刷新
PHP | 评论:0
| 阅读:1662
Submitted by gouki on 2008, May 21, 9:29 AM
代码深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对程序中的接口或抽象类应用有更深的理解.设计模式在大中型系统中应用十分广泛,遵循了一定的编程模式,可以使代码便于理解,易于交流,而Observer(观察者)模式则是比较常用的一个模式,它尤其在界面设计、LOG处理中应用广泛。
代码请看全文
» 阅读全文
Tags: 模式
PHP | 评论:7
| 阅读:2755
Submitted by gouki on 2008, May 21, 9:22 AM
Strategy策略模式是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类.
Stratrgy应用比较广泛,比如, 公司经营业务变化图, 可能有两种实现方式,一个是线条曲线,一个是框图(bar),这是两种算法,可以使用Strategy实现.
实际整个Strategy的核心部分就是抽象类的使用,使用Strategy模式可以在用户需要变化时,修改量很少,而且快速.
Strategy和Factory有一定的类似,Strategy相对简单容易理解,并且可以在运行时刻自由切换。Factory重点是用来创建对象。
Strategy适合下列场合:
1.以不同的格式保存文件;
2.以不同的算法压缩文件;
3.以不同的算法截获图象;
4.以不同的格式输出同样数据的图形,比如曲线 或框图bar等
代码请看详细内容......
» 阅读全文
Tags: 模式
PHP | 评论:0
| 阅读:1636
Submitted by gouki on 2008, May 19, 3:22 PM
PHP4现在咱就不提了,毕竟现在是5的时代。
个人而言,不用LINUX,不是说LINUX不好,而是我不太熟悉,如果需要远程的话,对我太痛苦。因此我选择了windows。
在windows下面配置apache和iis都是一样的方便。。。。
添加sqlite功能原来以为很简单,毕竟从PHP5开始,SQLITE就变成内置功能了,然而直接在php.ini里把extension=php_sqlite.dll前的分号去掉时,运行程序的时候提示我php_sqlite.dll没有被加载,确实让我很郁闷。
查阅一下google发现一个很无耻的事情,原来。。。如果直接要使用sqlite功能,必须先加载pdo.dll和pdo_sqlite.dll,只有先加载这两个DLL,才能使php_sqlite.dll被成功加载。
感谢:http://x.discuz.net/405175/viewspace-26726.html,让我找到了这个解决方案。开始我死活运行不了。。。看来我还是接触的少啊。
Tags: sqlite, 安装, 疑问
PHP | 评论:0
| 阅读:1530
Submitted by gouki on 2008, May 6, 5:06 PM
从PHP3开始。basename就存在于PHP之中,功能嘛。不用说了,就是用来取文件名。至于它不支持中文这点我也不谈了。问题是在PHP5.0.5这个环境里,居然有的时候会没有返回值。实在是太妖了。
由于在写的函数里,文件名是basename('/aaa/bbb/ccc')这样取出ccc后,再设定名称为:ccc.php,结果include的时候,偶尔会抛出异常:加载 .php无效 ,一直以为是代码写的有问题,没料到。。。竟然是basename偶尔不返回值?
到bugs.php.net看了一下,没有这个BUG,我也实在没有办法确认它到底是和服务器有关呢?还是纯粹就是这么一个BUG,现在我换成pathinfo来处理了,利用pathinfo来得到值,最后再组合成文件名称。
PHP | 评论:0
| 阅读:1580