1
2
3
4
5
6
7
8
9
10
11

独立探索

发布时间:2017-07-20 08:04   发布人:毛书朋   浏览次数:5611

       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="注册">&nbsp;&nbsp;

32:         <input type="reset" name="Submit2" value="重置"></td>

33:    </tr>

34:  </table>

35:  </form>

36:  </body>

37:  </html>

      这是一个静态的HTML页面,其运行效果也非常简单,如图6-29所示。

6-29.jpg

图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>

分析上面的代码,不难发现本代码由两个难点,其一就是文件的上传(2049行),其二就是向一文本文件中追加记录用户注册信息,并在记录每条信息后换行(5159行)。当用户全部且正确填写注册信息后,其运行效果如图6-30所示。

6-30.jpg

图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="登陆">&nbsp;&nbsp;

25:         <input type="reset" name="Submit2" value="重置"></td>

26:    </tr>

27:  </table>

28:  </form>

29:  </body>

30:  </html>

      这也是一个静态的HTML页面,其运行的效果如图6-31所示。

6-31.jpg

图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.jpg

6-32