php接收表单提交数据实例详解
PHP $_GET 和 $_POST变量是用来获取表单中的信息的,比如用户输入的信息
PHP4.1(好像)以后取消了直接接收变量,而用 $_GET['变量名'] 接收从链接传递过来的变量, 用 $_POST['变量名'] 接收从表单提交来的变量。同样有$_FILES[],$_SERVER[]等
下面是一个 HTML 文件,这个 HTML 含有一个 HTML 表单 (HTML Form),主要用来让用户输入用户姓名的。
代码如下 | 复制代码 |
<form action ="get.php" method ="get">Name: |
该 HTML 的显示界面如下:
当你在这个 HTML 文件的表单文本框输入框里输入姓名,比如 "Jacky",然后鼠标点击ok 按钮,会跳转到 get.php,在 get.php 里会显示如下图。
get.php 的源代码如下:
代码如下 | 复制代码 |
<?php echo $_GET["username"]?>. |
取表单控件的 name 值,可以获得该表单控件的数据。
比如 "username" 就是表单控件文本输入框的 name 值,
代码如下 | 复制代码 |
<input type="text" name="username" /> |
用 $_GET["username"] 可以获得该文本输入框的数据。
代码如下 | 复制代码 |
<?php echo $_GET["username"]?> |
获取 HTML 表单 (HTML Form) 单选框 (input type="radio") 数据
取表单单选框的 name 值,可以获得表单单选框的值。
$_POST获取HTML表单提交数据
下面是一个 HTML 文件,这个 HTML 含有一个 HTML Form,主要用来让用户输入用户姓名的。
代码如下 | 复制代码 |
<form action ="post.php" method ="post"> Name: <input type="text" name="username" /> <input type ="submit" value="ok" /> </form> |
当你在这个 HTML Form 的文本框输入框里输入姓名,比如 "Jacky",然后鼠标点击ok 按钮,会跳转到 post.php,显示的输出结果是You are Jacky.。post.php 的源代码如下:
代码如下 | 复制代码 |
You are <?php echo $_POST["username"]?>. |
取表单控件的 name 值,可以获得该表单控件的数据。
比如 "username" 就是表单控件文本输入框的 name 值,
代码如下 | 复制代码 |
<input type="text" name="username" /> |
用 $_POST["username"] 可以获得该文本输入框的数据。
代码如下 | 复制代码 |
<?php echo $_POST["username"]?> |
$_REQUEST变量
PHP $_REQUEST变量包含$_GET, $_POST, and $_COOKIE的内容
PHP $_REQUEST变量可以用来获取通过“GET”和“POST”这两种方法发送的表单数据。
案例
代码如下 | 复制代码 |
Welcome <?php echo $_REQUEST["name"]; ?>.<br /> |
PHP自带了文件锁函数:
bool flock ( int $handle , int $operation [, int &$wouldblock ] )
$handle 是打开的文件指针;
$operation 可以是
“LOCK_SH”,共享锁定;“LOCK_EX”,独占锁定;“LOCK_UN”,释放锁定;“LOCK_NB”,防止flock锁定时堵塞。
这里主要说说“LOCK_EX”和“LOCK_NB”。
比如我们有两个文件,如下。
flocka.php
代码如下 | 复制代码 |
$file = 'temp.txt'; |
flockb.php
代码如下 | 复制代码 |
$file = 'temp.txt'; $fp = fopen($file,'a'); for($i = 0;$i < 5;$i++) { fwrite($fp, "22222222n"); } fclose($fp); |
先运行flocka.php,然后马上运行flockb.php。
结果:
11111111
22222222
22222222
22222222
22222222
22222222
11111111
11111111
11111111
11111111
说明不加文件锁时,两个文件会同时对txt文件进行写入操作。
下面修改一下两个php文件的代码。
flocka.php
代码如下 | 复制代码 |
$file = 'temp.txt'; $fp = fopen($file,'a'); if(flock($fp,LOCK_EX)) { for($i = 0;$i < 5;$i++) { fwrite($fp, "11111111n"); sleep(1); } flock($fp,LOCK_UN); } fclose($fp); |
flockb.php
代码如下 | 复制代码 |
$file = 'temp.txt'; $fp = fopen($file,'a'); if(flock($fp,LOCK_EX)) { for($i = 0;$i < 5;$i++) { fwrite($fp, "22222222n"); } flock($fp,LOCK_UN); } fclose($fp); |
同样先运行flocka.php,然后马上运行flockb.php。
会发现在flocka.php运行结束前,flockb.php一直处于等待状态,只有当flocka.php运行结束后,flockb.php才会继续执行。
输出结果:
11111111
11111111
11111111
11111111
11111111
22222222
22222222
22222222
22222222
22222222
另外,在执行flock时,文件锁会自动释放。
还有一种办法
如下代码简单模拟了这种事务并发状态: process1.php
代码如下 | 复制代码 |
<?php $num = 100; $filename = "processdata.txt"; $fp = fopen($filename, "a"); for ($i = 0; $i < $num; $i++) { fwrite($fp, "process1: " . $i . "rn"); usleep(100000); } fclose($fp); ?> |
我们需要先执行第一个事务,在processdata.txt文件中写入这100行。
process2.php
代码如下 | 复制代码 |
<?php |
第二个事务,继续向processdata.txt文件中写入100行。
第二个事务,继续向processdata.txt文件中写入100行。
多次同时执行,虽然都写了100行,但是事务1和事务2的数据交错写入,这并不是我们想要的结果。我们要的是事务完整的执行,此时我们需要有个机制去保证在第一个事务执行完后再执行第二个。在PHP中,flock函数完成了这一使命。在事物1和事务2的循环前面都加上: flock($fp, LOCK_EX); 就能满足我们的需求,将两个事务串行。
当某一个事务执行完flock时,因为我们在这里添加的是LOCK_EX(独占锁定),所以所有对资源的操作都会被阻塞,只有当事务执行完成后,后面的事务才会执行。我们可以通过输出当前的时间的方法来确认这一点。
关于在尾部追加写入,在unix系统的早期版本中存在一个并发写入的问题,如果要在尾部追加,需要先lseek位置,再write。当多个进程同时操作时,会因为并发导致的覆盖写入的问题,即两个进程同时获取尾部的偏移后,先后执行write操作,后面的操作会将前面的操作覆盖。这个问题在后面以添加打开时的O_APPEND操作而得到解决,它将查找和写入操作变成了一个原子操作。
在PHP的fopen函数的实现中,如果我们使用a参数在文件的尾部追加内容,其调用open函数中oflag参数为 O_CREAT|O_APPEND,即我们使用追加操作不用担心并发追加写入的问题。
在PHP的session默认存储实现中也用到了flock文件锁,当session开始时就调用PS_READ_FUNC,且以O_CREAT | O_RDWR | O_BINARY 打开session数据文件,此时会调用flock加上写锁,如果此时有其它进程访问此文件(即同一用户再次发起对当前文件的请求),就会显示页面加载中,进程被阻塞了。加写锁其出发点是为了保证此次会话中对session的操作事务能完整的执行,防止其它进程的干扰,保证数据的一致性。如果一个页面没有session修改操作,可以尽早的调用session_write_close()释放锁。
文件锁是针对文件的锁,除了这种释义,还可以理解为用文件作为锁。在实际工作中,有时为确保单个进程的执行,我们会在程序执行前判断文件是否存在,如果不存在则创建一个空文件,在进程结束后删除这个空文件,如果存在,则不执行。
三元运算符,是软件编程中的一个固定格式,即( ?: )(注:括号里面的内容才是正确的格式)。语法:条件 ? 结果1 : 结果2
说明:问号前面的位置是判断的条件,如果满足条件时结果1,不满足时结果2。
代码如下 | 复制代码 |
<?PHP $id = isset($_GET['id']) ? $_GET['id'] : false; ?> |
一条代码替代了很多的代码。首先,它使用isset ()函数,检查$_GET['id']是否存在。如果$_GET['id']确实存在,它将返回它的价值。但是,如果它不存在,条件即为假,这时返回的是false。$id的值取决于$_GET['id']是否存在。所以,基本上,如果$_GET['id']存在,$id=$_GET['id'],反之$id=false。
例
用“?:”条件语句检验用户输入值:
代码如下 | 复制代码 |
<?php while (!@feof($fp)) { @fclose($fp); |
前面使用三元运算符的代码和下面的代码等同:
代码如下 | 复制代码 |
<?php |
可以看出,假设用普通的if-else结构写上述代码,代码量会比上面多出许多,但第二种形式更易理解,而且不要求更多的录入。所以在挑选三元运算符时,请务必权衡一下利弊。
三元运算符优点
PHP中的三元运算符(?:)大大减少了程序员写这些语句的时间。它的语法如下:
condition ? do_if_true : do_if_false;
三元运算符不是一种必不可少的结构,但却是一种美化代码的途径。同样,它可以取代不好的if…else代码块,并且可以提高代码的可读性。
同样,用户可以使用PHP的or运算服赋予变量默认值:
代码如下 | 复制代码 |
<?php |
用户自定义预定义变量
代码如下 | 复制代码 |
<?php |
系统预定义变量
$GLOBALS
包含一个引用指向每个当前脚本的全局范围内有效的变量。该数组的键名为全局变量的名称。从 PHP 3 开始存在 $GLOBALS 数组。
$_SERVER
变量由 web 服务器设定或者直接与当前脚本的执行环境相关联。类似于旧数组 $HTTP_SERVER_VARS 数组(依然有效,但反对使用)。
$_GET
经由 URL 请求提交至脚本的变量。类似于旧数组 $HTTP_GET_VARS 数组(依然有效,但反对使用)。
$_POST
经由 HTTP POST 方法提交至脚本的变量。类似于旧数组 $HTTP_POST_VARS 数组(依然有效,但反对使用)。
$_COOKIE
经由 HTTP Cookies 方法提交至脚本的变量。类似于旧数组 $HTTP_COOKIE_VARS 数组(依然有效,但反对使用)。
$_FILES
经由 HTTP POST 文件上传而提交至脚本的变量。类似于旧数组 $HTTP_POST_FILES 数组(依然有效,但反对使用)。详细信息请参阅 POST 方法上传。
$_ENV
执行环境提交至脚本的变量。类似于旧数组 $HTTP_ENV_VARS 数组(依然有效,但反对使用)。
$_REQUEST
经由 GET,POST 和 COOKIE 机制提交至脚本的变量,因此该数组并不值得信任。所有包含在该数组中的变量的存在与否以及变量的顺序均按照 php.ini 中的 variables_order 配置指示来定义。此数组在 PHP 4.1.0 之前没有直接对应的版本。参见 import_request_variables()。
自 PHP 4.3.0 起,$_FILES 中的文件信息不再存在于 $_REQUEST 中。
Note: 当运行于命令行模式时,此数组将不会包含 argv 和 argc 条目;它们已经存在于数组 $_SERVER 中。
$_SESSION
当前注册给脚本会话的变量。类似于旧数组 $HTTP_SESSION_VARS 数组(依然有效,但反对使用)。
$_SERVER['PHP_SELF']
当前正在执行脚本的文件名,与 document root相关。举例来说,在URL地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。如果 PHP 以命令行方式运行,该变量无效。
$_SERVER['SERVER_NAME']
当前运行脚本所在服务器主机的名称。如果该脚本运行在一个虚拟主机上,该名称是由那个虚拟主机所设置的值决定。例如,在URL地址为 /test.php $_SERVER['SERVER_NAME'] 将会得到 这个结果。
例
代码如下 | 复制代码 |
<?php // user sent a GET header with key = secret_access, val = true, so echo $_GET["secret_access"]; // output: true session_start(); // in previous logic, you set session variable $secret_access = false echo $_SESSION["secret_access"]; // output: false extract_globals(); // Globals put into "normal" variables echo $_GET["secret_access"]; // output: true // VARIABLES ARE COMPROMISED! ?> |
解决办法
1、php.ini里的
error_reporting = E_ALL & ~E_NOTICE
并且把前面的注释去掉;
2、php.ini里把
display_error = off
改为
display_error = On。
然后重启apache即可
如果你的php.ini中本来就是设置了on但还是不报错,那我们要看看是不是程序要屏蔽了错误错,如果是去掉就可以了。
相关文章
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
- 这篇文章主要介绍了解决Mybatis 大数据量的批量insert问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-09
Antd-vue Table组件添加Click事件,实现点击某行数据教程
这篇文章主要介绍了Antd-vue Table组件添加Click事件,实现点击某行数据教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-17- 这篇文章主要介绍了详解如何清理redis集群的所有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
- 这篇文章主要介绍了vue 获取到数据但却渲染不到页面上的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-19
- 在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
- 这篇文章主要介绍了mybatis-plus 处理大数据插入太慢的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-18
- artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口。本文给大家介绍JS中artdialog弹出框控件之提交表单思路详解,对本文感兴趣的朋友一起学习吧...2016-04-19
- 这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04
- 这篇文章主要为大家详细解析了BootStrap栅格系统、表单样式与按钮样式源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-01-23
- 有时候我们为了省事就操作键盘组合键去代替使用鼠标,我们今天就使用JQuery实现Ctrl+Enter提交表单。我们发帖时,在内容输入框中输入完内容后,可以点击“提交”按钮来发表内容。可是,如果你够“懒”,你可以不用动鼠标,只需按...2015-10-23
Vue生命周期activated之返回上一页不重新请求数据操作
这篇文章主要介绍了Vue生命周期activated之返回上一页不重新请求数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-26- 为了网站的安全性,很多朋友都把密码设的比较复杂,但是如何密码不能明显示,不知道输的是对是错,为了安全起见可以把密码显示的,那么基于js代码如何实现的呢?下面通过本文给大家介绍JavaScript实现表单密码的隐藏和显示,需要的朋友参考下...2016-03-03
- 这篇文章主要介绍了解决vue watch数据的方法被调用了两次的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-07
- 这篇文章主要介绍了c# socket网络编程,server端接收,client端发送数据,大家参考使用吧...2020-06-25
- 这篇文章主要介绍了vue 数据(data)赋值问题的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了Python3 常用数据标准化方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-24
- 这篇文章主要介绍了vue项目,代码提交至码云,iconfont的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30
- 这篇文章主要为大家详细介绍了node.js从数据库获取数据的具体代码,nodejs可以获取具体某张数据表信息,感兴趣的朋友可以参考一下...2016-05-09