1 实验环境
(1)服务端:本实验基于虚拟机win2008系统的WAMP环境进行,该环境相关配置过程参考文章《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》。
(2)客户端:使用浏览器访问与控制。
(3)服务端与客户端处于同一个局域网下,开启服务端的phpstudy并确保能从客户端浏览器访问。
2 网站页面功能规划
写一个网站,在首页能看用户的留言,同时能实现包括用户注册、登录、注销、上传头像、修改个性签名等。其中网站的所有代码文件均放在默认站点位置下的文件夹jrltbbs中。
2.1 论坛首页
论坛首页文件为index.php,并具有如下功能
显示论坛标题;根据用户是否登录分支显示:已登录则显示“欢迎来到论坛首页”字样,同时显示个人中心、注销、新增留言等按钮;未登录则显示注册和登录按钮,未登录仅能看留言。网页主体用于显示留言(后续实验完善留言功能) 2.2 个人中心
个人中心相关的代码文件均放入个人中心文件夹为member中 ,个人中心相关的代码文件包含:
(1)个人中心的首页./member/index.php。具有如下功能:
个人中心页面标题显示个人中心;根据用户是否登录分支显示:已登录则显示欢迎“欢迎来到个人中心”字样、显示个人账号、头像及个性签名信息、同时显示信息修改和注销按钮;未登录则显示注册和登录按钮。
(2)注册页面./member/register.php。用于实现注册功能,具体功能如下:
设置表单用于首次收集用户信息(包括输入的账号及两次输入的密码),设置提交按钮用于提交表单数据。后台完成账号密码的验证:①账号或密码为空,则返回注册页面“提示账号密码不能为空,请重新输入”;②若两次密码不一致,则返回注册页面并提示“两次密码输入不一致”;③若账号已在数据库中存在,则返回注册页面并提示“账号已存在,请重新注册”;④账号密码没问题则存入数据库中,并返回COOKIE。
(3)接收来自注册页面的表单数据并完成账号密码验证./member/addUser.php 。具体功能如下:
接收来自注册页面的表单数据完成账号密码的验证,没问题后将表单数据写入数据库
①账号或密码为空,则返回注册页面“提示账号密码不能为空,请重新输入”;
② 若两次密码不一致,则返回注册页面并提示“两次密码输入不一致”;
③若账号已在数据库中存在,则返回注册页面并提示“账号已存在,请重新注册”;
④账号密码没问题则存入数据库中,并返回COOKIE。
(5)登录页面./member/login.php。用于用户登录,具体功能如下:
设置表单用于收集用户输入账号及密码,设置提交按钮用于提交表单数据。后台完成账号密码与数据库数据验证,账号密码正确则返回COOKIE、显示欢迎字样、并提供返回首页与个人中心按钮;账号密码错误则重定向到登录页面重新输入。暂时不考虑设置验证码的功能。
(6)注销页面./member/logout.php。用于用户注销,具体功能如下:
删除COOKIE;并根据是否注销成功分支显示:成功则提示成功并显示返回首页按钮,失败则显示注销失败。
(7)头像上传及更新页面./member/updatePhoto.php。主要用于更新头像。
头像修改页面,显示按钮让用户选择新头像,修改成功后页面显示修改成功,提供返回个人中心和返回首页等按钮。
(8)生成验证码页面./member/vcode.php。用于生成随机字符串的验证码。
2.3 实现留言功能
(1)显示留言内容页面./showmessage.php。
读者点击网站首页留言标题时,跳转到此页面,用于展示该留言内容。
(2) 新增留言页面./addMessage.php。用于已登录的用户新增留言。
2.4 数据库及连接数据库
(1)数据库名称为jrlt,数据库中新建两个数据表,分别为:
users表:保存用户注册与修改的数据。该表共有5个字段,分别是id、name、password、photo、money。messages表:保存首页用户留言数据。该表共有4个字段,分别是id、uname、title、content。
(2) 与mysql数据库建立连接./inc/dblink.inc.php。具体功能如下:
用于实现PHP与mysql数据库建立连接,当其他PHP脚本需要与mysql数据库建立连接时,使用include引入。 3 实验阶段一:实现注册、登录、注销和更新头像等功能 3.1 数据库
数据库的创建以及与PHP之间的连接可具体参考《【PHP基础-10】实现PHP与SQL数据库之间的交互》,在本综合案例中,创建数据库及其相应的数据表步骤如下:
(1)先在数据库中创建一个jrlt的数据库。
(2)在该数据库下创建两个表,一个是users,一个是messages,所含字段分别如下:
3.2 论坛首页./index.php
首页位于默认站点位置下的位置为\PHP\jrltbbs\index.php。
代码如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<html> <head> <meta charset= "utf-8" > <title> 首页----今日论坛</title> </head> <body> <h1>今日论坛BBS</h1> <?php if (isset( $_COOKIE [ 'name' ])){ echo "欢迎来到今日论坛BBS," . $_COOKIE [ 'name' ]. "<br/>" ; echo "<a href='./member/index.php'>个人中心</a> " ; echo "<a href='./member/logout.php'>注销</a>" ; } else { echo " <a href='./member/register.php'>注册</a> " ; echo "<a href='./member/login.php'>登录</a> " ; } ?> <hr/> <h3>留言板</h3> </body> </html> |
3.3 个人中心注册页面./member/register.php
设置表单用于收集用户输入的账号及两次输入的密码,设置提交按钮用于提交表单数据。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<html> <head> <meta charset= "utf-8" > <title> 注册----今日论坛</title> </head> <body> <h1>今日论坛BBS</h1> <form action= "./addUser.php" method= "post" > 用户名:<input type= "text" name= "userName" ><br/> 密码:<input type= "password" name= "userPass1" ><br/> 确认密码:<input type= "password" name= "userPass2" ><br/> <input type= "submit" name= "userSubmit" value= "注册" > </form> <hr/> </body> </html> |
3.4 接收来自注册页面的表单数据./member/addUser.php
接收来自注册页面的表单数据,并完成账号密码的验证:①账号或密码为空,则返回注册页面“提示账号密码不能为空,请重新输入”;②若两次密码不一致,则返回注册页面并提示“两次密码输入不一致”;③若账号已在数据库中存在,则返回注册页面并提示“账号已存在,请重新注册”;④账号密码没问题则存入数据库中,并返回COOKIE。
代码:
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
39
40
41
42
43
44
45
46
47
|
<meta charset= "utf-8" > <?php include "../inc/dblink.inc.php" //将数据库连接的文件包含到此文件中 ?> <?php //var_dump($_POST); if (isset( $_POST [ 'userSubmit' ])){ $userName = $_POST [ 'userName' ]; $userPass1 = $_POST [ 'userPass1' ]; $userPass2 = $_POST [ 'userPass2' ]; if ((bool)( $userName ) && (bool)( $userPass1 ) && (bool)( $userPass2 )){ // 查询数据库中是否有此用户,若无则新增,若有则要求重新输入 $sql1 = "select * from users where name='" . $userName . "'" ; if (! $results1 =mysqli_query( $link , $sql1 )){ die ( "SQL语句有误" ); } else { if (!mysqli_num_rows( $results1 )){ //非空往数据库中增加 if ( $userPass1 === $userPass2 ){ $sql2 = "insert into users(name, password) values('" . $userName . "', md5($userPass1))" ; if (! $results2 =mysqli_query( $link , $sql2 )){ die ( "SQL语句有误" ); } else { echo "注册成功,<a href='./login.php'>请登录<a>" ; } } else { echo "两次密码输入不一致,<a href='./register.php'>请重新注册<a>" ; } } else { echo "用户名已存在,<a href='./register.php'>请重新注册<a>" ; } } $results1 =mysqli_query( $link , $sql1 ); } else { echo "账号或密码不能为空, <a href='./register.php'>请重新注册<a>" ; } } else { header( "Location:./register.php" ); } //var_dump((bool)($userName)); //var_dump((bool)($userPass1)); //var_dump((bool)($userPass2)); ?> <?php mysqli_close( $link ); ?> |
tips:
注意:isset() 函数用于检测变量是否已设置并且非 NULL,如果已经使用 unset() 释放了一个变量之后,再通过 isset() 判断将返回 FALSE。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是 null 字符(“\0”)并不等同于 PHP 的 NULL 常量。
3.5 与mysql数据库建立连接./inc/dblink.inc.php
为其他需要连接数据库的网页提供连接,避免重复定义。
1
2
3
4
5
6
7
8
9
10
11
|
<?php $dbHost = "127.0.0.1" ; $dbUser = "root" ; $dbPass = "root" ; $dbName = "jrlt" ; $link =mysqli_connect( $dbHost , $dbUser , $dbPass , $dbName ); //建立数据库连接 if (! $link ){ die (mysqli_connect_error()); //捕获数据库连接时的错误信息 } mysqli_set_charset( $link , "utf-8" ); ?> |
3.6 个人中心的首页./member/index.php
利用COOKIE信息中的name值是否存在来判断是否已登录,如果未登录,则需要先登录;如果已经登录,可以利用COOKIE信息中的name字段,将用户输入的信息与数据库中的信息进行对比,只有数据库中已有的用户才能登录。
代码如下
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
39
40
41
42
43
44
|
<?php include "../inc/dblink.inc.php" //将数据库连接的文件包含到此文件中 ?> <html> <head> <meta charset= 'utf-8' > <title>今日论坛--个人中心</title> </head> <body> <h1>今日论坛--个人中心</h1> <?php if (isset( $_COOKIE [ 'name' ])){ $userName = $_COOKIE [ 'name' ]; $sql = "select * from users where name='" . $userName . "'" ; if ( $results =mysqli_query( $link , $sql )){ if (mysqli_num_rows( $results )>0){ $result =mysqli_fetch_assoc( $results ); echo "<hr/>" ; echo "欢迎来到您的个人中心," . $_COOKIE [ 'name' ] . "! <a href='../index.php'>返回首页</a> " ; echo "<a href='./logout.php'>注销</a><br/>" ; echo "<hr/>" ; echo "<h3>个人信息</h3>" ; echo "帐号名:" . $_COOKIE [ 'name' ] . "<br/>" ; echo "您的头像是<img src='" . $result ['photo ']."' /> "; echo "<a href='./updatePhoto.php'>修改头像</a> <br/>" ; echo "帐户余额:" . $result [ 'money' ]. " <span style='color:red;'>请联系管理员</span>" ; } else { die ( "该用户不存在" ); } } else { die ( "sql语句有误" ); } } else { echo "<a href='./login.php'>请登录</a>" ; } ?> </body> </html> <?php mysqli_close( $link ); ?> |
3.7 登录页面 ./member/login.php
当$_POST['userSubmit']
具有数据时,则判断将用户输入的信息与数据库信息进行对比,正确则可以成功登录;若$_POST['userSubmit']
无数据时,则设置表单用于收集用户输入账号及密码,设置登录按钮用于提交表单数据(表单数据提交到当前页面)。
setcookie设置路径:设置成 ‘/’ 时,为网站默认路径,Cookie 对整个域名 domain 有效。 如果设置成 ‘/PHP/’, Cookie 仅仅对 domain 中 /PHP/ 目录及其子目录有效。 设置 Cookie 时的默认值为代码文件所在的当前目录。因此,为了让网站首页也能获取到cookie,需要设置路径为/PHP/jrltbbs
。
代码:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
<?php include "../inc/dblink.inc.php" //将数据库连接的文件包含到此文件中 ?> <html> <head> <meta charset= "utf-8" > <title> 登录----今日论坛</title> </head> <body> <h1>今日论坛BBS</h1> <?php if (isset( $_POST [ 'userSubmit' ])){ if ( $_POST [ 'vcode' ]== $_COOKIE [ 'vcode' ]){ $userName = $_POST [ 'userName' ]; $userPass = $_POST [ 'userPass' ]; $sql = "select * from users where name='" . $userName . "' && password='" .md5( $userPass ). "'" ; if ( $results =mysqli_query( $link , $sql )){ if (mysqli_num_rows( $results )>0){ setcookie( 'name' , $userName ,time()+3600*24, "/PHP/jrltbbs" ); //注意cookie的路径,不同路径的cookie认为是两条cookie echo "登录成功,返回<a href='../index.php'>首页</a>或<a href='./index.php'>个人中心</a>" ; } else { echo "用户名或密码错误,<a href='./login.php'>请重新登录</a>" ; } } else { die ( "sql语句有误" ); } } else { echo "验证码错误,<a href='./login.php'>请重新登录</a>" ; } } else { $html =<<<HTML <form method= "post" > 用户名:<input type= "text" name= "userName" ><br/> 密码:<input type= "password" name= "userPass" ><br/> 验证码:<input type= "text" name= "vcode" > <iframe src= "./vcode.php" width= "100" height=30 frameboder= "0" ></iframe><br> <input type= "submit" name= "userSubmit" value= "登录" > </form> HTML; echo $html ; } ?> <hr/> </body> </html> <?php mysqli_close( $link ); ?> |
3.8 注销页面./member/logout.php
使COOKIE过期;
代码:
1
2
3
4
5
6
7
8
9
|
<meta charset= "utf-8" > <?php if (setcookie( 'name' , $_COOKIE [ 'name' ],time()-3600, "/PHP/jrltbbs" )){ //注意cookie的路径,不同路径的cookie认为是两条cookie echo "注销成功,<a href='../index.php'>返回首页</a>" ; } else { die ( "error" ); } ?> |
3.9 更新头像./member/updatePhoto.php
用于上传或更新头像。
代码:
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
39
40
|
<meta charset= 'utf-8' > <?php include "../inc/dblink.inc.php" //将数据库连接的文件包含到此文件中 ?> <?php if (isset( $_POST [ 'userSubmit' ])){ $userName = $_COOKIE [ 'name' ]; $tmp_path = $_FILES [ 'userFile' ][ 'tmp_name' ]; $path = ".\\images\\" . $_FILES [ 'userFile' ][ 'name' ]; if (move_uploaded_file( $tmp_path , $path )){ $path =mysqli_real_escape_string( $link , $path ); $sql = "update users set photo='" . $path . "'where name='" . $userName . "'" ; if ( $results =mysqli_query( $link , $sql )){ echo "图片上传成功,<a href='./index.php'>返回个人中心</a>" ; } else { die ( "sql语句有误" ); } } else { echo "图片上传失败" ; } } else { $html =<<<HTML <form method= "post" enctype= "multipart/form-data" > <input type= "file" name= "userFile" ><br/> <input type= "submit" name= "userSubmit" value= "提交" > </form> HTML; echo "$html" ; } ?> <?php mysqli_close( $link ); ?> |
3.10 生成验证码./member/vcode.php
用于简单生成随机的字符串验证码。
1
2
3
4
5
6
7
8
|
<?php $str = "" ; for ( $i =0; $i <5; $i ++){ $str .= chr (rand(97,122)); setcookie( "vcode" , $str ); } echo "<div style='background-color:red'>$str</div>" ; ?> |
3.11 测试
(1)访问今日论坛首页,显示结果为:
(2)点击注册,输入账号1,不输入密码。
(3)点击注册时,页面显示如下,提示”账号或密码不能为空, 请重新注册“。
(4)点击重新注册,然后输入账号1,密码2,点击注册,弹出以下提示
(5)点击重新注册,然后输入账号a,密码1,确认密码输入2,点击注册,弹出以下提示
(6)点击重新注册,然后输入账号a,密码1,确认密码输入1,点击注册,弹出以下提示
(7)点击登录,输入账号a,密码1,并输入验证码(验证码输入不一致),尝试下会出现什么结果,点击登录,出现以下提示。
(8)点击”请重新登录“,输入账号a,密码1,并输入验证码,点击登录,
(8)显示登录成功,返回首页与个人中心。网页获取到服务端发来的COOKIE,返回首页与个人中心均可用。
(9)当点击返回首页时的页面结果如下。
(10)当点击返回个人中心时,页面结果如下。
(11)点击修改头像,选择自己的图片文件,并点击提交。
(12)图像上传成功,点击返回个人中心。
(13)返回个人中心后可以看到自己上传的头像。
(14)点击注销即可退出登录,系统将删除COOKIE。
(15)点击返回首页,可以重新回到首页
4 实验阶段二:完善留言板功能 4.1 ./index.php 首页功能完善
让原本的首页增加留言相关功能,包括显示留言及新增留言。
代码:
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
39
40
41
42
43
44
45
46
47
48
49
|
<?php include "./inc/dblink.inc.php" //将数据库连接的文件包含到此文件中 ?> <html> <head> <meta charset= "utf-8" > <title> 首页----今日论坛</title> </head> <body> <h1>今日论坛BBS</h1> <?php if (isset( $_COOKIE [ 'name' ])){ echo "欢迎来到今日论坛BBS," . $_COOKIE [ 'name' ]. "<br/>" ; echo "<a href='./member/index.php'>个人中心</a> " ; echo "<a href='./member/logout.php'>注销</a> " ; } else { echo " <a href='./member/register.php'>注册</a> " ; echo "<a href='./member/login.php'>登录</a> " ; } echo "<a href='./addMessage.php'>我要留言</a>" ; ?> <hr/> <h3>留言板</h3> <?php $sql = "select * from messages" ; if ( $results =mysqli_query( $link , $sql )){ if (mysqli_num_rows( $results )>0){ echo "<table border=2>" ; echo "<tr><td>ID</td><td>AUTHOR</td><td>TITLE</td></tr>" ; while ( $result =mysqli_fetch_assoc( $results )){ echo "<tr><td>{ $result [ 'id' ]}</td><td>{ $result [ 'uname' ]}</td> <td><a href= 'showmessage.php?id={$result[' id ']}' target= '_blank' >{ $result [ 'title' ]}</a></td></tr>"; } echo "</table>" ; } else { echo "暂无留言内容" ; } } else { echo mysqli_error( $link ); } ?> </body> </html> <?php mysqli_close( $link ); ?> |
4.2 显示留言内容页面./showmessage.php
用读者点击首页留言标题时,跳转到此页面,用于展示该留言内容。
代码:
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
|
<?php include "./inc/dblink.inc.php" //将数据库连接的文件包含到此文件中 ?> <html> <head> <meta charset = "utf-8" > <title>留言论坛</title> </head> <body> <h1>留言内容</h1><a href = './index.php' >返回首页</a><hr /> <?php if (isset( $_GET [ 'id' ])){ $id = $_GET [ 'id' ]; $sql = "select * from messages where id=" . $id ; if ( $results =mysqli_query( $link , $sql )){ $result =mysqli_fetch_assoc( $results ); echo $result [ 'uname' ]. ":" . $result [ 'title' ]. "<hr/>" ; echo $result [ 'content' ]; } else { echo mysqli_error( $link ); } } else { echo "id error" ; } ?> </body> </html> <?php mysqli_close( $link ); ?> |
4.3 新增留言页面./addMessage.php
作用:用于已登录的用户新增留言。
代码:
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
39
40
41
42
43
44
45
|
<?php include "./inc/dblink.inc.php" //将数据库连接的文件包含到此文件中 ?> <html> <head> <meta charset = "utf-8" > <title>留言论坛</title> </head> <body> <?php if (isset( $_COOKIE [ 'name' ])){ $html =<<<HTML <form method= "post" > 标题:<input type= "text" name= "userTitle" ><br/> 留言内容:<br/> <textarea name= "userContent" ></textarea> <input type= "submit" name= "userSubmit" value= "提交" > </form> HTML; echo $html . "<br>" ; if (isset( $_POST [ 'userSubmit' ]) && isset( $_POST [ 'userTitle' ])){ $userName = $_COOKIE [ 'name' ]; $title =mysqli_real_escape_string( $link , $_POST [ 'userTitle' ]) ; //将提交的文本进行转义 $content =mysqli_real_escape_string( $link , $_POST [ 'userContent' ]); $sql ="INSERT INTO `messages`( `uname`, `title`, `content`) VALUES ( '".$userName."' , '".$title."' , '".$content."' )"; if ( $results =mysqli_query( $link , $sql )){ echo "留言成功,<a href='./index.php'>返回首页</a>" ; } else { echo mysqli_error( $link ); } } else { echo "请提交" ; } } else { echo "您还未登录,<a href='./member/login.php'>请登录</a>" ; } ?> </body> </html> <?php mysqli_close( $link ); ?> |
原文链接:https://blog.csdn.net/m0_64378913/article/details/123934548
暂无评论内容