首先放一张天空之城

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篇

最新文章

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

热门文章

  1. trie树(字典树)的部分简单实现
  2. deepin linux安装为知笔记
  3. Liferay使用Structure和Template制作Video Portlet
  4. Redis订阅广播实现多级缓存
  5. django 快速实现文件上传(四)
  6. redis基础操作概念等笔记
  7. Java实验报告(一)
  8. 微pe安装原版win10怎么装|wepe安装原版win10 1803教程
  9. LC 794. Valid Tic-Tac-Toe State
  10. selenium 学习中遇到的问题汇总