三篇文章带你极速入门php(三)之php原生实现登陆注册
看下成果
ps:纯天然h5,绝不添加任何添加剂(css)以及化学成分(js)(<( ̄ ﹌  ̄)我就是喜欢纯天然,不接受任何反驳)

关于本文
用原生的php和html做了一个登陆注册,大概是可以窥见一般php开发的样子了。不过,low的地方区别提前说一下:
- 这个是多入口,一般程序都是单入口,单入口就是统一通过index.php进入,然后再引入其他文件,调用其代码,多入口就是每次通过不同文件进入(比如一会展示的login.php和register.php)
- 保留登陆信息用的是session,现在普遍是前后端分离,一般用cookie或者redis实现session的功能,很少直接使用session的
- 连接mysql使用的是mysqli,没有做封装,也没有使用pdo,除了能用没有其他优点了
- 这种样子的代码大概是上世纪的风格了,MVC都没用,看一看好了,真的开发再不济也要MVC分一下层
- 性能杠杆的,不要信任何框架的吹嘘,就性能而言,没有任何框架快得过原生。
准备工作
emmmm,首先用nginx或者Apache创建一个站点指向本地代码的目录,然后在host里配置127.0.0.1指向该站点。(这个就不教了啊,之前讲过),然后是一个user库的sql,和登陆和注册的前端代码页面(不好意思说这是代码):
- sql
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`username` varchar(64) NOT NULL DEFAULT '' COMMENT '账号',
`password` varchar(64) NOT NULL DEFAULT '' COMMENT '密码',
`nickname` varchar(64) NOT NULL DEFAULT '' COMMENT '昵称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
- login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="login.php" method="post">
账 号 <input type="text" name="username"> <br>
密 码 <input type="password" name="password"> <br>
<button type="submit">提交</button>
</form>
<a href="register.html">没有账号?注册</a>
</body>
</html>
- register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
<form action="register.php" method="post">
账 号 <input type="text" name="username"> <br>
密 码 <input type="password" name="password"> <br>
昵 称 <input type="text" name="nickname"> <br>
<button type="submit">注册</button>
</form>
</body>
</html>
正文
- 首页index.php
假设我们的网站有个首页,需要判断用户是否登陆,登陆就欢迎他,没有登陆就让他去登陆,这个思路我们这么写
<?php
session_start();
if (!$_SESSION['nickname']) {
header("location:login.html");
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
Hello <?php echo $_SESSION['nickname'] ?>
</body>
</html>
- 这行session_start() 是开启session,必须在最开始写,保证我们可以使用session相关的功能
- 如果当前session里没有存用户的昵称,那我们就认为该用户没有登陆,跳转到登陆界面
- 跳转是通过header的方式,参数重location后边是目标地址
- 这段代码可以镶嵌在.php文件的html代码的任何一个地方,echo出来的字符在html中具有等同的功能
- 这样的就是前后端代码混杂,如果项目庞大之后非常难于维护
- 登陆部分login.php
这部分处理登陆请求,假设用户输入了账号密码这样的数据(前端和后端都应该对数据进行校验和处理,本文略去),然后拿到用户信息,判断用户密码是否正确,让用户成功登陆或者重新输入。
<?php
session_start();
$username = $_POST['username'];
$password = $_POST['password'];
$password_md5 = md5('study'.$password);
//连接mysql
$db = new MySQLi("localhost","root","root","allcanadmin",'8889');
$sql = "select * from `user` where `username`= '{$username}'";
$res = $db->query($sql);
$user = $res->fetch_array();
if ($password_md5 == $user['password']){
$_SESSION['nickname'] = $user['nickname'];
header("location:index.php");
}else{
header("location:".getenv('HTTP_REFERER'));
}
- 首先也是启用了session,因为登陆登陆成功之后要通过session保存用户信息这样才能在其他页面确认用户是已经登陆的状态了。
- $_POST和$_GET是php自带的两个全局数组,保存了当前请求的post和get参数,比如这次登陆请求的from表单的传递用户名的input标签的name=username,并且请求方式是post,该参数就会在$_POST数组中,key是input标签的name,value是input标签的value。
- 业界通用的一个操作,服务器不要存用户的明文密码。本文通过用一个字符串拼接然后计算md5之后再保存(这只是一个比较简单的方式)
- new MySQLi(地址,用户名,密码,库名,端口) 创建一个mysqli对象(mysqli是一个更安全更好用的替代原来mysql的扩展,mysql扩展已被弃用),这个对象可以操作mysql库。
- $res = $db->query($sql); mysqli的对象$db运行query方法,执行参数的sql语句,这里的sql是查询用户名为用户输入用户名的数据,保存在结果对象$res里,再通过结果对象的fetch_array()方法,获取到结果保存为一个数组。
- getenv('HTTP_REFERER') 获取环境变量,这里是取到上一个页面地址,用来做返回,如果用户登陆失败,返回到登陆界面。
- 注册部分register.php
这部分处理注册业务,注册理论上要控制用户名不能重复,可以通过mysql唯一索引或者代码处查询的方式保证唯一,本文采用查询的方式。
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$password_md5 = md5('study'.$password);
$nickname = $_POST['nickname'];
$db = new MySQLi("localhost","root","root","allcanadmin",'8889');
$sql_select = "select * from `user` where `username`= '{$username}'";
$res_select = $db->query($sql);
if ($res_select){
header("location:".getenv('HTTP_REFERER'));
}
$sql = "insert into `user` (`username`,`password`,`nickname`) VALUES ('{$username}','{$password_md5}','{$nickname}')";
$res = $db->query($sql);
if ($res){
header("location:login.html");
}else{
header("location:".getenv('HTTP_REFERER'));
}
看懂登陆,注册实现就很容易了,查找不到这个账号则表明该账号是可以注册的,新增一条数据就好了。
写在最后
三篇文章极速php算是写完了,大致的流程是这样
- 学一些简单的php语法(真心觉得php语法不用专门学,用到什么查什么 http://php.net/manual/zh/index.php 无所不能),能看懂就行了
- 装一下环境,开发环境用集成的就行,生产环境咱也碰不到啊
- 做个小demo,登陆注册真是不能再简单了,搬砖的工作大多也就是这样了,拿参数,走业务,跑sql,反结果。
ps:既然都看到这里了,不如顺便论述一下php的意义。我个人看法,抛去公司接手的是祖传代码这个情况之外,php作为一个快速迭代的语言选择是绝对没有问题的,用在项目初期或者创业型项目是最佳选择,更不用说如果做一些cms或者内容展示的项目,php根本就是为之而生的。不论是php是世界上最好的语言还是php已死,都是站在一个角度上的偏见,在不是很小的一个范围里,php还是一个很优的选择。
学一手php,怎么看都是不亏的。
三篇文章带你极速入门php(三)之php原生实现登陆注册的更多相关文章
- 三篇文章带你极速入门php(一)之语法
本文适合阅读用户 有其他语言基础的童鞋 看完w3cschool语法教程来回顾一下的童鞋(传送门,想全面看一下php语法推荐这里) 毫无基础然而天资聪慧颇有慧根(不要左顾右看说的就是你,老夫这里有一本& ...
- 三篇文章带你极速入门php(二)之迅速搭建php环境
前言 今天讲一下php在windows,mac,linux上的集成环境搭建,目标是简单快速,环境这个事得对号入座,windows用phpstudy,mac用mamp,linux用lnmp一键安装,直接 ...
- 三篇文章了解 TiDB 技术内幕 —— 谈调度
任何一个复杂的系统,用户感知到的都只是冰山一角,数据库也不例外. 前两篇文章介绍了 TiKV.TiDB 的基本概念以及一些核心功能的实现原理,这两个组件一个负责 KV 存储,一个负责 SQL 引擎,都 ...
- 三篇文章了解 TiDB 技术内幕 - 说存储(转)
引言 数据库.操作系统和编译器并称为三大系统,可以说是整个计算机软件的基石.其中数据库更靠近应用层,是很多业务的支撑.这一领域经过了几十年的发展,不断的有新的进展. 很多人用过数据库,但是很少有人实现 ...
- jq最新前三篇文章高亮显示
/*---------最新前三篇文章高亮显示-------------*/ function latest(){ var color_arr=new Array( "blue", ...
- 两篇文章带你走入.NET Core 世界:Kestrel+Nginx+Supervisor 部署上云服务器(二)
背景: 上一篇:两篇文章带你走入.NET Core 世界:CentOS+Kestrel+Ngnix 虚拟机先走一遍(一) 已经交待了背景,这篇就省下背景了,这是第二篇文章了,看完就木有下篇了. 直接进 ...
- 三篇文章了解 TiDB 技术内幕——说计算
在这我们将关系模型简单理解为 Table 和 SQL 语句,那么问题变为如何在 KV 结构上保存 Table 以及如何在 KV 结构上运行 SQL 语句. 假设我们有这样一个表的定义: CREATE ...
- TIDB4 —— 三篇文章了解 TiDB 技术内幕 - 谈调度
原文地址:https://pingcap.com/blog-cn/tidb-internal-3/ 为什么要进行调度 先回忆一下第一篇文章提到的一些信息,TiKV 集群是 TiDB 数据库的分布式 K ...
- 两篇文章带你走入.NET Core 世界:CentOS+Kestrel+Ngnix 虚拟机先走一遍(一)
背景: 上一篇:ASP.Net Core on Linux (CentOS7)共享第三方依赖库部署 已经交待了背景,这篇就省下背景了. 折腾的过程分两步: 第一步是:本机跑虚拟机部署试一下: 第二步是 ...
随机推荐
- 超详细的Web前端开发规范文档
规范目的为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发. 本文档如有不对或者不合 ...
- SpringMVC参数绑定(四)
1.默认支持的参数类型 处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值. HttpServletRequest 通过request对象获取请求信息 HttpServletResponse ...
- Windows和Mac上NodeJS和Express的安装
一.安装NodeJS,官网上下载,https://nodejs.org/en/ 直接下一步安装就行了. 打开命令行工具,输入 node -v 则会出现node的版本,则成功了. 下面我们介绍如何安装e ...
- 【ARTS】01_10_左耳听风-20190114~20190120
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- C++学习5-面向对象编程基础(构造函数、转换构造、静态数据成员、静态成员函数、友元)
知识点学习 类 const作用 C语言的const限定符的含义为"一个不能改变值的变量",C++的const限定符的含义为"一个有类型描述的常量": const ...
- imp高版本的dmp文件报错问题
imp高版本的dmp文件报错问题 导出方:oracle 11R2 www.2cto.com 导入方:oracle 10R2 通过imp导入时提示如下: 解决方法: 通过编 ...
- zabbix实现对tomcat的监控
zabbix实现对tomcat的监控 工作原理 比如:当Zabbix-Server需要知道java应用程序的某项性能的时候,会启动自身的一个Zabbix-JavaPollers进程去连接Zabbix- ...
- svn使用openldap验证apache访问方式
启用svn服务器的sasl验证机制 1.安装cyrus-sasl认证包 # yum install -y *sasl* # rpm -qa|grep sasl cyrus-sasl-2.1.23-15 ...
- Ubungu 18.04安装MySQL 5.7.24
Ubuntu 18.04,mysql Ver 14.14 Distrib 5.7.24, for Linux (x86_64), USERNAME@USERNAME-VirtualBox:~$ sud ...
- 测试开发之Django——No7.Django模板中的过滤器
1.add 将参数添加到值. 例如: {{ value|add:"2" }} 如果value是4,那么输出将是6. 此过滤器将首先尝试将两个值强制转换为整数.如果失败,它将尝试将值 ...