1、用文本操作实现支持头像上传的用户注册与登陆
设计一简单的用户注册和登陆界面,将用户注册信息记入文本文件,并实现用户登陆与上传个人照片的功能。
一、案例分析
仔细分析本案例,实际上就是文件操作和文件上传的综合应用,具体制作步骤如下。
1)设计一简单的用户注册界面,含有上传头像的表单项。
2)新建一接收用户注册信息的文件,本文件所要完成的主要功能为有:接收注册的用户名、登陆口令和头像文件,实现头像(图片)的上传,把用户名、登陆口令和上传后的头像文件信息记录到一个文本文件中。
3)设计一简单的用户登陆界面(将用户注册的界面稍加修改即可)。
4)新建一接收用户登陆信息的文件,本文件所要完成的主要功能有:接受登陆用户的用户名和登陆口令,从记录注册信息的文本文件中读出注册用户信息,检查接受的登陆用户名是否存在以及登陆口令是否正确,若正确输出登陆成功信息和头像图片,否则输出错误信息。
二、实施步骤
通过对本案例的具体分析,就可以依次编写下面的文件和代码。
1)先制作一用户注册界面文件login.html,具体代码如下。
1: <!--文件login.html:用户注册-->
2: <html>
3: <head>
4: <title>用户注册</title>
5: </head>
6: <body>
7: <form enctype="multipart/form-data" name="form1" method="post" action=
"login_action.php">
8: <table width="329" height="150" border="0" cellpadding=
"0" cellspacing="1" bgcolor="#0000FF">
9: <tr>
10: <td colspan="2" bgcolor="#FFFFFF">用 户 注 册</td>
11: </tr>
12: <tr>
13: <td width="82" bgcolor="#FFFFFF">用户名:</td>
14: <td width="244" bgcolor="#FFFFFF">
15: <input type="text" name="user_name" size="16"> </td>
16: </tr>
17: <tr>
18: <td bgcolor="#FFFFFF">登陆口令:</td>
19: <td bgcolor="#FFFFFF"><input type="password" name=
"user_pw1" size="16"></td>
20: </tr>
21: <tr>
22: <td bgcolor="#FFFFFF">登陆口令:</td>
23: <td bgcolor="#FFFFFF"><input type="password" name=
"user_pw2" size="16"></td>
24: </tr>
25: <tr>
26: <td bgcolor="#FFFFFF">头像:</td>
27: <td bgcolor="#FFFFFF"><input type="file" name=
"pic_name"></td>
28: </tr>
29: <tr>
30: <td colspan="2" bgcolor="#FFFFFF">
31: <input type="submit" name="Submit" value="注册">
32: <input type="reset" name="Submit2" value="重置"></td>
33: </tr>
34: </table>
35: </form>
36: </body>
37: </html>
这是一个静态的HTML页面,其运行效果也非常简单,如图6-29所示。
图6-29
2)再编写一接收用户注册信息,并使用文本写入的方法记录注册信息的文件login_ action.php,其具体代码如下。
1: <!--文件login_action.php:用户注册-->
2: <html>
3: <head>
4: <title>用户注册</title>
5: </head>
6: <body>
7: <?php
8: //接收标单数据
9: $user_name=$_POST["user_name"];
10: $user_pw1=$_POST["user_pw1"];
11: $user_pw2=$_POST["user_pw2"];
12: //表单数据基本性验证,省略用户名重名验证
13: if ($user_name=="" or $user_pw1=="" or $user_pw2=="" or $_FILES ['pic_name']['name']==""){
14: echo "用户名、两次输入的登陆口令和头像全不能为空,请<a href=login.html>返回</a>重新填写";
15: exit;
16: }
17: if ($user_pw1!=$user_pw2){
18: echo"您两次输入的登陆口令不匹配,请<a href=login.html>返回</a>重新填写";
19: }
20: //生成自动文件名
21: $rand1=rand(0,9);
22: $rand2=rand(0,9);
23: $rand3=rand(0,9);
24: $filename=date("Ymdhms").$rand1.$rand2.$rand3;
25: //头像上传
26: $oldfilename=$_FILES['pic_name']['name'];
27: $filetype = substr ($oldfilename, strrpos ($oldfilename, "."), strlen ($oldfilename) -strr pos($oldfilename,"."));
28: if(($filetype!='.gif') &&($filetype!='.GIF') &&($filetype!= '.jpg') &&($file type!='.JPG')){
29: echo "<script>alert('文件类型或地址错误');</script>";
30: echo "<script>location.href='login.html';</script>";
31: exit;
32: }
33: if ($_FILES['pic_name']['size']>1000000) {
34: echo "<script>alert('文件太大,不能上传');</script>";
35: echo "<script>location.href='login.html';</script>";
36: exit;
37: }
38: //取得保存文件的临时文件名(含路径)
39: $filename=$filename.$filetype;
40: $savedir=$filename;
41: if(move_uploaded_file ($_FILES['pic_name']['tmp_name'], $savedir)){
42: $file_name=basename($savedir); //取得保存文件的文件名(不含路径)
43: }else{
44: echo "<script language=javascript>";
45: echo "alert('错误,无法将附件写入服务器!本次发布失败!');";
46: echo "location.href='login.html';";
47: echo "</script>";
48: exit;
49: }
50: //记录注册信息到user_info.txt文件中
51: $file=fopen("user_info.txt","a");
52: flock($file,LOCK_EX);
53: $string=$user_name." ";
54: fputs($file,$string);
55: $string=$user_pw1." ";
56: fputs($file,$string);
57: $string=$filename." ";
58: fputs($file,$string);
59: fputs($file," ");
60: echo "恭喜您,注册成功!<br>";
61: echo "用户名:".$user_name."<br>";
62: echo "登陆口令:".$user_pw1."<br>";
63: echo "头像:<img src=".$filename."><br>";
64: echo "请<a href=land.html>登陆</a>";
65: ?>
66: </body>
67: </html>
分析上面的代码,不难发现本代码由两个难点,其一就是文件的上传(20~49行),其二就是向一文本文件中追加记录用户注册信息,并在记录每条信息后换行(51~59行)。当用户全部且正确填写注册信息后,其运行效果如图6-30所示。
图6-30
3)还需要建立一个用户登陆表单“land.html”,也就是单击图6-30中的“登陆”链接所调转到的页面,其具体代码如下。
1: <!--文件land.html:用户登陆-->
2: <html>
3: <head>
4: <title>用户登陆</title>
5: </head>
6:
7: <body>
8: <form name="form1" method="post" action="land_action.php">
9: <table width="297" height="105" border="0"cellpadding = "0" cells pacing="1" bgcolor="#0000FF">
10: <tr>
11: <td colspan="2" bgcolor="#FFFFFF">用户登陆</td>
12: </tr>
13: <tr>
14: <td width="85" bgcolor="#FFFFFF">用户名:</td>
15: <td width="209" bgcolor="#FFFFFF">
16: <input type="text" name="user_name" size="16"> </td>
17: </tr>
18: <tr>
19: <td bgcolor="#FFFFFF">登陆口令:</td>
20: <td bgcolor="#FFFFFF"><input type="password" name= "user_pw" size="16"></td>
21: </tr>
22: <tr>
23: <td colspan="2" bgcolor="#FFFFFF">
24: <input type="submit" name="Submit" value="登陆">
25: <input type="reset" name="Submit2" value="重置"></td>
26: </tr>
27: </table>
28: </form>
29: </body>
30: </html>
这也是一个静态的HTML页面,其运行的效果如图6-31所示。
图6-31
4)建立最后一个页面,也就是接收用户登陆信息,并进行判断用户名和密码是否正确,输出相应信息或头像的页面。其基本思路和具体的实施步骤是:
①接受登陆用户的用户名和登陆口令,并做相应的处理(连接上换行符)。
②初始化登陆是否成功标志位。
③打开文本文件并锁定,指针定位于第一行。
④如果③成功,判断是否为文件尾,若不为文件尾,循环执行⑤~⑦步。
⑤读出指针所指行的数据,同时文件指针下移,判断是否为登陆的用户名。
⑥若⑤正确,读出指针所指行的数据,判断是否为登陆口令,同时文件指针下移。
⑦若⑥正确,输出登陆正确信息和用户头像,并跳出循环。
⑧判断登陆标志位,如果为初始值,输出登陆错误信息。
根据具体的实施步骤,可以编写出如下代码。
1: <!--文件login_action.php:用户登陆-->
2: <html>
3: <head>
4: <title>用户登陆</title>
5: </head>
6: <body>
7: <?php
8: $user_name=$_POST["user_name"];
9: $user_pw=$_POST["user_pw"];
10: $user_name2=$user_name." ";
11: $user_pw2=$user_pw." ";
12: $tag=0; //登陆是否成功标志位0-不成功;1-成功
13: $file=@fopen("user_info.txt","r");
14: if ($file){
15: while (!feof($file)){ //循环,文件指针下移
16: $buffer=fgets($file,4096); //取一行文本,同时文件指针下移
17: if ($buffer==$user_name2){
18: $buffer=fgets($file,4096);
19: if ($buffer==$user_pw2){
20: echo "您输入的用户名密码正确,登陆成功!<br>";
21: $image=fgets($file,4096);
22: echo "您的头像:<img src=".$image."><br>";
23: $tag=1;
24: break;
25: }
26: }
27: }
28: if ($tag==0){
29: echo "您输入的用户名和密码不正确,请<a href=land.html>返回</a>重新输入";
30: }
31: fclose($file);
32: }
33: ?>
34: </body>
35: </html>
不难发现,本程序得以实现的难点是对文本文件的逐行读取。当用户正确填写用户登陆信息后,运行效果如图6-32所示。
图6-32