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 0010篇

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值