'使用PHP编写留言板'

PHP留言板结构

1.新建Message类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Message{
public $name;
public $time;
public $content;

function __construct($n,$t,$c){
$this->name=$n;
$this->time=$t;
$this->content=$c;
}

function show(){
echo "Name: ".$this->name."<br />";
echo "Time: ".$this->time."<br />";
echo "Content: ".$this->content."<br />";
echo "==========================================="."<br />";
}
}

Message对象包含3个属性,name、time、content,分别是留言用户名,留言时间、留言内容。
在创建对象时,构造函数使将值赋给对象的3个属性。
show()方法则是显示留言内容。

2.新建MessageBoard类

上图左边是MessageBoard类的结构。
MessageBoard类包含1个属性,messages。messages的数据类型是数组,其中存放了所有的留言。
MessageBoard类包含5个方法,showForm()、saveData()、loadData()、showAllMessages()、showForm()。
这5个方法的具体作用写在下面。

2.1显示页面

2.1.1showForm()

1
2
3
4
5
6
7
function showForm(){
echo "<form action=' ' method='POST'>";
echo "Name: "."<input type='text' name='userName'>"."<br />";
echo "Content: "."<input type='text' name='content'>";
echo "<input type='submit'>";
echo "</form>";
}

showForm()方法用于显示留言板的表单,通过echo输出HTML语句标签显示表单,表单提交的方式为POST。

2.1.2showAllMessages()

1
2
3
4
5
function showAllMessages(){
foreach($this->messages as $m){
$m->show();
}
}

showAllMessages()方法用于输出留言内容。上面说过messages的数据类型是数组,所以使用foreach()循环输出数组内容,messages中的元素属于Message类,所以使用自身的方法show()来显示留言内容。

2.2留言的接收和读取

2.2.1receiveMessage()

1
2
3
4
5
function receiveMessage(){
if (count($_POST)!=0){
$this->saveData($_POST['userName'],date("Y-M-D h:i:s",time()),$_POST['content']);
}
}

receiveMessage()方法用于接收留言,如果收到留言则使用saveData()方法将留言存储起来。

2.2.2saveData()

1
2
3
4
5
function saveData($u,$t,$c){
echo "UserName: ".$u."<br />";
echo "Time: ".$t."<br />";
echo "Content: ".$c."<br />";
}

此时的saveData()方法只是用于测试整个留言板是否正常工作,还没有连接数据库,所以无法将数据存储在数据库中。只是将要存储的内容显示在页面上。

2.2.3loadData()

1
2
3
4
5
6
function loadData(){
$temp=new Message("chessur","2019.3.26","Hello World!");
array_push($this->messages,$temp);
$temp=new Message("Andy","2019.3.26","Hello chessur");
array_push($this->messages,$temp);
}

和saveData()方法一样,此时的loadData()也只是测试阶段。使用$temp存储留言,使用array_push()函数将留言存放在messages数组中。

3.数据库

数据库中的数据结构

上图的左边是DB类的结构,database属性和构造函数。具体内容写在下面。
上图的右边是数据库中数据表的结构,4个字段:ID、name、time、content,分别表示留言发表顺序、留言者、留言时间、留言内容。

3.1数据库建立&数据表建立

使用PHPMyAdmin的图形化界面建立数据库以及数据表

3.1.1数据库建立

3.1.2数据表建立

3.2连接数据库

3.2.1创建DB类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class DB{
public $database=null;

function __construct(){
//connect
$dbhost="localhost"; //127.0.0.1
$account="root";
$password="root";

$this->database=mysql_connect($dbhost,$account,$password);
if($this->database){
echo "DB connected.";
}else {
echo "DB connect failed.";
}

$result=mysql_select_db("db_messages",$this->database);
if($result){
echo "DB select successed.";
}else{
echo "DB select failled.";
}
}

function __destruct(){
//disconnect
mysql_close($this->database);
}
}

DB类的两个方法分别是构造函数和析构函数。
构造函数在对象实例化时执行,其中包含mySQL数据库的配置信息:IP地址、账户、密码。使用PHP自带的mysql_connect()函数连接mySQL数据库,使用PHP自带的mysql_select_db()函数选择数据库。
析构函数在将对象销毁时断开与mySQL数据库的连接,同样适用了PHP自带的mysql_close()函数。

3.2.2MessageBoard继承DB

1
class MessageBoard extends DB

通过继承DB类,使MessageBoard类可以使用DB类中的方法和属性。

在继承父类后,子类可以使用父类的属性和方法,但是因为子类已经声明了自己的构造函数,所以无法直接继承父类的构造函数,可以使用下面的代码来继承父类的构造函数。

1
parent::__construct();

3.3数据库的读写

3.3.1SQL语法

1
INSERT INTO `all_messages`(`name`,`time`,`content`) VALUE('chessur','2019-3-24','Hello World')
1
SELECT * FROM `all_messages`;

INSERT INTO是向数据库中插入数据
SELECT是从数据库中选择数据

3.3.2saveData()

1
2
3
4
function saveData($u,$t,$c){
$query="INSERT INTO `all_messages`(`name`,`time`,`content`) VALUE('".$u."','".$t."','".$c."')";
mysql_query($query);
}

在连接了mySQL数据库后,我们可以将savaData()方法改写为真正的方法,而不再只是测试的作用。
mysql_query()函数可以执行一条mySQL语句。

3.3.3loadData()

1
2
3
4
5
6
7
8
9
function loadData(){
$query="SELECT * FROM `all_messages`;";
$result=mysql_query($query);
while($row=mysql_fetch_array($result)){
$temp=new Message($row['name'],$row['time'],$row['content']);
array_push($this->messages,$temp);
}

}

$query中的mySQL语句是选择表中所有数据,使用mysql_query($query)找到所有数据后,将全部留言放入messages这个数组中,完成留言数据的加载。

4.mysql函数

4.1mysql_query()

mysql_query() 函数执行一条 MySQL 语句。

1
mysql_query(query,connection)
1
mysql_query($query)

4.2mysql_connect()

mysql_connect() 函数打开非持久的 MySQL 连接。

1
mysql_connect(server,user,pwd,newlink,clientflag)
1
mysql_open($this->database)

4.3mysql_select_db()

mysql_select_db() 函数设置活动的 MySQL 数据库。
如果成功,则该函数返回 true。如果失败,则返回 false。

1
mysql_select_db(database,connection)
1
mysql_select_db("db_messages",$this->database)

4.4mysql_close()

mysql_close() 函数关闭非持久的 MySQL 连接。

1
mysql_close(link_identifier)
1
mysql_close($this->database)

4.5mysql_fetch_array()

mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有

1
mysql_fetch_array(data,array_type)
1
mysql_fetch_array($result)

4.6SELECT

SELECT 语句用于从数据库中选取数据。

1
2
3
4
SELECT column_name,column_name
FROM table_name;

SELECT * FROM table_name;
1
SELECT * FROM `all_messages`;

4.7INSERT INTO SELECT

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。

1
2
3
4
5
6
7
INSERT INTO table2
SELECT * FROM table1;

INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;
1
INSERT INTO `all_messages`(`name`,`time`,`content`) VALUE('".$u."','".$t."','".$c."')

5.缺陷

1.没有删除功能。

2.刷新页面时表单会重复提交。

3.时间显示不正确。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*date()函数参数*/
d - 一个月中的第几天(从 01 到 31)
D - 星期几的文本表示(用三个字母表示)
j - 一个月中的第几天,不带前导零(1 到 31)
l('L' 的小写形式)- 星期几的完整的文本表示
N - 星期几的 ISO-8601 数字格式表示(1表示Monday[星期一],7表示Sunday[星期日])
S - 一个月中的第几天的英语序数后缀(2 个字符:st、nd、rd 或 th。与 j 搭配使用)
w - 星期几的数字表示(0 表示 Sunday[星期日],6 表示 Saturday[星期六])
z - 一年中的第几天(从 0 到 365)
W - 用 ISO-8601 数字格式表示一年中的星期数字(每周从 Monday[星期一]开始)
F - 月份的完整的文本表示(January[一月份] 到 December[十二月份])
m - 月份的数字表示(从 01 到 12)
M - 月份的短文本表示(用三个字母表示)
n - 月份的数字表示,不带前导零(1 到 12)
t - 给定月份中包含的天数
L - 是否是闰年(如果是闰年则为 1,否则为 0)
o - ISO-8601 标准下的年份数字
Y - 年份的四位数表示
y - 年份的两位数表示
a - 小写形式表示:am 或 pm
A - 大写形式表示:AM 或 PM
B - Swatch Internet Time(000 到 999)
g - 12 小时制,不带前导零(1 到 12)
G - 24 小时制,不带前导零(0 到 23)
h - 12 小时制,带前导零(01 到 12)
H - 24 小时制,带前导零(00 到 23)
i - 分,带前导零(00 到 59)
s - 秒,带前导零(00 到 59)
u - 微秒(PHP 5.2.2 中新增的)
e - 时区标识符(例如:UTC、GMT、Atlantic/Azores)
I(i 的大写形式)- 日期是否是在夏令时(如果是夏令时则为 1,否则为 0)
O - 格林威治时间(GMT)的差值,单位是小时(实例:+0100)
P - 格林威治时间(GMT)的差值,单位是 hours:minutes(PHP 5.1.3 中新增的)
T - 时区的简写(实例:EST、MDT)
Z - 以秒为单位的时区偏移量。UTC 以西时区的偏移量为负数(-43200 到 50400)
c - ISO-8601 标准的日期(例如 2013-05-05T16:34:42+00:00)
r - RFC 2822 格式的日期(例如 Fri, 12 Apr 2013 12:01:05 +0200)
U - 自 Unix 纪元(January 1 1970 00:00:00 GMT)以来经过的秒数

将上面代码中的h改成H即为24小时

1
date("Y-m-d H:i:s",time())

时区设置在php.ini中搜索”timezone”修改

6.参考

[1] php留言板製作

[2] PHP 教程

[3] SQL 教程