PHP留言板制作教程.docx
《PHP留言板制作教程.docx》由会员分享,可在线阅读,更多相关《PHP留言板制作教程.docx(16页珍藏版)》请在冰点文库上搜索。
PHP留言板制作教程
PHP【留言板】案例教程-前言
网络上各种各样的PHP教程和各种各样的留言板都是铺天盖地的,战地为什么要自己写一个这样的PHP留言板教程呢?
问的好啊!
鼓掌。
首先战地写这个PHP教程的目的不是为了做一个留言板,如果你需要一个留言板的话我建议你去Google搜索一下免费的、功能强大的、功能齐全的、漂亮的到处都是。
目的是:
从一个简单的实际的案例出发,来让想学习PHP的兄弟姐妹们进入PHP的世界。
需要说明的是,既然是实际的案例教程,各种各样的知识都会涉及到(以保证各位遇到更多的问题),阅读这个教程的时候你最好了解一点Html和javascript的知识,因为在教程中将不作为重点来说。
因为我们是PHP教程。
好了,现在说说我们将要设计的知识和这个留言板将要实现的功能:
功能需求:
利用PHP+Mysql数据库制作一个基本的留言板能够让客户进行留言,管理员可以对留言进行修改、删除、回复等操作。
涉及到的技术:
PHP后台处理程序、javacript客户端技术、Mysql数据库的基本操作,另外战地假设你已经架设好了PHP+Mysql的开发环境。
如果需要配置开发环境的帮助,请参考:
《Windows平台下PHP环境配置之Apahce安装篇》、《Windows平台下PHP环境的配置之Mysql篇》、《Windows平台下PHP环境配置之PHP安装篇》等相关文章。
该案例教程中所涉及的PHP内容:
1.PHP程序的基本写法和注意事项;
2.变量的定义和销毁;
3.PHP数组的定义和基本使用方法;
4.字符串的处理;
5.客户输入信息的验证;
6.PHP编程语言的流程控制;
7.session会话的基本应用;
8.PHP链接Mysql和对Mysql的增删改查;
9.PHP+mysql的分页技术和原理(重点)。
……
大部分在利用PHP+Mysql进行Web编程过程中所常用的方法。
第一章为留言板设计数据库
好了今天我们开始我们PHP入门案例教程,PHP留言板的第一步,为我们的留言板设计一个数据库。
根据《PHP入门案例教程【留言板】前言》中的大致需求,我们需要在数据库中建立三个表:
一个(post)存储留言内容,一个(guest)存储留言人的信息,另一个(revert)存储管理员的回复信息。
好了现在详细说说,首先创建一个数据库GuestBook
创建数据库代码:
1
2
CREATEDATABASE`GuestBook`DEFAULTCHARACTERSETutf8COLLATEutf8_general_ci;
存储留言信息表post创建脚本:
1
2
3
4
5
6
7
CREATETABLE`guestbook`.`post`(
`id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'post主键自增序列',
`guest_id`VARCHAR(11)NOTNULLCOMMENT'发布人id',
`post`TEXTNOTNULLCOMMENT'发布内容',
`post_time`VARCHAR(14)NOTNULLCOMMENT'发布时间',
PRIMARYKEY(`id`)
)ENGINE=MYISAM
存储留言客户信息表guest创建脚本:
1
2
3
4
5
6
7
CREATETABLE`guestbook`.`guest`(
`id`INT(11)NOTNULLCOMMENT'客户自增id',
`name`VARCHAR(16)NOTNULLCOMMENT'客户名称',
`email`VARCHAR(60)NULLCOMMENT'电子信箱',
`qq`VARCHAR(11)NULLCOMMENT'QQ号码',
PRIMARYKEY(`id`)
)ENGINE=MYISAM
存储回复信息表:
revert创建脚本:
1
2
3
4
5
6
7
CREATETABLE`guestbook`.`revert`(
`id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'自增id',
`post_id`VARCHAR(11)NOTNULLCOMMENT'留言id',
`revert`TEXTNOTNULLCOMMENT'回复内容',
`revert_time`VARCHAR(14)NOTNULLCOMMENT'回复时间',
PRIMARYKEY(`id`)
)ENGINE=MYISAM
可以看出在post表中存储了客户的Id(其实这个设计本身不适合咱们系统,咱们应该存储的是用户的名称,但是为了接触更多的PHP函数还是这样设计吧),通过这个Id可以和客户表guest进行关联,revert表中存储了post_id顾名思义就是留言表中的主键Id,这样我们也可对这两表进行关联操作。
第二章处理留言信息
在本章和随后的第三章我们将会说的知识点:
1. PHP的基本语法——知道怎么写就行了,不作为重点;
2. PHP处理form表单内容,保存到数据库;
3. 数据库的链接和插入等操作;
4. 转义函数的使用。
……
在本章开始之前战地为此做了很多工作,诸如:
设计了一个简单的留言板的模板,如果你不想自己设计的话就点击,留言板模板下载,直接用我这个就行了。
如果想让用户留言,那么必须就要给用户一个留言的入口。
我们这里的入口就是模板页面下边的表单了—-其它的PHP代码我们暂且不管。
可以看到,表单上有四个表单域:
姓名
Email
QQ
留言内容
关于这个输入留言内容的框框更多的属性值可以参考留言板模板文件中的相关部分。
以上这些表单包含在一个属性为这样的form中
其中action一项是指把表单内容提交到哪一个处理页面,method是指用什么方式提交表单内容。
我们把处理页面定义为post.php,这个就是我们将来马上就要编写的PHP代码页面程序;
提交表单内容一般用post方法——因为post的方法能够提交更大的更多的内容,并且相对于get方法似乎更加安全一点。
在开始我们的PHP代码之前,还有一些问题要说就是如何使你的留言板更加安全。
在模板里我已经实现了对输入内容的js验证——这道屏障几乎没有什么作用,我们也不是讲js的所以有兴趣的朋友看看就行了。
这个问题你可以点击这个链接《关于PHP代码安全性问题的建议》了解更多内容。
既然已经说道安全问题了,那么我们就开始我们的代码吧。
在开始这段之前,我已经实现了这个post.php的程序,大家可以点击这里 post下载这个页面。
大家可以看到所有的PHP代码都需要写在
php和?
>之间,这一对符号就是声明给PHP解析器看的——意思是从
php这里开始,到?
>这里结束,是PHP代码需要PHP解析器进行解析。
第二个问题是重点,我们如何利用取得form表单提交上来的内容。
上文已经说过我们用post方法提交表单给post.php也就是我们当前的页面,所以我们需要用PHP的$_POST数组,这个数组里面保存了从form表单提交上来的所有内容,包括我们的两个按钮其实也在里面。
如果你对PHP数组还不了解的话,请参考PHP手册或者关注PHPiask随后推出的PHP数组函数详解。
如何得到我们提交上来的值,得到$_POST[‘name’]这个值就是表单提交上来的姓名一个文本域,数组的name索引是表单的name属性,如果表单的name=”email”那么$_POST[‘email’]里面就是email的值。
其中$这个是PHP变量必须要有的,例如我们可以把$_POST[‘name’]的值赋给$name,可以这样写:
$name=$_POST[‘name’];
这里我们就定义了一个变量$name并且赋值$_POST[‘name’]给他。
——这就是PHP变量定义和赋值,我们的基础知识,很简单是不是,是的很简单,对于PHP一切事情都很简单。
如何能够看到POST的所有内容呢?
其实很简单,用var_dump($_POST)格式化输出一个数组就行了。
知道了如何得到表单提交上来的值,如何访问这些值。
那么我们就开始我们的第一个处理流程,如何验证用户提交上来的留言信息。
首先我们的验证要求是:
用户名:
长度不能大于10个字符,不能为空。
Email:
符合电子邮箱的格式,长度不能超过60。
QQ:
5-11位的数字
留言内容:
不能超过400个字符
具体的验证过程请参看post.php文件的数据库连接注释前的处理流程(点击这里下载post.php文件)。
第三章处理留言信息所用到的PHP函数
这一章我们重点说一下PHP验证信息数据内容的时候,用到的函数。
首先在第一行我们发送了一个网页头信息:
header(’content-type:
text/html;charset=utf-8′);
用来告诉程序我们的脚本将返回什么格式的数据,和返回数据的字符集。
这个地方很重要,如果没有这样的语句,你将会在IE里面看到返回的乱码,或者根本就没有办法执行(收到一个js的错误)。
第二个值得注意的是:
if(!
get_magic_quotes_gpc()){
foreach($_POSTas&$items){
$items=addslashes($items);
}
}
注意这段代码中的一个!
(叹号)是什么,如果不明白请参看手册——运算符一章。
这一段代码中get_magic_quotes_gpc()是一个PHP的内置函数,作用是得到PHP.ini配置文件中magic_quotes_gpc的值,如果在配置文件中是On则这个函数返回1,如果是off则返回0。
我们之所以有这么一个判断就是为了判定PHP解析器是否为数据加上了自动转义,如果没有加上我们就执行foreach语句自己添加转义。
下边说说如何利用foreach来巧妙的修改数组中的值。
foreach通常的作用就是用来遍历数组的,通常的写法是:
foreach($Arrayas$item){
……
}
as前的变量必须是一个数组,as后边的变量表示这个数组中当前元素的值,这个循环一直会持续到数组的最后一个元素——其实也可以用for循环实现,看看大家是否有这个时间了就。
相对于这个通常写法,我们在程序中的写法似乎有点怪异,在as后边的变量前加上了一个引用符号&以此表示地址引用,如果这时候如果修改$items的值就相当于修改了数组元素的值。
在PHP系统没有加上自动转义的情况下,我们就是利用这个方法将表单post过来的值一一的加上转义符的。
addslashes函数,这个函数的作用是为了数据库的需要在某些字符前加上反斜线以保证数据库语句或者其他语句不会出错,这些被加上反斜线的字符是:
单引号(’)、双引号(”)、反斜线(\)与NUL(NULL字符)
在magic_quotes_gpc=On的情况下,我们不需要也不要用这个函数,如果使用的话会造成重复转义——PHP和你自己都做了这件事儿,当然重复了!
所以使用这个函数前一定要加上if(!
get_magic_quotes_gpc())的判断。
在这些判断中还使用到了,strlen函数——得到字符串长度的,ereg函数——正则表达式的,is_numeric判断一个变量是不是全数字的函数,这些函数使用起来都相当简单就不说了,当然也有其实不简单的ereg这个不是函数本身不简单,所谓的不简单是他的参数正则表达式。
当然也用到了PHP的定界符”<<<”,有兴趣的兄弟可以参考PHPiask的《PHP中的定界符》这里详细的说明了PHP定界符的使用方法和注意事项。
在本章中我们只对数据做了应该做的处理,下一章将会说到Mysql数据库的链接,和如何将留言信息保存到数据库中。
第四章将留言信息保存到数据库
在以上的章节中我们知道了如何将form表单中的数据传递给PHP处理程序,以及应该怎样对待这些用户提交上来的数据,并对数据做了相应的处理。
如果你是偶然的来到这里,那么请回头阅读以上章节。
本章将说明如何将这些已经处理过的数据保存到Mysql数据库中。
保存数据到数据库中的流程是这样的(假设你的数据库和数据表已经创建):
1.创建一个数据库连接
2.发送一些不是必须的语句
3.选择一个存储的数据库
4.编写数据库插入语句
5.发送这个语句
详细的分析也就这么五个步骤了,那么我们开始第一步吧,利用PHP提供的内置函数mysql_connect来创建一个数据库链接,这个函数需要三个参数,格式如下:
Mysql_connect(‘数据库所在的主机’,’链接数据库的用户名’,’链接数据库的密码’)。
这个函数返回一个数据库连接资源号。
看我们在post.php中的链接代码:
1
2
3
$con=mysql_connect('localhost','root','root')ordie('链接数据库失败!
');
mysql_query('setnamesutf8');
mysql_select_db('GuestBook');
第一行创建一个数据库连接,把资源号赋给变量$con,如果连接失败,结束程序的执行输出提示信息“链接数据库失败!
”。
第二行发送一个字符集设定语句,让数据在数据库中的出入都使用utf8字符集。
这个语句是可有可无的,其中的语句可以写成setnamesgbk或者setnamesgb2312等等我们需要的字符集。
第三行利用PHP提供的mysql_select_db函数来选择我们要使用的数据库。
值得注意的是,mysql_query这个函数本身有两个参数:
第一个参数就是我们要发送的数据库执行语句sql,第二个参数是数据库连接的资源编号,如果第二个参数没有指定的话,那么程序就会查找最近一个链接资源,也就是说这个参数不是必须的。
我们以上包括将来的写法都是没有第二个参数的,按照程序的上下文我们第二行的语句可以写作:
mysql_query(“setnamesutf8”,$con)这样也是正确的。
这个函数的返回值是布尔型的,如果语句成功执行就返回true否则返回false——了解这一点很重要。
好,到此为止我们的数据库连接已经就绪,开始组装我们的sql插入语句,看一下代码(post.php第67-76行):
1
2
3
4
5
6
7
8
9
10
$insertSql="insertintoguest(name,qq,email)values('$name','$qq','$email')";
if(mysql_query($insertSql)){
$guestid=mysql_insert_id();
}
else{
echo$insertSql;
echomysql_error();
echo"数据插入失败!
";
exit();
}
在这个片段的第一行中我们组建了一个sql的插入语句,这个看来没什么可说的,唯一点就是把变量写进这些语句并且用引号包裹起来——对于数字型的不需要引号。
第二句发送语句,并判断是否被成功执行。
这个地方需要说明:
PHP中if判断中的语句是会被执行的,例如if($c=$a+$b)这样的语句被执行的顺序是,先计算里面的语句然后再对结果作出判断。
所以执行之后$c的值是$a,$b之和,判断的时候是对$c作出的判读。
所以在这个地方if判断的是mysql_query($insertSql)的返回结果,语句已经发送到了数据库。
第三行出现的函数mysql_insert_id——获取最近一次插入数据的时候自增序列的值,我们这里获取的是guest表中的id,因为只有这个id才是自增的。
以备后用。
这个片段的第五行到最后都是进行的错误处理,如果语句没有被成功执行,那么就执行这些程序,倒数第二行的exit();函数的意思是终止程序向下执行。
这时候我们已经把guest信息保存到了Mysql的GuestBook的guest表中了。
在post.php文件的79行出现的time()函数我们暂时不说,等到说到显示留言信息的时候重点表述一下PHP的时间函数。
保存留言信息到post表中的过程类似与此,咱们还是就不要罗嗦了吧。
好了这时候我们来填写留言信息,点击提交按钮,就会受到一个“留言成功”的提示,并且我们的留言板的首页上页显示出了这条信息,多么顺利啊我们!
!
第五章从数据库中读取留言记录
既然数据都存储到数据库了,如果读不出来确实让人很难为情——把自己的钱锁进一个打不开的抽屉,确实很难受!
这也不是我们的目的是不是?
和插入数据的流程一样:
首先要建立一个数据库链接,发送一个字符集设置语句,选择一个数据库,编造一个数据库查询语句,执行这个语句,而后就不一样了,嘿嘿……
还是看Index.php文件的1-21行吧,我们来详细解释一下:
第一行:
我们暂时先不说,留到以后再说,暂时还用不到;
第二行——第五行:
大家一定很眼熟吧,是的这里和post.php插入留言信息的时候的过程是一样的,也就不多说了。
7、8、9和19行我们暂时不说,这里是涉及到分页的,我们将会留到下一章详细的说明这个问题,因为分页的过程在web编程过程中几乎是一个必须要使用的功能。
在11-15行我们定义了一个数据库查询语句,在这条语句中我们用了leftjoin…on..语句,关于这个语句的详细用法请参看Mysql手册联合查询部分。
。
看第16行,
$numRecord=mysql_num_rows(mysql_query($sql));
这个语句中我们用mysql_query($sql)把我们定义的sql语句发给数据库来执行,这个语句执行以后会返回一个记录资源号,我们用外层的mysql_num_rows来取得有多少个匹配的记录——也就是返回的记录总数。
第17行我们用到了ceil函数,这个函数的功能是,进一法取整,也就是说两个数进行除法操作之后只要余数大于零整数部分就加一然后舍去小数部分,所以ceil(1/2)的结果是1,而不是我们通常所见到的0.5。
这个对于我们来说很有用——也留到下一章分页的时候再说吧。
第19行,涉及到分页部分。
但是这一行值得说的是,在PHP中字符串的相加,也就是字符串的连接。
两个字符串相加的操作符是点,看例子:
$strFirst=”中国”;
$strTwo=”伟大的国度”;
$strSum=$strFirst.$strTwo;
echo$strSum;
输出的结果正如我们所料到的一样:
中国伟大的国度。
第20行:
我们发送一个带分页功能的sql语句到数据库执行,并把执行结果赋值给$result;
接着我们看,本页函数的第:
128-154行,这个程序的片段功能是循环输出在数据库中查询到的记录。
这是我们本章的重点:
看PHP的内置函数mysql_fetch_object()从结果集中取得一行作为对象,关于PHP的对象我们在高级编程栏目中将会详细的说明,我们这里只需要知道这种循环查询记录的方式,需要用$对象->字段名来访问就行了,执行起来的时候就是每一次指针下移一次,当遇到没有更多的记录的时候就返回一个false所以我们可以用while循环来读取$result的这个记录集。
最终形成了while($rs=mysql_fetch_object($result))这个语句,循环调用mysql_fetch_object函数并且把每次返回的对象赋值给$rs变量,现在哦我们看这个循环的内部,我们可以用$rs->name来取得留言人姓名,用$rs->post_time来访问留言时间。
在显示post_time的时候我们做了一些处理,使用到了date()函数,记得我们存储留言的时候用到了time()函数,这个函数返回的是一个时间戳,就是从1970年的第一秒起到现在已经经过的秒数(格林尼治时间)。
而date函数就是把这个秒数翻译为我们所需要的时间格式,返回怎样的字符串需要们在date()函数的第一个参数中制定,该函数的第二个参数如果没有给出,也就是需要翻译成时间格式的秒数没有给出的话,他就会以当前时间来翻译。
Date(“Y年m月d日H:
i:
s”),输出结果就是2009年4月26日11:
16:
20。
我们在index.php的132行有这样的写法:
phpechodate(”Y-m-dH:
i:
s”,$rs->post_time+8*3600)?
>
我们具体说说这个,我想大家一定会对8*3600这个地方感到奇怪,其实原因很简单。
咱们用time()函数存储时间的时候用的是格林尼治时间,这个时间和我们的时间相差刚好八个小时,每个小时3600秒,我们处在东方比西方的时间快所以要加上的。
记住我们用的是北京时间——处在东八时区哦,这个是常识!
关于这一点还有一个做法,这将会在专门阐述PHP的日期函数的文章里详细说明。
144和146行都用了两个函数htmlspcialchars和nl2br,其中htmlspcialchars这个函数是为了避免用户输入的脚本代码(html和javascript)被执行而必须的,这个函数很重要。
如果没有这个函数用户输入的js代码和html代码都会被作为页面程序的一部分被执行,这一点我们在《关于PHP代码安全性建议》一文中已经说过,不在赘述。
nl2br这个函数的作用是讲数据中的\n换行转换成html的换行
以便于页面表现。
在我们输入留言信息的时候,用的这个表单,保存信息的时候,换行使用\n来表示的所以我们这里需要转换,以保留用户输入信息在显示的时候我输入时段落一致。
好了本章的就此打住,下一章说如何利用PHP+Mysql分页显示内容,以及分页链接的使用。
本章的内容逻辑性相对比较强一点,加上战地的表现能力有限,如果兄弟们实在不明白的话,可以留言给我,战地定不遗余力尽我所能!
第六章在PHP+Mysql中分页显示留言内容
关于我们留言本的分页过程,如果你看了第五章的话,就知道其实战地已经实现了这个功能。
只不过限于篇幅的原因,另外战地也想把他拉出来单独的加以说明,所以就有了这篇文章,如何分页显示留言本信息内容。
分页的关键问题其实在于Mysql的一个关键字limite这个关键字后边跟的两个数字,第一个是需要记录的开始行数,第二个数字是从这个开始行数后取得几行记录——这一点大家不要误以为是从第几行开始到第几行结束,相差很远的。
看看我们index.php的第19行:
$recordSql=$sql.”LIMIT“.$page*$pagesize.”,”.$pagesize;
其中变量$page的判断在程序的第8行和第9行得到的:
if(isset($_