PHP中的表单应用释疑

 更新时间:2016年11月25日 15:16  点击:2234

综述:表单作为用户提交信息的一个要害途径,一直是PHP编程中的一个最基本的方面,也是入门者会碰到的一个大的重点与难点。我们选择有关处理关联数、获得同名checkbox的选取值、上传文件方面比较轻易令众困惑的地方进行归

  如何使用表单传递关联数组?

  通过表单传递的关联数组能被 each()函数读取,程序如下:

//test1.php
<form action="test2.php" method=post>
<input type=hidden name="var[Address]" value="Beijing">
<input type=hidden name="var['age']" value="20">
<input type=submit value=submit>
这个名为var[Address]值为"Beijing"的元素递交到test2.php后,就成了一个关联数组,var["Address"]="Beijing":
//test2.php
<?
echo $var["Address"];
?>

  输出结果为:Beijing

  如何处理同名checkbox?

  具体代码:

test1.php:
<FORM METHOD=POST ACTION="test2.php">
苹果<INPUT TYPE="checkbox" NAME="come[]" VALUE="苹果"><BR>
鸭梨<INPUT TYPE="checkbox" NAME="come[]" VALUE="鸭梨"><BR>
香蕉<INPUT TYPE="checkbox" NAME="come[]" VALUE="香蕉"><BR>
西瓜<INPUT TYPE="checkbox" NAME="come[]" VALUE="西瓜"><BR>
<INPUT TYPE="submit" VALUE="提交">
</FORM>

test2.php:
你的选择:<BR>
<?
for ($i=0;$i<sizeof($come);$i ) echo $come[$i],"<BR>";
?>
  这样从test1.php提交过来的所有名为come[]的元素就组成了一个数组,这样我们就可以很轻易地处理了.

  怎样才能察看提交的所有信息?

  一般来说,PHP引擎将每一个表单域放到一个叫做$HTTP_POST_VARS的数组中,所以我们可以通过读取这个数组就可以察看提交的所有信息:

<?
  echo "POST 所送出的值为:<BR>";
  while ( list( $key, $val ) = each( $HTTP_POST_VARS ) ) {
    echo "$key => $val<BR>";
  }
?>

  如何同时上传多个文件?

  我们来看一个例子。

  下面是上传文件的提交页面,利用该页面你不仅可以生成 1000 个上传文件框(也可以是任意多个 0~n ),而且可分别指出它们的保存路径。

  提交页面的文件输入框为命名为: file0,file1,...file100,...fileN
  提交页面的文件路径框为命名为: path0,path1,...path100,...pathN
  由于页面的生成非常简单,所以就不在此多解释了,用 javascript 定义了两个函数,check() 用于提交页面,create()用于生成文件上传框。
    phpfileup.htm
    --------------------------------------------------------
    【文件php9.txt】
    --------------------------------------------------------
  文件提交页面既已生成,下面任务就很明确了:将提交的文件内容保存到服务器上。

  我们先定义一个文件保存函数 fup() 它有两个参数:
    $filename: 文件内容
    $fname: 文件名(包含路径)
  剩下的就是写一个循环将文件依次写入服务器。

如何使用Session ?


<?php
//必须在使用前加上;
session_start();
?>
<?php
//考虑我们有时候考虑是否写入session
if (isset($_POST['userid'])){
//假如真的同意写入:
$_SESSION['userid'] = $ccdot

}else{
//或者返回不能写入session
}
?>


要清除的时候:

session_start();
unset($_SESSION['userid']); //OR : session_register('username');

session_unregister()函数主要作用是注消当前的一个session变量。不过要注重的是,假如你用$HTTP_SESSION_VARS或$_SESSION在当前页面

综述

  正则表达式是一种可以用于模式匹配和替换的强有力的工具。正则表达式可以让用户通过使用一系列的非凡字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。

  如何使用基本模式匹配?

  模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用非凡的字符表示一个范围内的字符重复出现,或表示上下文。我们先看一些正则表达式中的非凡字符。

  非凡字符"^"用来匹配以指定字符串开头的字符串。例如:

    "^hello" :这个模式与字符串"hello,PHP world!"匹配,但是与"Say hello to you"不匹配。

  非凡字符"$"用来匹配以指定字符串结尾的字符串。例如:

    "you$" :这个模式与"How are you"匹配,与"your"不匹配。

  当非凡字符"^"和"$"同时使用时,表示精确匹配。例如:

    "^hello$" :这个模式只匹配字符串"hello"。

  假如一个模式不包括"^"和"$",那么它与任何包含该模式的字符串匹配。例如:     "you" :与字符串"What is your name?"是匹配的。

  在该模式中的字母只是普通的字符,数字也是一样的。

  假如要用到其他一些稍微复杂的字符,如标点符号和空白字符(比如空格、制表符等),就要要用到转义序列。所有的转义序列都用反斜杠("")打头,例如制表符的转义序列是:"t"。所以假如我们要检测一个字符串是否以制表符开头,可以用这个模式:

    "^t"

  类似的,用"n"表示换行,"r"表示回车,反斜杠本身用""表示,句号"."用"."表示,依此类推。

  如何使用字符簇?

  假如要判定用户输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符串比较是不够的。所以要用一种更好的方法来描述我们想要的模式,这就是字符簇。

  比如,要建立一个表示所有元音字符的字符簇,就可以这样做:


    "[AaEeIiOoUu]" :这个模式与任何元音字符匹配,但只能表示一个字符。

  用非凡符号"-"可以表示一个字符的范围,如:
"[a-z]" //匹配字母a-z,即所有的小写字母
"[A-Z]" //匹配字母A-Z,即所有的大写字母
"[a-zA-Z]" //匹配所有的字母
"[0-9]" //匹配所有的数字
"[0-9.-]" //匹配所有的数字,以及句号和减号
"[ ]" //匹配所有的白字符


  同样的,这些也只匹配一个字符。

  假如要匹配由一个小写字母和一位数字组成的字符串,比如"a4"、"b5"或"f1",但不是"aa4"、"b5a4" 或"f12"的话,用这个模式:

    "^[a-z][0-9]$"

  尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。

  我们已经知道"^"表示字符串的开头,但是当在一组方括号里使用"^"时,它表示"非"或"排除"的意思,经常用来剔除某个字符。

面向对象编程被设计来为大型软件项目提供解决方案,尤其是多人合作的项目. 当源代码增长到一万行甚至更多的时候,每一个更动都可能导致不希望的副作用. 这种情况发生于模块间结成秘密联盟的时候,就像第一次世界大战前的欧洲。

  //haohappy注:喻指模块间的关联度过高,相互依靠性太强.更动一个模块导致其它模块也必须跟着更动。

  想像一下,假如有一个用来处理登录的模块答应一个信用卡处理模块来分享它的数据库连接. 当然出发点是好的,节省了进行另一个数据库连接的支出.然而有时,登录处理模块改变了其中一个变量的名字,就可能割断了两者间的协议.导致信用卡模块的处理出错,进而导致处理的模块出错. 很快地,体系中所有无关的模块都可能由此出错.

  因此,我觉得有点戏剧性地,绝大多数程序员都对耦合和封装心存感激. 耦合是两个模块间依靠程度的量度. 耦合越少越好.我们希望能够从已有的项目中抽走一个模块并在另一个新项目中使用.

  我们也希望在某个模块内部大规模的更动而不用担心对其他模块的影响. 封装的原则可以提供这个解决方案.模块被看待成相对独立,并且模块间的数据通信通过接口来进行. 模块不通过彼此的变量名来窥探另一个模块,它们通过函数来礼貌地发送请求.

  封装是你可以在任何编程语言中使用的一个原则. 在PHP和许多面向过程的语言中,可以偷懒是很有诱惑的.没有什么可以阻止你通过模块来构建一个假想的WEB. 面向对象编程是使程序员不会违反封装原则的一种方法.

  在面向对象编程中,模块被组织成一个个对象. 这些对象拥有方法和属性. 从抽象的角度来看,方法是一个对象的所做的动作,而属性是对象的特性.从编程角度来看,方法就是函数而属性是变量. 在一个理想化的面向对象体系中,每个部份都是一个对象. 体系由对象及对象间通过方法来形成的联系构成.

  一个类定义了对象的属性. 假如你在烘烤一组甜饼对象,那么类将会是甜饼机. 类的属性和方法是被调用的成员. 人们可以通过说出数据成员或者方法成员来表达.

  每种语言提供了不同的途径来访问对象. PHP从C 中借用概念,提供一个数据类型用来在一个标识符下包含函数和变量。最初设计PHP的时候,甚至PHP3被开发出时,PHP并不打算提供开发超过10万行代码的大型项目的能力。随着PHP和Zend引擎的发展,开发大型项目变得有可能,但无论你的项目规模多大,用类来书写你的脚本将可以让代码实现重用。这是一个好主意,非凡当你愿意与别人分享你的代码的时候。

  有关对象的想法是计算机科学上最令人兴奋的概念之一。开始很难把握它,但我可以保证,一旦你把握了它,用它的思维来思考将会非常自然。

  PHP5 的对象模型

  PHP5有一个单重继续的,限制访问的,可以重载的对象模型. 本章稍后会具体讨论的”继续”,包含类间的父-子关系. 另外,PHP支持对属性和方法的限制性访问. 你可以声明成员为private,不答应外部类访问. 最后,PHP答应一个子类从它的父类中重载成员.

  PHP5的对象模型把对象看成与任何其它数据类型不同,通过引用来传递. PHP不要求你通过引用(reference)显性传递和返回对象. 在本章的最后将会具体阐述基于引用的对象模型. 它是PHP5中最重要的新特性.

  有了更直接的对象模型,就拥有了附加的优势: 效率提高, 占用内存少,并且具有更大的灵活性.

  在PHP的前几个版本中,脚本默认复制对象.现在PHP5只移动句柄,需要更少的时间. 脚本执行效率的提升是由于避免了不必要的复制. 在对象体系带来复杂性的同时,也带来了执行效率上的收益. 同时,减少复制意味着占用更少的内存,可以留出更多内存给其它操作,这也使效率提高.

  Zand引擎2具有更大的灵活性. 一个令人兴奋的发展是答应析构--在对象销毁之前执行一个类方法. 这对于利用内存也很有好处,让PHP清楚地知道什么时候没有对象的引用,把空出的内存分配到其它用途.

  PHP5的内存治理

  对象传递

  PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval)。在Zval中仅存储对象的指针而不是内容(value)。当我们复制一个对象或者将一个对象当作参数传递给一个函数时,我们不需要复制数据。仅仅保持相同的对象指针并由另一个zval通知现在这个特定的对象指向的Object Store。由于对象本身位于Object Store,我们对它所作的任何改变将影响到所有持有该对象指针的zval结构----表现在程序中就是目标对象的任何改变都会影响到源对象。.这使PHP对象看起来就像总是通过引用(reference)来传递,因此PHP中对象默认为通过“引用”传递,你不再需要像在PHP4中那样使用&来声明。

  垃圾回收机制

  某些语言,最典型的如C,需要你显式地要求分配内存当你创建数据结构。一旦你分配到内存,就可以在变量中存储信息。同时你也需要在结束使用变量时释放内存,这使机器可以空出内存给其它变量,避免耗光内存。

  PHP可以自动进行内存治理,清除不再需要的对象。PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

  例如:

<?php
class Person{}
function sendEmailTo(){}
$haohappy = new Person( );
// 建立一个新对象: 引用计数 Reference count = 1
$haohappy2 = $haohappy;
// 通过引用复制: Reference count = 2
unset($haohappy);
// 删除一个引用: Reference count = 1
sendEmailTo($haohappy2);
// 通过引用传递对象:
// 在函数执行期间:
// Reference count = 2
// 执行结束后:
// Reference count = 1


unset($haohappy2);
// 删除引用: Reference count = 0 自动释放内存空间
?>

1. 当您在寻找关于某个具体的 PHP 函数的信息时,请转至 http://php.net/ 。例如:http://php.net/join。这将直接把您带到您地理位置四周的一台服务器上的联机手册中的正确位置上。

  2. 试试这个:pear install apc 。pear 命令是一个有用的安装程序,它甚至可以用来安装用 C 编写的 PHP 扩展。在这种情况下,它将安装 APC opcode 高速缓存扩展。

  3. 使用 opcode 高速缓存来提高性能。

  4. 在 PHP 中混合 OOP 和过程代码不存在任何错误。在对象有意义的时候使用对象,其余情况转用过程。

  5. 用您自己定制的 C 或 C 扩展来扩展 PHP 比您想象的要更轻易。参见 PHP 源代码版本中的 README.EXT_SKEL。

  6. echo <<<EOB 语法对于用完整的 $variable 替换来输出文本块非常有用,并且无需避开任何东西。EOB;

  7. PATH_INFO 很棒!用它来清除难看的 URL。

  8. 使用一个记录程序,pear install apd。

  9. 数据库抽象大部分是虚构的故事。直接的数据库调用没什么错,它利用您选择的数据库必须提供的所有技巧和窍门,以从中获得尽可能高的性能。

  10. 保持使用您的基础技术,并构建简单的程序块。使用无线程的 Web 服务器,避免复杂的框架和抽象层,从而给您自己机会来跟踪和调试可能出现的任何问题。解决 Web 问题很简单;别试图使它变得困难。

[!--infotagslink--]

相关文章

  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • JS中artdialog弹出框控件之提交表单思路详解

    artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口。本文给大家介绍JS中artdialog弹出框控件之提交表单思路详解,对本文感兴趣的朋友一起学习吧...2016-04-19
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • 使用JQuery实现Ctrl+Enter提交表单的方法

    有时候我们为了省事就操作键盘组合键去代替使用鼠标,我们今天就使用JQuery实现Ctrl+Enter提交表单。我们发帖时,在内容输入框中输入完内容后,可以点击“提交”按钮来发表内容。可是,如果你够“懒”,你可以不用动鼠标,只需按...2015-10-23
  • 基于JavaScript实现表单密码的隐藏和显示出来

    为了网站的安全性,很多朋友都把密码设的比较复杂,但是如何密码不能明显示,不知道输的是对是错,为了安全起见可以把密码显示的,那么基于js代码如何实现的呢?下面通过本文给大家介绍JavaScript实现表单密码的隐藏和显示,需要的朋友参考下...2016-03-03
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • BootStrap栅格系统、表单样式与按钮样式源码解析

    这篇文章主要为大家详细解析了BootStrap栅格系统、表单样式与按钮样式源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-01-23
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • react使用antd表单赋值,用于修改弹框的操作

    这篇文章主要介绍了react使用antd表单赋值,用于修改弹框的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • JS跨浏览器解析XML应用过程详解

    这篇文章主要介绍了JS跨浏览器解析XML应用过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-16
  • html表单提交中method请求Get和Post区别详解

    在html表单提交中method请求Get和Post区别其实很显示的,get提交会是url形式的并且数据量不能太多,而post数据是在浏览器url看不到的并且可以是大数据量而且get安全性非...2016-09-20
  • 微信小程序 PHP后端form表单提交实例详解

    这篇文章主要介绍了微信小程序 PHP后端form表单提交实例详解的相关资料,需要的朋友可以参考下...2017-01-16
  • PHP+jQuery+Ajax实现多图片上传效果

    今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
  • 解决antd Form 表单校验方法无响应的问题

    这篇文章主要介绍了解决antd Form 表单校验方法无响应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-28
  • 基于Bootstrap实现Material Design风格表单插件 附源码下载

    Jquery Material Form Plugin是一款基于Bootstrap的Material Design风格的jQuery表单插件。这篇文章主要介绍了基于Bootstrap的Material Design风格表单插件附源码下载,感兴趣的朋友参考下...2016-04-19