本期格言:
一个的好程序员会使用最适合自己的编码方式来实现业务功能。编程不是买房子,买房子可以只买贵的不买好的,但是写程序只能写最好的。
本期扯淡:
学生年代,因为长得不好看,基本上除了大学就是图书馆没有青春。
学生年代,学的是文科。
学生年代,突然爱上了编程。
学生年代,发现文科班没有计算机编程课程,当然除了vfp。
学生年代,买一本计算机书要几个星期不抽烟
学生年代,在我所在的经济管理系只有我一个人未来成为程序员
当年第一次开始学写程序时有几个迷惑:(注意:迷惑期时我刚学会用FrontPage做一些静态网页,还会从网上下载一些JS特效,把页面弄得花哨的像狗)
1、我在人家网站填写的评论是如何传递给人家的呢?
2、人家得到我提交的数据后是如何保存的呢?(注意:那时我以为access就是数据库的全部,感觉以后除了access不会再爱了)
3、当时的我扯着头发坚定的认为:网页编程真tm难学。
正文:
一、什么是Form.字面上解释:Form就是表单,注意:天资极低的我弄了很久才知道原来网页中提交数据时需要有个From。看如下代码
htmlbodyformaction=index.phpmethod=postid=”helloform”用户名:inputtype=textname=txtusernamebr密码:inputtype=passwordname=txtpwdbrinputtype=submitvalue=”登录”/form/body/html
html
body
formaction=index.phpmethod=postid=”helloform”
用户名:inputtype=textname=txtusernamebr
密码:inputtype=passwordname=txtpwdbr
inputtype=submitvalue=”登录”
/form
/body
/html
这里来做一下html知识的扫盲:1、form………./form之间的内容,可以根据action来提交数据。如上述,说明form里面的任何数据都是提交给index.php的。
2、method属性决定了咱是使用post还是get的方式传递数据。
3、提交form有两个办法:直接放一个type=”submit”的按钮;或者用脚本来提交,如document.getElementById(“helloform”).submit()。其他还有办法?请忘记吧,知道这么多不好。
4、form下面任何组件的value属性都会被提交,其key取的是组件的name.这里要说明:不是ID。譬如:inputtype=”text”name=”txtusername”,name必须设置
关于get和post的扫盲:
那时我还是程序SB的时候,完全拎不清get和post有啥区别。直至后来踏入工作岗位(这说明:就算不会也能找到工作,所以程序员起初找工作:6分靠真材实料,4分靠吹,后者往往很重要)1、get方式,就是把参数跟在url后面。如上面,提交后会变成index.php?username=XXtxtpwd=XX2、post方式,HTTPpost机制,将表单内各个字段与其内容放置在HTMLHEADER。
对get和post如何选择使用?
1、说起安全性,其实get和post都不安全,真要破你都有办法。
2、说起性能,get要高于post.
3、说点真实的,在我们的应用中对一些敏感数据都要进行传输加密。不要指望post会帮你保证安全性。我个人项目中基本都使用get来处理小量参数,对于量比较大的参数没办法只能使用post,没办法因为get只能支持一定大小,否则我全部使用get都可以,砂锅大的get,你知不知道?
4、上述例子中,密码传输都需要加密后传输。所以,不存在安全性问题。
二、PHP中的数据提交
根据上面的扫盲,我们应该能无障碍的发现:其实php和form提交没啥关系。Form是html的范畴。
为了这里强迫咱和标题扯上关系,我们来举个例子.
formaction=index.phpmethod=postid=”helloform”用户名:inputtype=textname=txtusernamebr密码:inputtype=passwordname=txtpwdbrinputtype=submitvalue=”登录br/
formaction=index.phpmethod=postid=”helloform”
用户名:inputtype=textname=txtusernamebr
密码:inputtype=passwordname=txtpwdbr
inputtype=submitvalue=”登录”
/form
知识点解说:
1、在一般项目中,action我们都是写成action=”$_SERVER[‘REQUEST_URI’]”,因为不太可能你的页面url没点get参数或者你的页面地址很短很好记很有节操,这么写不是因为规范,而是谁记得住这么多参数呢?
2、Form的ID写不写?最好是写。没啥理由,编程的好习惯:凡是和后台有可能要进行交互的必须要有ID.
3、Method呢?html默认是get,所以当我们用post方式提交的时候是需要注明的。
三、商业项目中怎么实现上面简单的form提交代码
1、教学写法其实我个人很讨厌一些教材或者培训类文章对这些知识点的示例代码,往往写的很模糊过于初级,初学者到了真实项目中容易形成思维定势。
formaction=userlogin.phpmethod=postid=”userlogin_form”用户名:inputtype=textname=txtusernamebr密码:inputtype=passwordname=txtpwdbrinputtype=submitvalue=”登录”name=”cmd_login”/form
formaction=userlogin.phpmethod=postid=”userlogin_form”
用户名:inputtype=textname=txtusernamebr
密码:inputtype=passwordname=txtpwdbr
inputtype=submitvalue=”登录”name=”cmd_login”
/form
这时,某些所谓的老师会告诉你,点了cmd_login这个按钮后就会把用户名和密码两个数据提交到后台了。你在userlogin.php中就可以这么获取传输的数据,如:
?phpif(isset($_POST[cmd_login])){$get_username=$_POST[txtusername];//获取用户名$get_userpwd=$_POST[txtuserpwd];//获取密码//下面干些邪恶的事情吧}?
?php
if(isset($_POST[cmd_login]))
{
$get_username=$_POST[txtusername];//获取用户名
$get_userpwd=$_POST[txtuserpwd];//获取密码
//下面干些邪恶的事情吧
}
?
好吧,这种教学代码出来后,很多同学就会在真实项目中这么写。于是各种激烈的Bug和漏洞就出现了。
2、一般性真实项目会这么写
formid=”userlogin_form”用户名:inputtype=textname=txtusernamebr密码:inputtype=passwordname=txtpwdbrinputtype=submitvalue=”登录”name=”cmd_login”/form
formid=”userlogin_form”
用户名:inputtype=textname=txtusernamebr
密码:inputtype=passwordname=txtpwdbr
inputtype=submitvalue=”登录”name=”cmd_login”
/form
大家会发现form的action和method木有了,很正常嘛,我们并不希望用户(一般性用户)在打开网页源码后看到
到底提交到那个action,于是会在网页进入时,根据form的id用脚本把action和method置入.
如$(“#userlogin_form”).attr(“action”,”userlogin.php”);//注意。这里用了jquery的写法。
这种做法需要把id=userlogin_form对应的method和action配置在文件中或者数据库中。
3、较为成熟的真实项目会这么写
formaction=”do.php”id=”userlogin_form”用户名:inputtype=textname=txtusernamebr密码:inputtype=passwordname=txtpwdbrinputtype=submitvalue=”登录”inputtype=”hidden”value=”userlogin”name=”post_site_key“///这是关键,/form
formaction=”do.php”id=”userlogin_form”
用户名:inputtype=textname=txtusernamebr
密码:inputtype=passwordname=txtpwdbr
inputtype=submitvalue=”登录”
inputtype=”hidden”value=”userlogin”name=”post_site_key“///这是关键,
/form
大家会发现,action有了,然后会发现,其他任何form的action都是do.php.其实,它是把处理程序都集中在了do.php。请看do.php中一段示例代码(仅仅是示例,真实情形还是复杂得多)
?php//首先要有一堆key形成的数组,其实就是保存post_site_key各种value,然后匹配,如果有则做不同处理。$submitkeys=XXX;//这些key随便保存在哪,一般建议直接写在配置文件中.key的值写的稍微高端大气一点.If(isset($_POST[“post_site_key”])in_array($_POST[“post_site_key”],submitkeys)){//这里做的是验证,防止恶意用机器postRequire(“/lib/do”.$_POST[“post_site_key”].”_action.php”);//这里解释一下,你需要在网站有个lib文件夹,然后放置各种do_XXX_action.php的文件夹。譬如我这个do_userlogin_action.php里面就是专门处理用户登录的代码}?
?php
//首先要有一堆key形成的数组,其实就是保存post_site_key各种value,然后匹配,如果有则做不同处理。
$submitkeys=XXX;//这些key随便保存在哪,一般建议直接写在配置文件中.key的值写的稍微高端大气一点.
If(isset($_POST[“post_site_key”])in_array($_POST[“post_site_key”],submitkeys))
{
//这里做的是验证,防止恶意用机器post
Require(“/lib/do”.$_POST[“post_site_key”].”_action.php”);
//这里解释一下,你需要在网站有个lib文件夹,然后放置各种do_XXX_action.php的文件夹。譬如我这个do_userlogin_action.php里面就是专门处理用户登录的代码
}
?
既然上面require了,然后就是do_userlogin_action.php代码了。
?phpXXXX–这里省略,大家动手完成一个嘛~~?
?php
XXXX–这里省略,大家动手完成一个嘛~~
?
注意上述方法就是一个纯手工的简单form框架,我们在开发过程中要尽量做得有扩展性一点的。对于一些安全性的处理要尽量在一个do.php中就能做判断,如非空判断,字符长度判断等等。
这里有人要问,直接requre是否也有不安全因素,事实上是有的。所以我们要这样
Require(“/lib/do”.$_POST[“post_site_key”].”_action.php?seckey=XXXXXXX”);这个seckey需要写在配置文件中,保证我们通过一个方法可以获取到,然后到了这个do_userlogin_action.php再进行安全验证,如:
?phpIf(!$_GET[“seckey”]
$_GET[“seckey”]!=XXXXXX){//这里就洗洗睡了,验证都没通过,还干毛啊。}?
?php
If(!$_GET[“seckey”]
$_GET[“seckey”]!=XXXXXX)
{
//这里就洗洗睡了,验证都没通过,还干毛啊。
}
?
为什么要这么写?因为防止用户恶意直接把数据绕过do.php直接提交到do_userlogin_action.php.
4、周期长且大型项目和高级客户(如政府软件)的超高级写法
此处省略一万字,写法请参考第一点。
三、结尾语
其实做企业或者业务应用程序,我们需要花较大的精力在form的处理上,为了有比较好的扩展form框架的搭建上要考虑延伸性,并减少程序页面之间的耦合。
最近看了一些开源框架。虽然确实都很不错,扩展性也强。但是大部分开源框架为了保证数据库的兼容性太过于依赖数据层。其实,如果我们做的程序是为了自己用(如互联网),那么最好不要全部使用开源框架,可以学思路借鉴一些内核,但是坚决不能直接拿来主义。
如果你喜欢我们的文章请加“程序员在囧途”公众北京看白癜风哪家医院效果最好白颠的症状