保留用户输入的错误数据

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

起初第一个想法就是使用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), 显示层刷新页面的功能是必须的, 因为如果是修改操作那么输入错误之后将会保留错误的信息。

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

工作不是生活的全部

昨天看褪墨的一篇文章, 里面有这么一个章节,看过之后很有感触.

工作不是生活的全部

你是不是经常在晚上和周末加班?如果你花费所有的时间在工作上,那你用什么时间去消费你赚的钱呢?不要因为放下手边额外的工作而有罪恶感,休闲时间和工作时间同等重要。从工作中得到满足感的确是令人高兴的事情,但是我们只是埋头工作的话,我们的生活会失去应有的平衡。

这说的的确很有道理, 有时候觉得每天的生活就是在工作, 特别是毕业之后, 学习的机会更少了. 我经常和朋友抱怨工作这样那样的不顺利, 这样那样的辛苦, 但后来才发现原来根本不用这样, 工作只是一种赚钱的手段而已.

对我来说, 工作只能让我有东西吃, 有衣服穿, 有地方住, 除了学习之外工作只是为了赚钱, 再抽象一点说就是在用痛苦交换幸福.

我想工作可能不能帮助任何人实现他们的梦想, 除非他们的梦想是给别人打工然后回家养活老婆孩子, 工作也不可能代替任何人的生活, 家庭, 感情, 梦想, 这些东西工作永远都不可能替代, 工作只是多数人在为少数人的生活, 家庭和梦想在努力而已.

昨天用Open Office做了这样一个表格, 然后恍然大悟, 工作之外, 做回我自己, 梦想就在眼前.

Ext学习笔记(1

昨天用了一下午学习Ext, 搞了一下午最后连个表格都没搞出来, 今天继续, 顺便记录一下.

中文在线手册 http://www.ajaxjs.com/docs/

这里请大家注意一下, 看手册一定要看源码包里的那个docs目录里的, Ext手册版本差异很大, 不一定最新的就一定适用。

使用Ext之前需要加载Ext库, 昨天直接加载核心, 竟然不好用, 最后看例子里面是加载了两个文件, 原因还没搞清楚, 但先记下来.

<script type=”text/javascript” src=”../ext-2.2/adapter/ext/ext-base.js”></script>
<script type=”text/javascript” src=”../ext-2.2/ext-all.js”></script>

最基础的

1
Ext.onReady(fn);

这个和Jquery的$(fn)是一样的, 就是页面加载完毕执行fn

1
Ext.get('idName');

这个就是Jquery中的$(‘#idName’), 返回一个Ext的Element对象.

Element.dom是该对象的DOM节点, 其他内容看手册里的Element部分

1
Ext.select('p')

这个类似Jquery中的$(‘p’), 但是Ext中没有each, Ext.select(‘p’).methodName()直接就作用在全部对象上.

事件绑定

1
Element.on('click', fn);

获得事件句柄

1
2
3
4
5
clicked = function(e){
Ext.get(e.target).highlight();//e.target为触发该事件的对象id, highlight是高亮闪烁
}

Ext.select('p').on('click',clicked);

消息框
Ext.MessageBox为Ext的消息对象.

Ajax
ajax部分和Jquery非常相像了

1
2
3
4
5
Ext.get('msg').load({
url: 'http://test/ext/data.php',
params: 'name=1',
text: 'Updating...'
});

长城在哪里?

刚刚在玩Google Earth, 在美国逛了一大圈之后又在国内逛, 逛到北京就想起来看看长城什么样子, 从小到大, 我都没出过吉林省. 在北京附近找了好一阵子, 大概20分钟, 才差不多确定长城的位置. 但基本上什么也看不到, 我一直对在太空能看到长城的说法深信不疑, 没想到, 放到最大都看不到.

where is the great wall

谁在上面这个图上看到长城了记得告诉我.

像我这样的好孩子在小的时候就听老师讲在太空能看见的唯一建筑就是长城, 而且不只是老师讲, 教科书上也是这么说的, 真太失望了. 只有google一下, 发现原来这个问题在几年前引发过大规模的讨论.

曾在太空站工作的宇航员威廉·博格在1991年出版的《在太空中如何盥洗》一书中说,在那样的高度上已无法用肉眼看到长城,而需要用望远镜才能看到。

2000年凤凰卫视曾采访第一批登上月球的宇航员之一奥尔德林。他说,在月球上是看不到万里长城的,长城是狭窄而不规则的,在轨道上,很难看到不规则的事物。

2000年5月4日,首位太空游客蒂托在接受记者采访时也说,我从中国上空飞过时看到了中国的河流和山脉,但没有看到中国的长城

2003年10月中国首位宇航员杨利伟返回地球后表示:“看到地球景色非常美丽,但我没有看到我们的长城。”

2004年年初,全国政协委员王翔在政协会议上的提案要求有关部门尽快纠正小学语文课本第七册课文《长城砖》中有关宇航员肉眼能看到长城的错误,教育部对此公开答复表示纠错工作正在进行。

美国宇航员尤金·塞尔南2004年2月访问新加坡时表示,“在高度为160-320公里的地球轨道上,中国的长城的确可以用肉眼看到”。国际空间站远征七队的科学官埃德·刘也赞同他的观点。

2004年5月11日欧洲空间局网站首页以“从太空看中国长城”为题,发布了一张“普罗巴”卫星3月25日过境时获取的高分辨率卫星图像,文字说明指出,该图右上方一条蜿蜒曲折的细线条是延伸7240公里的长城。该公告还认为,如果天气、光照等条件适合,宇航员可以用肉眼看到长城。

公告刊出仅一天后,美国宇航局网站转发了这条信息和图像。两家国际公认的空间科技权威机构发布的信息立刻引起广泛关注,类似“从太空看到长城并非神话”的报道出现于内地多家媒体,还有文章“叫停”政协委员建议小学语文课本应纠错的提案。

与此同时,质疑和否定的意见也纷纷见诸报端和网站。复旦大学和美国加州大学的学者首先提出不可能是长城,根据立体效应和翻转180度看,图像很明显是一条汇聚水流的山沟。

2004年5月19日欧空局发布纠错公告,承认此前公布的图像发生解释错误,把一条注入密云水库的河流误判为长城,至于那条被判为运河的影像是否有错和宇航员能否看到长城等问题则未提及。

2004年5月27日,北京市测绘设计研究院的科技人员用航片、1:1万地形图与欧空局的图像进行叠加分析后提出新的看法,长城、河流之说都不正确,是条山间公路。

真TMD的郁闷被这个谎言忽悠了十几年, 而且深信不疑, 现在这年头, 媒体不可信, 书籍也不可信, 连小学教材都不可信, Chnee 的教育真TMD….. 幸好我学习不太好, 要么现在肯定成白痴了.

面向对象的访问控制

这两天有在看php5的面向对象的一些教程, 因为php4用的比较多,所以对面向对象这个概念并不是很熟悉.

这里只是简单记录一下关于public, private和protected.

public(公共的)应该比较容易理解, 完全公开, 任何地方都可以访问, 包括该类内部, 外部, 子类等等.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
class a{
public $a;

function __construct(){
$this->a = "1";
}

function test(){
echo $this->a;
}
}

class b extends a{
function test2(){
echo $this->a;
}
}

$a = new a;
$a->test();
// 这里说明public属性对象内部可访问, 而该语句没报错是
// 因为test方法也可以访问, 说明方法默认为public

echo $a->a; // 这里说明public属性外部也可以访问
$b = new b;
$b->test2(); // 这里说明public属性在子类中可以访问
echo $b->a; // 这里说明public属性在子类外部也可以访问

private(私有的)可以理解为只有对象的内部可以访问, 但是其中有可比较难理解的概念, 就是继承来的public方法可以访问到父类的private方法和属性, 而且实际上private属性和方法在技术上是无法被覆写的, 这个我目前还没有研究太透彻.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
class c{
private $a;

function __construct(){
$this->a = "2";
}

function test(){
echo $this->a;
}
}

class d extends c{
function test2(){
echo $this->a;
}
}

class e extends c{
private $a="3";
function test2(){
echo $this->a;
}
}

$c = new c;
$c->test();// 这里说明private属性对象内部可访问
// echo $c->a; // 这里会报错说明private属性外部不可以访问
$d = new d;
echo '[';
$d->test(); // 这里输出2,说明在test()中可以访问到class c 的$a
echo ']';
$d->test2(); // 这里没有产生输出说明private属性在子类中不可见
echo $d->a; // 这里也没有产生输出说明private属性在子类外部也是不可见的
$e = new e;
echo '{';
$e->test(); // 这里输出2, 说明该方法可见, 但访问的是父类的$a
echo '}';
$e->test2();
// 这里输出了3说明$a被覆写了, 但其实在class e中
// 其父类的$a并不可见,所以并不是覆写而是创建

protected (受保护的)我个人理解就是在对象和子对象中你想怎么用都可以, 就是不可以在外面用.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class f{
protected $a = "4";
function test(){
echo $this->a;
}
}

class g extends f{
function test2(){
echo $this->a;
}
}
$f = new f;
$f->test(); // 这里产生了输出,说明protected属性对象内部可以访问
//echo $f->a; // 这里报错说明protected属性对象外部不可以访问
$g = new g;
$g->test2(); // 这里输出4,说明protected属性在子类中可以访问
$g->test(); // 这里输出4,说明protected属性在子类中可以访问
// echo $g->a; //这里报错,说明protected属性在子类的外部不可访问