《经典PHP留言本教程》由会员分享,可在线阅读,更多相关《经典PHP留言本教程(7页珍藏版)》请在金锄头文库上搜索。
1、教程连载 1:PhpChina 留言本实例在第一期中,我们来一步一步实现一个最基本的留言本。留言信息包括留言者,留言内容, 留言时间,留言者 IP。(本文假设你已对 HTML 以及 PHP 语法比较熟练了)第一步:设计数据库新建一个数据库,打开 phpMyAdmin,新建一个数据库 gb,下面整理选择 utf8_general_ci,然后在数据库中建一个表 message,字段数为 5:字段名类型长度属性额外其他idint10unsignedauto_increment主键usernamechar100contenttexttimeint10unsignedipchar15然后下面数据库类型选
2、择 MyISAM(各个类型的优缺点请查看 MYSQL 手册),整理选择utf8_general_ci。每个字段的含义:id - 留言的编号,类型为整数型,长度是 10,属性选择为 unsigned 是表明这个字段是无符号字段,不会有负数,所以可以存取的范围会增加一倍(因为如果原来的范围是 -9 到10,那么设置为 unsigned 后范围则变为 0 到 19),额外设置为 auto_increment,表明这个字段是自动增加的,我们不用管插入数据时它是啥值,它会自动在最大的 id 的基础上自动加 1,其他设置为主键。username-留言者的名字,类型为字符型(关于 char 与 varcha
3、r 的区别请查看MYSQL 手册),长度为 100(正常人用户名不可能超过 100 吧,其实应该尽量减少长度, 提高性能,节约空间)content-即留言内容,类型为 text(text 和 blob 的唯一的区别在于 text 不区分大小写,而 blob 对字符的大小写),text 类型可以存足够多的数据,足够存好几篇文章了,此类型不能设置长度,否则报错。time-即发布留言的时间,类型为 int,长度为 10,保存的数据格式是 UNIX 时间戳(即用 PHP 函数 time()得到的 10 位数字),而不存 xxxx-xx-xx 这样的格式,为何这样后面或解释。ip-即留言者的 IP,格式
4、为 xxx.xxx.xxx.xxx ,总共 15 个字符,所以长度设置为 15。第二步:设计界面在这我们直接偷蓝色理想的 BXNA 的界面( )HTML 和 CSS 的东西就不详细讲了,不然写 10 期也写不完这个留言本了 (在 code 文件夹中有一个 html 文件,是单独分离出来的)第三步:开始写程序咯先要想好程序的整体构架,代码执行的流程等。先说一下我们做的这个程序的整体运行流程:程序是根据不同的 URL 参数(参数 m 和参数 a)来调用不同的模块文件里的不同函数。比如URL 是 index.php?m=user&a=info,则程序会先包含 mod_user.php,并调用里面的函
5、数user_info();,这个函数会返回一段 HTML(不会直接输出,因为我们要用到 smarty,最后一次性输出)或跳到别的页面。所有的请求都是从index.php 这个入口开始,mod 文件不能被直接调用。下面开始写程序入口部分:首先建立一些引用的文件,放在 includes 文件夹下,比如一些常量 config.inc.php,所有函数 function.inc.php,后缀为 PHP,这样通过浏览器直接访问这些文件将看到空白(没有输出)。在 config.inc.php 中定义 5 个常量:define(DB_HOST , localhost); define(DB_USER , r
6、oot); define(DB_PASSWORD , 12345);define(DB_NAME , gb);define(IN , true);function.inc.php 用来存放自定义函数。/数据库地址/数据库用户名/数据库密码/数据库名/设置一个常量,可以判断 mod 文件是否被非法调用在这一期中总共有 3 个自定义函数。具体代码请查看文件,有详细注释。print_mysql_error显示数据库错误信息,并终止脚本get_client_ip show_result_page取得用户 IP显示结果页面,返回 HTML把 smarty 文件夹全拷过去。(在后面会讲到简单用法)erro
7、r_reporting(E_ALL);/打开所有错误报告,这个是为了调试时用,程序完成时可以把它设置为比较低的级别。header(Content-Type: text/html; charset=utf-8);/设置 http 头,因为 MYSQL4.1 以后有编码问题,没弄好的话会出乱码,在这强行定义文件编码, 和数据库设置的编码一致然后建立首页 index.php 文件,具体代码请看附件中的对应文件。其中比较重要的一些地方。$mod_list 是一个数组,包含合法的模块名(对应 URL 中的参数m),实现根据 URL 中不同参数调用对应的功能模块。在这一节中,我们只包含两个模块,即 mai
8、n 和 add ,用来显示留言和添加留言。根据不同的$_GETm,调用不同的 mod 文件。然后根据不同的$_GETa,调用不同的函数。比如$_GETm = main ,$_GETa = up ,则包含文件 mods/mod_main.php,并调用这个文件里的 main_up()函数,来执行相应功能,比如显示留言。默认调用 main_page()函数。后面有个使用 smarty 来实现 HTML 和 PHP 的分离,这样有利于美工和程序员协同工作。如果你没有用过 smarty 或其他模板类也不用担心,我们会在后面介绍基本的用法。但如果你想学好它,建议去它的官方站看看,并下载一份手册。( )由
9、于针对初学者,在这我们就不使用 MYSQL 的类了,而直接使用 PHP 中自带的函数。如果你现在直接访问 index.php,他会提示 mod_main.php 文件不存在。(因为默认是调用这个文件)下面开始写模块部分assign(message , $message_array);/替换模板变量elseprint_mysql_error();/格式化输出数据库错误return $smarty-fetch(message.tpl);建立一个文件夹名为 mods,用来存放所有模块文件。建立我们需要的 mod_main.php 文件。具体代码:id= $rsid,username= $rsuser
10、name,content= $rscontent,timeip= date(Y-m-d H:i:s , $rstime),= $rsip,);mod_main.php 的主要流程:if(!defined(IN) die(Access denied);这个用来确认该文件是否是被 index.php 文件包含( 因为 index.php 包含了config.inc.php,而 config.inc.php 里定义了常量 IN),如果 IN 常量没被定义,证明不是被 index.php 包含的,则结束脚本,并输出Access denied。这是一个常用的防止一个文件被直接调用的方法。先执行查询 SE
11、LECT * FROM message ORDER BY id DESC意思即查找 message 表中所有数据的所有字段,并按 id 字段倒序排列。然后判断 mysql_errno()是否为 0,不为 0 则证明有错误,则用 print_mysql_error() 函数输出错误信息,并结束整个代码。如果没有错误,则用 while 循环取得信息(一条留言循环一次)。在循环中,先定义一个空数组 $message_array = array(); ,然后每循环一次,往这个数组中插入另一个数组,组成一个二维数组。存的都是留言信息。循环完后$smarty-assign(message , $messa
12、ge_array); 即把$message_array 变量赋予smarty 中的 message ,用来做模板里的 替换( 即把模 板里的 $message 部分替换为$message_array 变量的值)。最后 return $smarty-fetch(message.tpl); 即取得 message.tpl 模板的信息,替换模板变量后并返回。#section name=k loop=$message#/section#打开 template/bxna/message.tpl 文件可以发现这样一段代码,它的意思即循环输出,$message 不是一个数组么,即循环输出这个数组。其中#$m
13、essagek.username# 这个意思是指这里要替换的内容是 $message 变量中的 username,即用户名。其它几个变量也一个道理。循环的具体用法请参考 smarty 手册。最后 fetch (即取回嘛)整个 HTML(已经把所有模板变量替换完成),返回给 index.php里的$main_body。到这不知道大家是否了解 smarty 的工作流程了呢?1. 初始化 smarty2. 用$smarty-assign 设置要替换的变量,第一个参数是模板要被替换的部分。3. 用$smarty-fetch 取回替换完后的模板(HTML),或用 display 直接输出。在模板中 smarty 有几个基本语法,其实和 php 中差不多(边界符可以在初化时定义):1#if $var#show something#else#show other thing#/if#2上面提到的循环结构 se