一个php留言板实例详解(附源码下载)
1.在你的PHP的根目录下创建一个名为”msgboard”的文件夹。
在”msgboard”下创建一个“msglist.php”文件
数据表结构大家可直接导入
代码如下 | 复制代码 |
CREATE TABLE `msgboard` ( `id` int(10) NOT NULL AUTO_INCREMENT, `username` varchar(50) CHARACTER SET latin1 NOT NULL, `sex` tinyint(1) NOT NULL DEFAULT '1', `msg` text CHARACTER SET latin1 NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; |
msglist.php 文件,包括了留言增加,删除,修改
代码如下 | 复制代码 |
<html> |
一个php留言板实例下载:http://file.111cn.net/download/2013/06/08/msgboard.rar
本文章来给大家介绍一个入门教程关于PHP表单提交数据之get,post实例,有需要了解的同学可进入参考参考。1.什么是表单
所谓表单,说简单点就是一对form标签。即:<form></form> 。
2.表单的作用
表单的作用是采集客户端提交的数据,并把数据提交给服务端。
比如在登录一个网站时,你需要输入自己的用户名和密码才能登陆。又比如你注册游戏账号时,你需要填写自己的邮箱、密码、年龄等等。
这些操作就要通过表单提交给服务器,最后由服务器记录在数据库。(不是所有)
3.表单的组成
表单的两个标签必须是成对出现的:<form></form>。
form标签有两个必填的属性 : action,method。
action的作用是指定要提交到服务器的地址,比如我要提交到本站的info.php文件,那么就写成<form action=”http://www./info.php“>
,本站的文件写相对路径就可以了:<form action=”info.php“>
method属性,顾名思义就是提交数据的方法,它有两个值可选:post/get ,post是隐藏传递,get是地址栏传递。具体不同请参阅文章《form的get和post 详细分析区别》。
如果用get传递,以上就可以写成:<form action=”info.php“ method=”get”>
form标签中可以添加文本框,比如用户填写用户名和密码的:
用户名:<input type=”text” name=”username” value=”" />
密 码:<input type=”password” name=”password” value=”" />
也可以多行文本textarea等:
<textarea name=”content”></textarea>
最后加一个提交按钮和一个重置按钮:
<input type=”submit” value=”提交”/>
<input type=”reset” value=”重置”/>
细心的童鞋可以看出,以上的几个标签除了提交、重置和form表单外,我都有些name属性,因为服务端是通过标签的name属性来获取它的值的。
4.那么在info.php中如何获取数据的呢?
有三种方式:$_GET,$_POST,$_REQUEST。
$_GET只能获取get方法提交的数据,$_POST方法只能获取post方法提交的数据,而$_REQUEST能同时获取get和post方法提交的数据。
比如要得到用户输入的用户名和密码的值,就是 $_GET["username"] 和$_GET["password"],或者$_REQUEST["username"] 和$_REQUEST["password"]
以下是实例代码:
创建 test.html文件,内容:
代码如下 | 复制代码 |
<form action=”info.php“ method=”get”> 用户名:<input type=”text” name=”username” value=”" /><br/> 密 码:<input type=”password” name=”password” value=”" /><br/> <input type=”submit” value=”提交”/> <input type=”reset” value=”重置”/> </form> |
再创建info.php文件,内容:
代码如下 | 复制代码 |
<?php $username = $_GET["username"]; //获取用户名 $password = $_GET["password"]; //获取密码 //打印输出 echo “您输入的用户名为:” . $username . “,密码为:”. $password ; ?> |
友情提示:以上所有引号和分号均为英文状态下的引号和分号,中文的话会报错滴!!如有中文引号请自行修改 ^^
理解form的get和post
在HTML中,form元素用method属性来指定有两种不同的提交方法,即”get”(默认值)和”post”。
1. get和post的定义
W3C的HTML 4.01 specification说,form元素的method属性用来指定发送form的HTTP方法。
* 使用get时,form的数据集(形如control-name=current-value的键值对)被附加到form元素的action属性所指定的URI后面;
* 使用post时,form的数据集(形如control-name=current-value的键值对)被包装在请求的body中并被发送。
这可以简单地理解为,get仅仅是拼接一个URI,然后直接向服务器请求数据(需要提交给服务器的数据集包含在URI中)。比如:
<form action=”FormGet.aspx” method=”get”> <input name=”ProductID” type=”text” value=”1″ />
<input type=”submit” value=”Get” />
</form>这个form在提交的时候,会产生这样能够一个get请求:FormGet.aspx?ProductID=1。
而post会把form的数据集,即ProductID=1这个键值对包装在请求的body中,发送给服务器,然后向服务器请求数据。对于:
<form action=”FormPost.aspx” method=”post”> <input name=”ProductID” type=”text” value=”1″ />
<input type=”submit” value=”Get” />
</form>这样一个form在提交时,我们将看到一个干净的URI:FormPost.aspx。因为数据不是拼接在URI中。
2. get和post的区别
2.1 安全性
如果用get提交一个验证用户名和密码的form,一般认为是不安全的。因为用户名和密码将出现在URL上,进而出现在浏览器的历史记录中。显然,在对安全性有要求的情况下,应该使用post。
2.2 编码
HTML 4.01 specification指出,get只能向服务器发送ASCII字符,而post则可以发送整个ISO10646中的字符(如果同时指定enctype=”multipart/form-data”的话)。
注意get和post对应的enctype属性有区别。enctype有两个值,默认值为application/x-www-form-urlencoded,而另一个值multipart/form-data只能用于post。
2.3 提交的数据的长度
HTTP specification并没有对URL长度进行限制,但是IE将请求的URL长度限制为2083个字符,从而限制了get提交的数据长度。测试表明如果URL超出这个限制,提交form时IE不会有任何响应。其它浏览器则没有URL的长度限制,因此其它浏览器能通过get提交的数据长度仅受限于服务器的设置。
而对于post,因为提交的数据不在url中,所以通常可以简单地认为数据长度限制仅受限于服务器的设置。
2.4 缓存
由于一个get得到的结果直接对应到一个URI,所以get的结果页面有可能被浏览器缓存。而post一般则不能,参考5。
2.5 引用和SEO
出于和上面相同的原因,我们可以用一个URI引用一个get的结果页面,而post的结果则不能,所以必然不能被seo/seo.html" target="_blank">搜索引擎搜到。
3. 服务端的处理
在服务端的ASP.NET程序中,对于get,我们用Request.QueryString[control-name]来取得对应的=current-value;对于post,我们用Request.Form[control-name]。
我们也可以笼统地使用Request[control-name]。但这样做的效率不如前者。我们可以用下面的程序比较
代码如下 | 复制代码 |
Request.QueryString和Request的效率: <script>// <![CDATA[ Request.QueryString / Request <form action=”FormGet.aspx” method=”get”> Get: <span id=”get”> </span> Request.QueryString / Request: <span id=”compare”> </span></div> |
同样的办法我们可以比较Request.Form和Request。
最后得到的结果(Request.QueryString[control-name] / Request[control-name]和Request.Form[control-name] / Request[control-name])大多数时候是小于1的。因此,我们因该尽量用Request.QueryString或 Request.Form来代替Request。
4. 正确地使用get和post
W3C的官方建议是:当且仅当form是幂等(idempotent)的时候,使用get。幂等是一个数学上的术语,其定义是:对于一个函数f : D -> D,如果D中的所有x满足f (f x) = f x,那么这个函数是幂等的。HTTP specification(比如RFC 2616)中,将幂等解释为:多次相同请求产生的副作用,和一次请求的副作用相同。
打个比方,如果你提交一个form会从Google上查询一个关键词,那么我们可以认为这个form是幂等的,因为1次提交和10次提交的副作用是差不多的(10次查询可能会多消耗一些电能);如果你提交一个form是订购一个终极大黄蜂(Utimate bumblebee),那么这就不是幂等的:要是你不小心多提交了1次form的话,你可能会被老婆乱骂,你不小心又提交了10次的话,你可能就破产了——一次提交和多次提交的副作用明显不同,所以这不是幂等的。
所以,一般来说,如果提交这个请求纯粹只是从服务端获取数据而不进行其他操作,并且多次提交不会有明显的副作用,应该使用get。比如:
* 搜索引擎的查询:http://www.google.com/search?q=yandixin;
* 分页:ArticleList.asp?Page=1。
如果提交这个请求会产生其它操作和影响,就应该使用post。比如:
* 修改服务器上数据库中的数据;
* 发送一封邮件;
* 删除一个文件。
另一个要考虑的因素是安全性。见2.1。
5. 浏览器差异
* IE 6:URL长度限制为2083个字符;post之后,刷新页面不会自动重新post数据,会出现警告;
并且,在后退的过程中有可能出现“Page has Expired”(通常是向自己post,然后后退时):
微软的技术支持人员号称“this is not a bug or problem specified to the ASP.NET but a security feature of the IE Browser”,并且说“You can also inform your users of this”,实在是荒唐。另外,一篇KB也提到这个问题,说将Response.CacheControl设为”Public”即可,经测试仅在第一次后退时有效。
* IE 7:和IE 6相同;
* Firefox 2.0.0.11:刷新页面不会自动重新post数据,会出现警告;
* Opera 9.24:正常(自动post数据);
* Safari 3.0.4:post之后,刷新页面、前进、后退都不会自动重新post数据,会出现警告。
例如:
代码如下 | 复制代码 |
$array = array("name" => "Eric","age" => 23); |
程序将打印出 :
{“name”:”Eric”,”age”:23}
再看下面的例子:
代码如下 | 复制代码 |
$array = array(0 => "Eric", 1 => 23); |
程序将打印出 :
["Eric",23]
这样就可以将 json 转换成数组形式了,key 保持原来格式
代码如下 | 复制代码 |
$json = ’{"name":"zhangsan","age":20,"sex":"nan"}’; print_r(json_decode($json,true)); |
这样的json数据解析后 就会成为下面这样的数组
Array
(
[name] => zhangsan
[age] => 20
[sex] => nan
)
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()释放锁。
文件锁是针对文件的锁,除了这种释义,还可以理解为用文件作为锁。在实际工作中,有时为确保单个进程的执行,我们会在程序执行前判断文件是否存在,如果不存在则创建一个空文件,在进程结束后删除这个空文件,如果存在,则不执行。
在php中表单提交数据有几种,一种是post和get方式,下面我来给各位php初学者详细介绍利用get,post来接收表单提交数据实例用法,有需要了解的朋友可参考。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 /> |
相关文章
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 举一个案例:复制代码 代码如下:<?phpclass Downfile { function downserver($file_name){$file_path = "./img/".$file_name;//转码,文件名转为gb2312解决中文乱码$file_name = iconv("utf-8","gb2312",$file_name...2014-06-07
- 这篇文章主要为大家详细介绍了Visual Studio 2015下载和安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 本文介绍基于nodejs+express+art-template的留言板功能。包含列表界面、添加界面和发送留言功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-21
- 我要实现的就是下图的这种样式,可参考下面这两个网站的留言板,他们的实现原理都是一样的畅言留言板样式:网易跟帖样式:原理 需要在评论表添加两个主要字段 id 和 pid ,其他字段随意添加,比如文章id、回复时间、回复内容、...2015-11-08
- 本文就是和大家分享一款由php结合ajax实现的无刷新留言板,先给大家看一下最后的效果图:数据库连接代码如下: <?php$conn = @mysql_connect("localhost","root","root") or die ("MySql连接错误");mysql_select_db("d...2015-10-30
- 有很多人在做微信的扫一扫下载。但是在微信更新之后微信将该功能给禁止掉了,也不能说是全面禁止吧,因为腾讯、微信是一家嘛,通过应用宝审核的应用好像还是可以通过扫一扫直接下载的,下面通过本篇文章给大家介绍微信扫一扫下载app的代码片段,感兴趣的朋友一起看看吧...2016-01-02
- 这篇文章主要介绍了Javascript前端下载后台传来的文件流代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-19
- 一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件.但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载...2014-06-07
- 这篇文章主要为大家详细介绍了C#开发教程之FTP上传下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了python3.8下载及安装步骤详解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-04-27
【详解】Android远程http下载和动态注册第三方so lib库教程
本教程我们为您介绍Android的第三方库so lib库如何远程http下载和动态注册,远程下载so库主要解决的是下载so存放的位置及读写权限,大家可以参考一下。 一、背景...2016-09-20- 这篇文章主要为大家详细介绍了springboot+vue实现文件上传下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-18
- 这篇文章主要为大家详细介绍了Vue实现简单的留言板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-10-22
- 这篇文章主要介绍了Go语言实现简单留言板的方法,涉及数据库、模板页面元素等留言板相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-03
- bom头其实是一个非常可恶的东西,有时因为bom头导致页面乱码之类的问题,但有的时间加bom头是必须的,下面我们来看一个PHP 下载文件时自动添加bom头的方法,希望文章对大家有...2016-11-25
Spring Boot使用GridFS实现文件的上传和下载方式
这篇文章主要介绍了Spring Boot使用GridFS实现文件的上传和下载方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-23php 超大文件下载程序[http 缓存协商,Etag标记,断点续传]
<?php教程 002 $file_path = './download/download_cn.rar'; 003 004 //使用方法 005 downFile($file_path); 006 007 // 服务器文件路径,下载文件名字(默认...2016-11-25- 这篇文章主要介绍了JavaScript实现图片合成下载的示例,帮助大家更好的理解和学习JavaScript,感兴趣的朋友可以了解下...2020-11-19
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
这篇文章主要为大家介绍了个人网站的留言页面,前端使用jQuery编写、后台利用php简单读写MySQL数据库,感兴趣的小伙伴们可以参考一下...2016-05-05