php学习历程1——注册、登录(面向过程、面向对象)
首先放一张天空之城

Php入门来的第一个小项目,首先做的是一个简陋的文章管理系统。有登录、注册、文章list、添加文章、修改文章、删除文章、分页这几个小功能。
- 面向过程的编码
- 面向对象的编码
- 首先做的就是登录注册功能
本文介绍我在登录、注册功能上的学习、理解和实践。
- 面向过程
刚学习完php函数和简单的html,连js、ajax完全不会。起初想搞一个美观优雅的登录注册界面,但是碍于能力有限,最后写了一个宇宙中最无敌简陋的登录模板,然后开始写后端数据处理。
- 登录

模板想用的代码login.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login page</title>
</head>
<body>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<div>
<div style="width: 775px; height: 250px; float: left"> </div>
<div align="center" style=" background-color: #78c4d8;display: table; height: 250px;width: 450px;box-shadow: 10px 10px 10px #828282;
border-radius: 30px">
<div style="height: 89.5px"> </div> <form action="../Controller/login.php" method="POST" align="center">
登录
<input type="text" name="username1" size="20" maxlength="15"
placeholder="请填写用户名">
<br>
密码
<input type="password"
name="password1" size="20" maxlength="15"> <br>
<input
type="submit" name="submit" value="登录">
<input type="button"
onclick="window.location.href='register.html'" value="注册">
</form>
</div>
</div>
</body>
</html>
别问我面向对象是什么?我这时候还不懂,啥也不懂,本科没好好学c++和java,我错了(已跪)。
接着我用面向过程的语言就写成了这个玩意儿……
login.php
<?php
session_start(); //注销登录
if(@$_GET['action'] == 'logout') { unset($_SESSION['username1']);
unset($_SESSION['userID']);
echo '注销登录成功!点击此处 <a href="../View/login.html">登录</a>';
exit;
} $username1 = $_POST ['username1'];
$password1 = $_POST ['password1']; include "../../../Common/dataBase.php"; $check_query = mysqli_query($conn,"select userID from think_userrg where username1='$username1' and password1='$password1' limit 1"); if ($result = mysqli_fetch_array($check_query)) {
//登陆成功
$_SESSION['username1'] =$username1;
$_SESSION['userID'] =$result['userID'];
echo $username1, ',登录成功!欢迎您!<a href="../View/articleList.php">如果您的浏览器没有自动跳转,请点击这里</a>
' . '<script>
setTimeout(function(){window.location.href=\'../View/articleList.php\';},3000)
</script>' ;
echo '点击此处 <a href= "login.php?action=logout">注销</a>登录!<br />';
exit;
} else {
die ( '登录失败!点击此处<a href ="javascript:history.back(-1);">返回</a>重试' );
} /**
* 判断是否为
* 1.非submit事件
* 2.非注销事件
*/
if (!isset($_POST['submit']) && !($_GET['action'] == 'logout')){
die('非法访问!');
} ?>
1.用户名和密码正确,点击登录,可以成功。

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

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

- 注册
以下是注册的模板

平平淡淡才是真~
代码如下register.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>register</title>
</head>
<body>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<form action="../Controller/register.php" method="POST" enctype="multipart/form-data"
align="center"> 用户名: <input type="text" name="username1" size="20" maxlength="15"
placeholder="必须填写用户名"> <br> 登录密码: <input type="password"
name="password1" size="20" maxlength="15"> <br> 确认密码: <input
type="password" name="confirmPassword" size="20" maxlength="15">
<br> <input type="submit" name="submit" value="注册"> <input
type="button" name="back" value="返回"
onclick="window.location.href='login.html'">
</form> </body>
</html>
然后是后端register.php
<?php
include "../../../Common/dataBase.php"; if (empty ( $_POST )) {
exit ( "您提交的表单数据超过post_max_size!<br>" );
} // 判断输入密码与确认密码是否相同
$password1 = $_POST ['password1'];
$confirmPassword = $_POST ['confirmPassword'];
if ($password1 != $confirmPassword) {
exit ('两次输入的密码不相同!<a href ="../View/register.html">返回重试</a>');
} $username1 = $_POST ['username1']; // 判断用户名是否重复
$usernameSQL = "select * from userrg where username1 = '$username1'";
$resultSet = mysqli_query ($conn, $usernameSQL ); $row = mysqli_fetch_array($resultSet);
//判断用户名是否存在
if ($username1 == $row['username1']) {
die ('用户名被占用,请更换其他用户名<a href ="../View/register.html">返回重试</a>');
}else{ $sql = "insert into userrg (username1,password1,confirmPassword)
values ('$username1','$password1','$confirmPassword')";
mysqli_query ($conn,$sql);
// 注册成功跳转到登录界面
die ('注册成功!点击此处<a href="../View/login.html">登录</a>');
} ?>
然后就没了。
- 面向对象
你居然没走?真的机智!机智如我~ :)
说明一下,以上是其实不是最初的版本,是改了好多次之后的终于变成我自己代码的代码。
接下来是我学习了面向对象之后,对原来代码的修改。
我师傅说虽然是写成了一个个类文件,但是还是有点面向过程的思维,我自己也觉得是这样子,我也不敢说,我也不敢问,我就是个年幼的程序猿。
话不多说,直接上代码。
注意:登录的注册功能还应用了两个文件。我会在末尾也贴出来。
登录处理代码Login.php
<?php
//namespace A;
//use A\User;
/**
* Login类
*/
require_once '../../Back/User/User.php';
include '../../MySQLDB.php'; class Login extends User
{
function __construct()
{
} public function check($usernm, $userpwd)
{ $arr = array(
'dbname' => 'newpage'
);
$db = MySQLDB::getInstance($arr);
$sql = "select uid from new_user where usernm='$usernm' and userpwd='$userpwd' limit 1";
if ($result = $db->fetchArray($sql) ) {
echo $usernm . "欢迎您,点击<a href='../Article/list.php'>此处</a>跳转主页";
} else
die("密码错误");
}
} $usernm = $_POST['usernm'];
$userpwd = $_POST['userpwd']; $log = new Login();
$log->is_POST();
$a = $usernm;
$b = $userpwd;
$log->is_empty($a, $b);
$log->check($a, $b); ?>
注册处理代码Register.php
<?php
// namespace User\Register; require_once '../../Back/User/User.php';
include '../../MySQLDB.php';
//var_dump($_POST['usernm']);
//var_dump($_POST['userpwd']); /**
* Register类
*/
class Register extends User
{
#注册账户方法
function __construct()
{ // $usernm= $_POST['usernm'];
// $userpwd=$_POST['userpwd'];
// $userrepwd=$_POST['userrepwd']; } #判断两次输入的密码是否相同
public function pwdSame()
{
$userpwd = $_POST['userpwd'];
$userrepwd = $_POST['userrepwd'];
if ($userpwd != $userrepwd) {
die ("两次输入的密码不相同!请重试!");
} } #将用户信息写入数据库
public function query()
{
$usernm = $_POST['usernm'];
$userpwd = $_POST['userpwd'];
$createtime = date("Y-m-d H:i:s", time());
$arr = array(
'dbname' => 'newpage'
);
$db = MySQLDB::getInstance($arr);
$sql = "insert into new_user (usernm,userpwd,createtime) value ('$usernm','$userpwd','$createtime')";
if ($result = $db->my_query($sql)) {
die('注册成功!点击此处<a href="../Login/Login.html">登录</a>');
} else
return false;
} #加载选择数据库信息方法
public function dbname()
{
}
} $usernm = $_POST['usernm'];
$userpwd = $_POST['userpwd']; $reg = new Register();
$a = $usernm;
$b = $userpwd;
$reg->is_empty($a, $b); $reg->is_POST();
$reg->pwdSame();
$reg->is_repeat();
$reg->query(); ?>
附件1:User.php
<?php
/**
* Created by PhpStorm.
* User: ts-jinjinying
* Date: 2019/6/13
* Time: 10:40
*/ //namespace A; /**
* User类
*/
class User
{
/**
* 用户类的属性
* @param string $usernm 用户名
* @param int $uid 用户ID
* @param string $userpwd 密码
* @param string $userrepwd
* @param datetime $createtime 创建时间
*/
public $usernm;
public $uid;
public $userpwd;
public $userrepwd;
public $createtime; #初始化对象属性
public function __construct($usernm, $userpwd)
{
$this->usernm = $usernm;
$this->userpwd = $userpwd;
} #判断是否提交
public function is_POST()
{
if (!(isset($_POST['submit']))) {
return false;
}
} #判断是否为空
public function is_empty($a, $b)
{
if (empty($a && $b))
die("用户名或密码不能为空");
} #判断用户名是否重复
public function is_repeat()
{
$usernm = $_POST['usernm'];
$arr = array(
'dbname' => 'newpage'
);
$select = MySQLDB::getInstance($arr);
$usernmSql = "select * from new_user where usernm = '$usernm'"; $row = $select->fetchRow($usernmSql);
if ($usernm == $row['usernm']) {
die("用户名被占用,请更换其他用户名!");
} else {
echo "用户名合法!";
}
} #注销方法
public function logout()
{
if ('合法') {
echo "注销成功";
} else
return false;
} function __destruct()
{
}
}
附件2:MySQLDB.php
<?php
/**
* Created by PhpStorm.
* User: ts-jinjinying
* Date: 2019/6/14
* Time: 8:51
*/ /**
* Class MySQLDB
* MySQLDB工具类
*/
class MySQLDB
{
//定义相关的属性
private $host;//主机地址
private $port;//端口号
private $user;//用户名
private $pass;//密码
private $charset;//字符集
private $dbname;//数据库名
//运行时需要的属性;
private $link;//保存连接资源
private static $instance;//用于保存对象 /**
* MySQLDB constructor.
* @param $arr
* 构造方法
*/
private function __construct($arr)
{
//初始化属性的值
$this->init($arr);
//连接数据库
$this->my_connect();
//选择默认字符集
$this->my_charset();
//选择默认数据库
$this->my_dbname();
} /**
* 获得单例对象的公开的静态方法
* @param array $arr 传递给构造方法的参数
*/
public static function getInstance($arr)
{
if (!self::$instance instanceof self) {
self::$instance = new self($arr);
}
return self::$instance;
} private function init($arr)
{
$this->host = isset($arr['host']) ? $arr['host'] : '127.0.0.1';
$this->port = isset($arr['port']) ? $arr['port'] : '3306';
$this->user = isset($arr['user']) ? $arr['user'] : 'root';
$this->pass = isset($arr['pass']) ? $arr['pass'] : '';
$this->charset = isset($arr['charset']) ? $arr['charset'] : 'utf8';
$this->dbname = isset($arr['dbname']) ? $arr['dbname'] : '';
} /**
* 连接数据库
*/
private function my_connect()
{
//如果连接成功,就将连接资源保存到$link属性里面
if ($link = @mysqli_connect("$this->host:$this->port", "$this->user", "$this->pass")) {
$this->link = $link;
} else {
//连接失败 echo "数据库连接失败!<br/>";
echo "错误编号:", mysqli_errno($this->link), "<br/>";
echo "错误信息:", mysqli_error($this->link), "<br/>";
// die;
return false;
}
} /**
* 错误调试方法,执行一条sql语句
*/ public function my_query($sql)
{
$result = mysqli_query($this->link, $sql);
if (!$result) {
//执行失败
echo "SQL语句执行失败<br/>";
echo "错误编号:", mysqli_errno($this->link), "<br/>";
echo "错误信息:", mysqli_error($this->link), "<br/>";
// die;
return false;
}
return $result;
} /**
* 返回多行多列的查询结果
* @param string $sql 一条sql语句
* @return mixed array|false
*/
public function fetchAll($sql)
{
//先执行sql语句
if ($result = $this->my_query($sql)) {
//执行成功
//遍历资源结果集
$rows = array();
while ($row = mysqli_fetch_assoc($result)) {
$rows[] = $row;
}
//释放结果集资源
mysqli_free_result($result);
//返回所有的数据
return $rows;
} else {
return false;
}
} /**
* 返回一行的查询结果
* @param string $sql 一条sql语句
* @return mixed array|false
*/
public function fetchRow($sql)
{
//先执行sql语句
if ($result = $this->my_query($sql)) {
//执行成功
$row = mysqli_fetch_assoc($result);
mysqli_free_result($result);
//返回这一条记录的数据
return $row;
} else {
return false;
}
} /**
* 返回单行单列的查询结果(单一值)
* @param string $sql 一条sql语句
* @return mixed string|false
*/
public function fetchColumn($sql)
{
//执行sql语句
if ($result = $this->my_query($sql)) {
//执行成功
$row = mysqli_fetch_row($result);
//释放结果集资源
mysqli_free_result($result);
//返回这个单一值
return isset($row[0]) ? $row[0] : false;
} else {
//执行失败
return false;
}
} /**
* @param $sql
* @return array|bool|null
* 返回遍历数据表的所有数据
*/
public function fetchArray($sql)
{
//执行sql语句
if ($result = $this->my_query($sql)) {
//执行成功
//遍历资源结果集
$rows = array(); while($row = mysqli_fetch_array($result)){
$rows[]= $row;
}
//释放结果集资源
mysqli_free_result($result);
//返回所有数据
return $rows;
} else
return false;
} /**
* 选择默认的字符集
*/
private function my_charset()
{
$sql = "set names $this->charset";
$this->my_query($sql);
} /**
* 选择默认数据库
*/
private function my_dbname()
{
$sql = "use $this->dbname";
$this->my_query($sql);
} /**
* 析构方法
*/
public function __destruct()
{
//释放额外的数据库连接资源
mysqli_close($this->link); // TODO: Implement __destruct() method.
} /**
* __sleep方法,序列化对象的时候自动调用
*/
public function __sleep()
{
//返回一个数组,数组内的元素为需要被序列化的属性名的集合
return array('host', 'port', 'user', 'pass', 'charset', 'dbname'); // TODO: Implement __sleep() method.
} /**
* __wakeup方法,反序列化一个对象的时候自动调用
*/
public function __wakeup()
{
/**数据库相关初始化操作*/ //连接数据库
$this->my_connect();
//选择默认字符集
$this->my_charset();
//选择默认数据库
$this->my_dbname();
} /**
* 私有化克隆模式方法,防止通过克隆得到一个新的对象
*/
private function __clone()
{
// TODO: Implement __clone() method.
} public function __set($name, $value)
{
// TODO: Implement __set() method.
} public function __get($name)
{
// TODO: Implement __get() method.
} public function __unset($name)
{
//什么都不做,表示不能删除任何属性
} public function __isset($name)
{
// TODO: Implement __isset() method.
}
}
上面的代码中有些本文没有说明,以后有机会会一一说明,也是对我自己代码的复盘。
新人练手小项目的分享,一方面是记录自己的学习,一方面分享给别的正在入门的朋友。
这个标签还会坚持下去。
tails:第0000 0000 0000 00篇
php学习历程1——注册、登录(面向过程、面向对象)的更多相关文章
- php连接数据库的两种方式- 面向过程 面向对象
php连接数据库的两种方式- 面向过程 面向对象 一.面向对象1. 链接数据库$conn = @new mysqli("127.0.0.1","root", ...
- C语言学习系列(二)面向过程和面向对象
一.基本定义 (一).面向过程(procedure oriented programming POP) 面向过程是分析解决问题的步骤,然后用函数把这些步骤一步一步的实现,然后在使用的时候一一调用则可. ...
- 【java基础】面向过程~面向对象
相信大家都知道这两个东西,可是大家是如何知道的呢?我们又该如何区分这个东西到底是面向过程还是面向对象的呢? 那,我们首先就要知道什么是面向过程,什么是面向对象: 面向过程"(Procedur ...
- 面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期
1.面向对象主要涉及 构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联 ...
- 2017 5 31 php面向过程 面向对象1
面向过程的语法定义变量:定义函数:使用变量(输出,赋值,等)调用函数:流程控制(if,switch,for,while等) 面向对象的语法1,定义类:定义类的语法中,只有这3种代码:1.1定义属性(变 ...
- JS学习笔记 - 普通选项卡(面向过程)
疑问: 1. getElementsByTagName 和 getElementsByClassName 的区别? 分别在什么应用场景? <!DOCTYPE html> <h ...
- Net基础篇_学习笔记_第十一天_面向对象(面向过程与面向对象的区别/类的概念)
1.面向过程-----> 面向对象 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 把大象塞进冰箱里1.打开冰箱门2.把大象塞进去,亲下大象的屁股3.关闭冰箱门 孙全 瘦小 ...
- js面向过程改写成面向对象--通用方法
响亮的标题:一个万能的,保底的.面向过程改写成面向对象的方法 前提朗读:很多刚接触js面向对象的时候都不知道如何能快速的写出一个面向对象的程序,这个是必然的现象,不是每一位学js的一上来就会写面向对象 ...
- python学习笔记:第15天 初识面向对象
目录 1. 面向对象和面向过程 2. 面向对象如何编写: 3. 面向对象的三大特征 封装 继承 多态 1. 面向对象和面向过程 面向对象和面向过程的理解: ⾯向过程: ⼀切以事物的流程为核⼼. 核⼼是 ...
随机推荐
- Python实用黑科技——解包元素(2)
需求: 前面的文章讲的是使用变量的个数需要和迭代器数据变量的元素个数相同的方法,但更多的时候确实不想根据元素个数n来定义相应多的变量,而是希望用较少的变量( def drop_first_last(g ...
- 解决 go get golang.org/x/* 拉取失败问题
go get -u -v golang.org/x/text 有时候会因为网络问题,导致失败. 在不用代理的情况下,可以使用以下方案. golang.org,他们在github上有一个镜像库 以 go ...
- List对象遍历时null判断
使用for循环遍历list处理list元素时,对null值判断: 1.list为null时空指针异常 2.list不为空,但是list.size()=0时,不执行for循环内代码块 3.list.si ...
- Java中可变参数
从java5开始出现了可变参数,这是对java方法及数组的拓展! 方法中可以接受的参数不再是固定个数的,而是随着具体需求传递的多少来决定. 定义格式: 返回值类型 方法名(参数类型 ... 形式参数 ...
- JAVA之工作线程数究竟要设置多少
一.需求缘起 Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设 ...
- docker安装redis,并用配置启动
1.拉取redis镜像 docker pull redis 2.创建redis本地配置文件 ①.去redis官网下载redis,获取redis.conf文件 ②.修改redis.conf文件相关配置, ...
- 2 ArrayList 详解
List 是有序.可重复的容器.List中每个元素都有索引标记,可以根据元素的索引标记访问元素,从而精确控制这些元素. List 接口常用的实现类:ArrayList.LinkedList.Vecto ...
- Resharper错误提示方法的命名
Resharper-->Options-->C#-->Naming Style
- 封装带SSH跳板机的REDIS
一.封装ssh的redis 二.setting的配置 三.应用示例 import redis from sshtunnel import SSHTunnelForwarder from conf.se ...
- Sublime text3中文版 无法安装插件There are no packages available for installation问题的解决。
说起来差点没被气死,我当时的情况已经是要疯了,连他们的域名都ping不通,我还想着,咋地,要倒闭了? 首选项->插件设置->Package Control->默认 里边的这个配置项 ...