欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php学习历程1——注册、登录(面向过程、面向对象)

程序员文章站 2022-05-15 14:52:36
新人练手小项目的分享,一方面是记录自己的学习,一方面分享给别的正在入门的朋友。 这个标签还会坚持下去。 ......

 

 首先放一张天空之城

 

php学习历程1——注册、登录(面向过程、面向对象)

 

php入门来的第一个小项目,首先做的是一个简陋的文章管理系统。有登录、注册、文章list、添加文章、修改文章、删除文章、分页这几个小功能。

  • 面向过程的编码
  • 面向对象的编码

 

  • 首先做的就是登录注册功能

 

本文介绍我在登录、注册功能上的学习、理解和实践。


  •  面向过程

刚学习完php函数和简单的html,连jsajax完全不会。起初想搞一个美观优雅的登录注册界面,但是碍于能力有限,最后写了一个宇宙中最无敌简陋的登录模板,然后开始写后端数据处理。

  • 登录

 php学习历程1——注册、登录(面向过程、面向对象)

模板想用的代码login.php

 1 <!doctype html>
 2 <html>
 3 <head>
 4     <meta charset="utf-8">
 5     <title>login page</title>
 6 </head>
 7 <body>
 8 <br>
 9 <br>
10 <br>
11 <br>
12 <br>
13 <br>
14 <br>
15 <br>
16 <br>
17 <br>
18 <br>
19 <br>
20 <br>
21 <div>
22 <div style="width: 775px; height: 250px; float: left">
23 
24 </div>
25 <div align="center" style=" background-color: #78c4d8;display: table; height: 250px;width: 450px;box-shadow: 10px 10px 10px  #828282;
26         border-radius: 30px">
27     <div style="height: 89.5px">
28         
29     </div>
30     
31 <form action="../controller/login.php" method="post" align="center">
32     登录
33     <input type="text" name="username1" size="20" maxlength="15"
34               placeholder="请填写用户名">
35     <br>
36     密码
37     <input type="password"
38            name="password1" size="20" maxlength="15"> <br>
39     <input
40         type="submit" name="submit" value="登录">
41     <input type="button"
42                                          onclick="window.location.href='register.html'" value="注册">
43 </form>
44 </div>
45 </div>
46 </body>
47 </html>

 

别问我面向对象是什么?我这时候还不懂,啥也不懂,本科没好好学c++java,我错了(已跪)。

 

接着我用面向过程的语言就写成了这个玩意儿……

 login.php

 1 <?php
 2 session_start();
 3 
 4 //注销登录
 5 if(@$_get['action'] == 'logout') {
 6 
 7     unset($_session['username1']);
 8     unset($_session['userid']);
 9     echo '注销登录成功!点击此处 <a href="../view/login.html">登录</a>';
10     exit;
11 }
12 
13 
14 $username1 = $_post ['username1'];
15 $password1 = $_post ['password1'];
16 
17 include "../../../common/database.php";
18 
19 $check_query = mysqli_query($conn,"select userid from think_userrg where username1='$username1' and password1='$password1' limit 1");
20 
21 
22 if ($result = mysqli_fetch_array($check_query)) {
23     //登陆成功
24     $_session['username1'] =$username1;
25     $_session['userid'] =$result['userid'];
26     echo  $username1, ',登录成功!欢迎您!<a href="../view/articlelist.php">如果您的浏览器没有自动跳转,请点击这里</a>
27                ' . '<script>
28 settimeout(function(){window.location.href=\'../view/articlelist.php\';},3000)
29               </script>' ;
30     echo '点击此处 <a href= "login.php?action=logout">注销</a>登录!<br />';
31     exit;
32 } else {
33     die ( '登录失败!点击此处<a href ="javascript:history.back(-1);">返回</a>重试' );
34 }
35 
36 /**
37  * 判断是否为
38  * 1.非submit事件
39  * 2.非注销事件
40  */
41 if (!isset($_post['submit']) && !($_get['action'] == 'logout')){
42     die('非法访问!');
43 }
44 
45 ?>

 

1.用户名和密码正确,点击登录,可以成功。

php学习历程1——注册、登录(面向过程、面向对象)

2.用户名不存在或者用户名存在,密码错误,都报错,跳转错误页面,返回登录初始界面。

php学习历程1——注册、登录(面向过程、面向对象)

(哦,忘了给看数据库结构了)

think_userrg

 php学习历程1——注册、登录(面向过程、面向对象)

 

 


  • 注册

 

以下是注册的模板

 php学习历程1——注册、登录(面向过程、面向对象)

平平淡淡才是真~

代码如下register.html

 1 <!doctype html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title>register</title>
 6 </head>
 7 <body>
 8     <br>
 9     <br>
10     <br>
11     <br>
12     <br>
13     <br>
14     <br>
15     <br>
16     <br>
17     <br>
18     <br>
19     <br>
20     <form action="../controller/register.php" method="post" enctype="multipart/form-data"
21           align="center">
22 
23         用户名: <input type="text" name="username1" size="20" maxlength="15"
24             placeholder="必须填写用户名"> <br> 登录密码: <input type="password"
25             name="password1" size="20" maxlength="15"> <br> 确认密码: <input
26             type="password" name="confirmpassword" size="20" maxlength="15">
27         <br> <input type="submit" name="submit" value="注册"> <input
28             type="button" name="back" value="返回"
29             onclick="window.location.href='login.html'">
30     </form>
31 
32 </body>
33 </html>

 

然后是后端register.php

 

 1 <?php
 2 include "../../../common/database.php";
 3 
 4 if (empty ( $_post )) {
 5     exit ( "您提交的表单数据超过post_max_size!<br>" );
 6 }
 7 
 8 // 判断输入密码与确认密码是否相同
 9 $password1 = $_post ['password1'];
10 $confirmpassword = $_post ['confirmpassword'];
11 if ($password1 != $confirmpassword) {
12     exit ('两次输入的密码不相同!<a href ="../view/register.html">返回重试</a>');
13 }
14 
15 $username1 = $_post ['username1'];
16 
17 // 判断用户名是否重复
18 $usernamesql = "select * from userrg where username1 = '$username1'";
19 $resultset = mysqli_query ($conn, $usernamesql );
20 
21 $row = mysqli_fetch_array($resultset);
22 //判断用户名是否存在
23 if ($username1 == $row['username1']) {
24     die ('用户名被占用,请更换其他用户名<a href ="../view/register.html">返回重试</a>');
25 }else{
26 
27 $sql = "insert into userrg (username1,password1,confirmpassword)
28          values ('$username1','$password1','$confirmpassword')";
29 mysqli_query ($conn,$sql);
30 // 注册成功跳转到登录界面
31     die ('注册成功!点击此处<a href="../view/login.html">登录</a>');
32 }
33 
34 
35 
36 
37 ?>

 

 然后就没了。

 


  •  面向对象

 你居然没走?真的机智!机智如我~       :)

说明一下,以上是其实不是最初的版本,是改了好多次之后的终于变成我自己代码的代码。

 

接下来是我学习了面向对象之后,对原来代码的修改。

我师傅说虽然是写成了一个个类文件,但是还是有点面向过程的思维,我自己也觉得是这样子,我也不敢说,我也不敢问,我就是个年幼的程序猿。

 

话不多说,直接上代码。

注意:登录的注册功能还应用了两个文件。我会在末尾也贴出来。

登录处理代码login.php

 1 <?php
 2 //namespace a;
 3 //use a\user;
 4 /**
 5  * login类
 6  */
 7 require_once '../../back/user/user.php';
 8 include '../../mysqldb.php';
 9 
10 class login extends user
11 {
12     function __construct()
13     {
14     }
15 
16     public function check($usernm, $userpwd)
17     {
18 
19         $arr = array(
20             'dbname' => 'newpage'
21         );
22         $db = mysqldb::getinstance($arr);
23         $sql = "select uid from new_user where usernm='$usernm' and userpwd='$userpwd' limit 1";
24         if ($result = $db->fetcharray($sql) ) {
25             echo $usernm . "欢迎您,点击<a href='../article/list.php'>此处</a>跳转主页";
26         } else
27             die("密码错误");
28     }
29 }
30 
31 $usernm = $_post['usernm'];
32 $userpwd = $_post['userpwd'];
33 
34 $log = new login();
35 $log->is_post();
36 $a = $usernm;
37 $b = $userpwd;
38 $log->is_empty($a, $b);
39 $log->check($a, $b);
40 
41 ?>

注册处理代码register.php

 1 <?php
 2 // namespace user\register;
 3 
 4 require_once '../../back/user/user.php';
 5 include '../../mysqldb.php';
 6 //var_dump($_post['usernm']);
 7 //var_dump($_post['userpwd']);
 8 
 9 /**
10  * register类
11  */
12 class register extends user
13 {
14     #注册账户方法
15     function __construct()
16     {
17 
18 //        $usernm= $_post['usernm'];
19 //        $userpwd=$_post['userpwd'];
20 //        $userrepwd=$_post['userrepwd'];
21 
22     }
23 
24     #判断两次输入的密码是否相同
25     public function pwdsame()
26     {
27         $userpwd = $_post['userpwd'];
28         $userrepwd = $_post['userrepwd'];
29         if ($userpwd != $userrepwd) {
30             die ("两次输入的密码不相同!请重试!");
31         }
32 
33     }
34 
35 
36 
37     #将用户信息写入数据库
38     public function query()
39     {
40         $usernm = $_post['usernm'];
41         $userpwd = $_post['userpwd'];
42         $createtime = date("y-m-d h:i:s", time());
43         $arr = array(
44             'dbname' => 'newpage'
45         );
46         $db = mysqldb::getinstance($arr);
47         $sql = "insert into new_user (usernm,userpwd,createtime) value ('$usernm','$userpwd','$createtime')";
48         if ($result = $db->my_query($sql)) {
49             die('注册成功!点击此处<a href="../login/login.html">登录</a>');
50         } else
51             return false;
52     }
53 
54     #加载选择数据库信息方法
55     public function dbname()
56     {
57     }
58 }
59 
60 
61 $usernm = $_post['usernm'];
62 $userpwd = $_post['userpwd'];
63 
64 
65 $reg = new register();
66 $a = $usernm;
67 $b = $userpwd;
68 $reg->is_empty($a, $b);
69 
70 $reg->is_post();
71 $reg->pwdsame();
72 $reg->is_repeat();
73 $reg->query();
74 
75 
76 ?>

 

附件1:user.php

 1 <?php
 2 /**
 3  * created by phpstorm.
 4  * user: ts-jinjinying
 5  * date: 2019/6/13
 6  * time: 10:40
 7  */
 8 
 9 //namespace a;
10 
11 /**
12  * user类
13  */
14 class user
15 {
16     /**
17      *  用户类的属性
18      * @param string $usernm 用户名
19      * @param int $uid 用户id
20      * @param string $userpwd 密码
21      * @param string $userrepwd
22      * @param datetime $createtime 创建时间
23      */
24     public $usernm;
25     public $uid;
26     public $userpwd;
27     public $userrepwd;
28     public $createtime;
29 
30     #初始化对象属性
31     public function __construct($usernm, $userpwd)
32     {
33         $this->usernm = $usernm;
34         $this->userpwd = $userpwd;
35     }
36 
37     #判断是否提交
38     public function is_post()
39     {
40         if (!(isset($_post['submit']))) {
41             return false;
42         }
43     }
44 
45     #判断是否为空
46     public function is_empty($a, $b)
47     {
48         if (empty($a && $b))
49             die("用户名或密码不能为空");
50     }
51 
52     #判断用户名是否重复
53     public function is_repeat()
54     {
55         $usernm = $_post['usernm'];
56         $arr = array(
57             'dbname' => 'newpage'
58         );
59         $select = mysqldb::getinstance($arr);
60         $usernmsql = "select * from new_user where usernm = '$usernm'";
61 
62         $row = $select->fetchrow($usernmsql);
63         if ($usernm == $row['usernm']) {
64             die("用户名被占用,请更换其他用户名!");
65         } else {
66             echo "用户名合法!";
67         }
68     }
69 
70 
71     #注销方法
72     public function logout()
73     {
74         if ('合法') {
75             echo "注销成功";
76         } else
77             return false;
78     }
79 
80     function __destruct()
81     {
82     }
83 }

 

 附件2:mysqldb.php

  1 <?php
  2 /**
  3  * created by phpstorm.
  4  * user: ts-jinjinying
  5  * date: 2019/6/14
  6  * time: 8:51
  7  */
  8 
  9 
 10 /**
 11  * class mysqldb
 12  * mysqldb工具类
 13  */
 14 class mysqldb
 15 {
 16 //定义相关的属性
 17     private $host;//主机地址
 18     private $port;//端口号
 19     private $user;//用户名
 20     private $pass;//密码
 21     private $charset;//字符集
 22     private $dbname;//数据库名
 23     //运行时需要的属性;
 24     private $link;//保存连接资源
 25     private static $instance;//用于保存对象
 26 
 27     /**
 28      * mysqldb constructor.
 29      * @param $arr
 30      * 构造方法
 31      */
 32     private function __construct($arr)
 33     {
 34         //初始化属性的值
 35         $this->init($arr);
 36         //连接数据库
 37         $this->my_connect();
 38         //选择默认字符集
 39         $this->my_charset();
 40         //选择默认数据库
 41         $this->my_dbname();
 42     }
 43 
 44     /**
 45      * 获得单例对象的公开的静态方法
 46      * @param array $arr 传递给构造方法的参数
 47      */
 48     public static function getinstance($arr)
 49     {
 50         if (!self::$instance instanceof self) {
 51             self::$instance = new self($arr);
 52         }
 53         return self::$instance;
 54     }
 55 
 56     private function init($arr)
 57     {
 58         $this->host = isset($arr['host']) ? $arr['host'] : '127.0.0.1';
 59         $this->port = isset($arr['port']) ? $arr['port'] : '3306';
 60         $this->user = isset($arr['user']) ? $arr['user'] : 'root';
 61         $this->pass = isset($arr['pass']) ? $arr['pass'] : '';
 62         $this->charset = isset($arr['charset']) ? $arr['charset'] : 'utf8';
 63         $this->dbname = isset($arr['dbname']) ? $arr['dbname'] : '';
 64     }
 65 
 66     /**
 67      * 连接数据库
 68      */
 69     private function my_connect()
 70     {
 71         //如果连接成功,就将连接资源保存到$link属性里面
 72         if ($link = @mysqli_connect("$this->host:$this->port", "$this->user", "$this->pass")) {
 73             $this->link = $link;
 74         } else {
 75             //连接失败
 76 
 77             echo "数据库连接失败!<br/>";
 78             echo "错误编号:", mysqli_errno($this->link), "<br/>";
 79             echo "错误信息:", mysqli_error($this->link), "<br/>";
 80 //            die;
 81             return false;
 82         }
 83     }
 84 
 85     /**
 86      * 错误调试方法,执行一条sql语句
 87      */
 88 
 89     public function my_query($sql)
 90     {
 91         $result = mysqli_query($this->link, $sql);
 92         if (!$result) {
 93             //执行失败
 94             echo "sql语句执行失败<br/>";
 95             echo "错误编号:", mysqli_errno($this->link), "<br/>";
 96             echo "错误信息:", mysqli_error($this->link), "<br/>";
 97 //            die;
 98             return false;
 99         }
100         return $result;
101     }
102 
103     /**
104      * 返回多行多列的查询结果
105      * @param string $sql 一条sql语句
106      * @return mixed  array|false
107      */
108     public function fetchall($sql)
109     {
110         //先执行sql语句
111         if ($result = $this->my_query($sql)) {
112             //执行成功
113             //遍历资源结果集
114             $rows = array();
115             while ($row = mysqli_fetch_assoc($result)) {
116                 $rows[] = $row;
117             }
118             //释放结果集资源
119             mysqli_free_result($result);
120             //返回所有的数据
121             return $rows;
122         } else {
123             return false;
124         }
125     }
126 
127     /**
128      * 返回一行的查询结果
129      * @param string $sql 一条sql语句
130      * @return mixed  array|false
131      */
132     public function fetchrow($sql)
133     {
134         //先执行sql语句
135         if ($result = $this->my_query($sql)) {
136             //执行成功
137             $row = mysqli_fetch_assoc($result);
138             mysqli_free_result($result);
139             //返回这一条记录的数据
140             return $row;
141         } else {
142             return false;
143         }
144     }
145 
146 
147     /**
148      * 返回单行单列的查询结果(单一值)
149      * @param string $sql 一条sql语句
150      * @return mixed  string|false
151      */
152     public function fetchcolumn($sql)
153     {
154         //执行sql语句
155         if ($result = $this->my_query($sql)) {
156             //执行成功
157             $row = mysqli_fetch_row($result);
158             //释放结果集资源
159             mysqli_free_result($result);
160             //返回这个单一值
161             return isset($row[0]) ? $row[0] : false;
162         } else {
163             //执行失败
164             return false;
165         }
166     }
167 
168     /**
169      * @param $sql
170      * @return array|bool|null
171      * 返回遍历数据表的所有数据
172      */
173     public function fetcharray($sql)
174     {
175         //执行sql语句
176         if ($result = $this->my_query($sql)) {
177             //执行成功
178             //遍历资源结果集
179             $rows = array();
180 
181             while($row = mysqli_fetch_array($result)){
182                 $rows[]= $row;
183             }
184             //释放结果集资源
185             mysqli_free_result($result);
186             //返回所有数据
187             return $rows;
188         } else
189             return false;
190     }
191 
192 
193     /**
194      * 选择默认的字符集
195      */
196     private function my_charset()
197     {
198         $sql = "set names $this->charset";
199         $this->my_query($sql);
200     }
201 
202     /**
203      * 选择默认数据库
204      */
205     private function my_dbname()
206     {
207         $sql = "use $this->dbname";
208         $this->my_query($sql);
209     }
210 
211     /**
212      * 析构方法
213      */
214     public function __destruct()
215     {
216         //释放额外的数据库连接资源
217         mysqli_close($this->link);  // todo: implement __destruct() method.
218     }
219 
220     /**
221      * __sleep方法,序列化对象的时候自动调用
222      */
223     public function __sleep()
224     {
225         //返回一个数组,数组内的元素为需要被序列化的属性名的集合
226         return array('host', 'port', 'user', 'pass', 'charset', 'dbname');   // todo: implement __sleep() method.
227     }
228 
229     /**
230      * __wakeup方法,反序列化一个对象的时候自动调用
231      */
232     public function __wakeup()
233     {
234         /**数据库相关初始化操作*/
235 
236         //连接数据库
237         $this->my_connect();
238         //选择默认字符集
239         $this->my_charset();
240         //选择默认数据库
241         $this->my_dbname();
242     }
243 
244     /**
245      * 私有化克隆模式方法,防止通过克隆得到一个新的对象
246      */
247     private function __clone()
248     {
249         // todo: implement __clone() method.
250     }
251 
252     public function __set($name, $value)
253     {
254         // todo: implement __set() method.
255     }
256 
257     public function __get($name)
258     {
259         // todo: implement __get() method.
260     }
261 
262     public function __unset($name)
263     {
264         //什么都不做,表示不能删除任何属性
265     }
266 
267     public function __isset($name)
268     {
269         // todo: implement __isset() method.
270     }
271 }

 

上面的代码中有些本文没有说明,以后有机会会一一说明,也是对我自己代码的复盘。

新人练手小项目的分享,一方面是记录自己的学习,一方面分享给别的正在入门的朋友。

这个标签还会坚持下去。

tails:第0000 0000 0000 0010