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篇
最新文章
- UML 类图常用表示方法.
- PostgreSQL的9.4已经发布(译)
- 一个服务器上面配置多个IP ,实现指定IP的域名请求
- JAVA 判断一个字符串是不是一个合法的日期格式
- fedora 关闭、禁止selinux
- Javascript多线程引擎(五)
- MongoDB系列六(聚合).
- Android device debug (adb) by Charge Only mode
- MySQL优化查询 5.7版本
- Java高级特性 第12节 XML技术
- WPFの阴影效果
- 【转】Android系统开篇
- Effective C++学习笔记之explicit
- 列表的pop()和路径拼接问题
- MySQL调研笔记1:MySQL调研清单
- gitlab svlogd runsv 基于Rotated Log的日志统计
- HTML标签(持续更新)
- 在vue-cli中使用layer中的layData日期组件
- Tree - AdaBoost with sklearn source code
- cnblogs用户体验及建议