1.数据库users.sql
-- phpMyAdmin SQL Dump
-- version 4.7.9
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1:3306
-- Generation Time: 2018-12-22 08:08:49
-- 服务器版本: 5.7.21
-- PHP Version: 5.6.35
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `users`
--
-- --------------------------------------------------------
--
-- 表的结构 `account`
--
DROP TABLE IF EXISTS `account`;
CREATE TABLE IF NOT EXISTS `account` (
`userName` text NOT NULL,
`password` text NOT NULL,
`email` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- 转存表中的数据 `account`
--
INSERT INTO `account` (`userName`, `password`, `email`) VALUES
('123', '123456', '123@qq.com'),
('111', '111111', '11@qq.com');
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
2.注册前台register.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>注册前台页面</title>
</head>
<body>
<form method="post" action="clregister.php">
用户名:<input type="text" name="userName"><br/>
注册密码:<input type="password" name="password"><br/>
注册邮箱:<input type="text" name="email"><br/>
<input type="submit" value="注册">
</form>
</body>
</html>
注册处理页面后台clregister.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>处理前台注册页面</title>
</head>
<body>
<?php //(mysqli-面向过程)
//建立数据库说明:数据库名:users,表名:account,字段名(列)userName 类型text长度20,password类型text长度20,email类型text
//第一种连接方法
//$dbServername="localhost";
//$dbUserName="root";
//$dbPassword="123";//如果密码没有的话:$dbPassword="";
//$dbName="users";
//连接数据库 mysql是数据库,i代表improvement,相当于mysql的增强版
//$conn=mysqli_connect($dbServername,$dbUserName,$dbPassword,$dbName);
//一般使用如下连接:
//创建连接
//mysql是数据库,i代表improvement,相当于mysql的增强版
$conn=mysqli_connect('localhost','root','123','users');
//检测连接
if(!$conn)
{
//die输出错误,connect failed是自定义的错误信息,.mysqli_connect_error()是系统自身的错误信息,可以不写只用自己的
die("connect failed".mysqli_connect_error());
}
else
{
echo "连接成功(connect success)!"; //连接成功就提示connect success
}
//插入数据
//定义一个 $sql 变量,用来存放写的sql语句
//插入到account数据表,account()里面是字段名,也可以不写,values不要忘了加s
//$sql="insert into account(userName,password,email) values('xiaoming','123456','123@qq.com')";//注意:外面用了双引号里面就要用单引号,为了好看在values前可以加个换行
//也可以用变量$userName
//$userName="xiaohua";
//用变量 values()里面也要用单引号'$userName'
//$sql="insert into account(userName,password,email) values('$userName','123456','123@qq.com')";
//接收网页提交过来的form表单
//$_POST是超全局变量,['']里面的值是form表单内控件的name的命名
//$_POST['userName']
$userName=$_POST['userName'];//前面的$userName的名字可以和后面的$_POST['userName']的名字不一样,她不是同一个东西,起一样的名字可以一目了然,一看就知道传给哪一个
$password=$_POST['password'];
$email=$_POST['email'];
if(empty($userName) || empty($password) || empty($email) ){
echo "<script>alert ('用户名或密码或邮箱不能为空');window.location.href='register.php'</script>";
}
else{
//定义一个 $sql 变量,用来存放写的sql语句
$sql="insert into account(userName,password,email)
values('$userName','$password','$email')";
//使用query()函数把$sql传到数据库里,query请求的意思
//query的第一个参数是已经建立的连接($conn),用来区分连接的哪个数据库,连接里面已经指定了users,就会在users这个数据库里面找account数据表,增加这样一条记录
//query的第二个参数是sql语句,也可以直接把 insert into account(userName,password,email) values('xiaoming','123456','123@qq.com') 加到里面,不过不好修改
//如果插入成功
if(mysqli_query($conn,$sql))
{
echo "insert success";
}
else
{
echo "insert failed";
}
}
?>
</body>
</html>
3.注册和处理在一个页面,代替上面的整个2 registerAndClRegister.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>注册前台和提交给自己处理后台</title>
</head>
<body>
<?php //(mysqli-面向过程)
//PHP里面是不用声明的,但是不初始化后面可能会出现未定义的变量
//6.
//初始化一个变量
$isInfoCanUse=false;//是信息可用=否
//8.
初始化变量
$userName=$password=$email="";
$userNameErr=$passwordErr=$emailErr="*必填项目*";
//9.
//处理信息函数
function dealInfo($data)
{
//trim()函数用来去掉字符串里的空格
$data=trim($data);
//把返回值在赋给$data
$data=htmlspecialchars($data);
//slashes斜杠的意思(\)
$data=stripslashes($data);
return $data;
}
//7.
//检测提交信息是否为空
if($_SERVER['REQUEST_METHOD']=="POST")
{
$isInfoCanUse=true;
//empty()这个函数用来检验变量是否为空
if(empty($_POST['userName']))//判断信息是否完整
{
$isInfoCanUse=false;
$userNameErr="*用户名不能为空*";
}
else
{
//PHP里面使用preg_match()函数来使用正则表达式,第一个参数是正则表达式的字符串,第二个参数是要匹配的变量
if(!preg_match("/^[\w]*$/",$_POST['userName']))
{
$userNameErr="*只允许字母和数字*";
$isInfoCanUse=false;
}
else
{
//$userName=$_POST['userName'];
//9.
$userName=dealInfo($_POST['userName']);
}
}
if(empty($_POST['password']))
{
$isInfoCanUse=false;
$passwordErr="*密码不能为空*";
}
else
{
if(!preg_match("/(\w{6,14})/",$_POST['password']))
{
$passwordErr="*密码长度6~14*";
//必须要有下面的这句话,阻止提交
$isInfoCanUse=false;
}
else
{
//$password=$_POST['password'];
//9.
$password=dealInfo($_POST['password']);
}
}
if(empty($_POST['email']))
{
$isInfoCanUse=false;
$emailErr="*邮箱不能为空*";
}
else
{
if(!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$_POST['email']))
{
$emailErr="*非法邮箱格式*";
$isInfoCanUse=false;
}
else
{
//$email=$_POST['email'];
//9.
$email=dealInfo($_POST['email']);
}
}
}
//$_SERVER超全局变量,SERVER服务的意思
//REQUEST_METHOD请求方式
//如果以POST方式提交才执行
//5.
if($_SERVER['REQUEST_METHOD']=="POST" && $isInfoCanUse==true)
{
//1.
//创建连接
$conn=mysqli_connect('localhost','root','123','users');
//2.
if(!$conn)
{
die("connect failed".mysqli_connect_error());
}
else//连接成功
{
echo "connect success!";
}
//10.
//检测用户名是否存在
//查找userName字段从account表里,条件是userName='$userName',前面的userName是数据库里面的字段名,后面的$userName'是填入的注册数据
$sql="select userName from account where userName='$userName'";//注意:查找到和查找不到都是执行成功了
//$result变量接受结果,来判断数据库里面是否有
$result=mysqli_query($conn,$sql);//无论查找成功与否,都是执行成功,返回的是结果集
//mysqli_fetch_还有别的,这里只是 转换成关联数组
$test=mysqli_fetch_assoc($result);//返回false代表查找失败
if($test !=false)
{
$userNameErr="用户名已存在";
}
else
{
$sql="insert into account(userName,password,email)
values('$userName','$password','$email')";
//4.
//如果插入成功
if(mysqli_query($conn,$sql))
{
echo "insert success";
}
else
{
echo "insert failed";
}
}
//3.
//获取网页信息
//$userName=$_POST['userName'];//前面的$userName的名字可以和后面的$_POST['userName']的名字不一样,她不是同一个东西,起一样的名字可以一目了然,一看就知道传给哪一个
//$password=$_POST['password'];
//$email=$_POST['email'];
//定义一个 $sql 变量,用来存放写的sql语句
//$sql="insert into account(userName,password,email)
//values('$userName','$password','$email')";
//4.
//如果插入成功
//if(mysqli_query($conn,$sql))
//{
// echo "insert success";
//}
//else
//{
// echo "insert failed";
//}
}
?>
<!-- htmlspecialchars 用来防止黑客利用表单攻击服务器-->
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"><!--1.提交给自己registerAndTest.php 2.<\?php echo $_SERVER['PHP_SELF'];?> 不知道自己的文件名是什么用['PHP_SELF']-->
用户名:<input type="text" name="userName">
<?php echo $userNameErr;?><br/>
注册密码:<input type="password" name="password">
<?php echo $passwordErr;?><br/>
注册邮箱:<input type="text" name="email">
<?php echo $emailErr;?><br/>
<input type="submit" value="注册">
</form>
</body>
</html>
4.登录前台和处理界面于一体login.php (加有session)
<?php session_start();?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>登录前台交给自己处理后台</title>
<style>
.error {color: red;}
</style>
</head>
<body>
<?php
//处理信息函数
function dealInfo($data)
{
//trim()函数用来去掉字符串里的空格
$data=trim($data);
//把返回值在赋给$data
$data=htmlspecialchars($data);
//slashes斜杠的意思(\)
$data=stripslashes($data);
return $data;
}
$userName=$password="";//初始化,防止出现未定义就是用的错误
$userNameErr=$passwordErr="";
$isInfoCanUse=false;//信息是否能用
//提交表单之后,是post提交过来的
if($_SERVER['REQUEST_METHOD']=="POST")
{
//用户名
$isInfoCanUse=true;
//用户名是否是空的
if(empty($_POST["userName"]))
{
$userNameErr="用户不能名为空";
$isInfoCanUse=false;
}
else
{
$userName=dealInfo($_POST["userName"]);
}
//密码名是否是空的
if(empty($_POST["password"]))
{
$passwordErr="密码不能名为空";
$isInfoCanUse=false;
}
else
{
$password=dealInfo($_POST['password']);
}
}
//连接数据库
$conn=mysqli_connect('localhost','root','123','users');
if(!$conn)
{
die("连接失败:".mysqli_connect_error());
}
else
{
//echo "连接成功";
}
//用户名是否存在
if($isInfoCanUse)//信息是否完整
{
$sql="select userName from account where userName='$userName'";
$result=mysqli_query($conn,$sql);
$test=mysqli_fetch_assoc($result);
if($test == false)//关联数组失败
{
$userNameErr="用户名不存在";
}
else
{
//密码是否正确
$sql="select userName,password from account
where userName='$userName' and password='$password'";
$result=mysqli_query($conn,$sql);
$test=mysqli_fetch_assoc($result);
if($test == false)//关联数组失败
{
$passwordErr="密码不正确";
}
else
{
//存入session会话
//把用户名存入session
$_SESSION['userName']=$userName;
//echo "成功登陆";
//这里写登陆成功要做的事情,例如
//页面跳转
echo "<script type=\"text/javascript\">";
echo "window.location.href='homepage.php';";//返回上一个页面
echo "</script>";
}
}
}
?>
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
<p>用户名:
<input type="text" name="userName">
<?php echo "<span class=error>*".$userNameErr."</span>";?>
<br/>
密码:<input type="password" name="password">
<?php echo "<span class=error>*".$passwordErr."</span>";?></p>
<input type="submit" value="登录">
</p>
</form>
</body>
</html>
5.主页homepage.php
<?php session_start();?>
<!-- 如果使用session要在每个页面的 ht最ml 的前面加上 -->
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>测试主页</title>
</head>
<body>
<?php
if(isset($_SESSION['userName']))//如果登录成功
{
$userName=$_SESSION['userName'];
echo "欢迎您:".$userName;
echo '<a href="logout.php"><input type="button" value="注销"/></a>';
}
else
{
echo '<a href="login.php"><input type="button" value="登陆"></a>';
echo '<a href="registerAndTest.php"><input type="button" value="注册"></a>';
}
?>
</body>
</html>
6.安全退出页面logout.php (利用session)
<?php session_start();?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>session安全退出</title>
</head>
<body>
<?php
if(isset($_SESSION["userName"]))
{
session_unset();
session_destroy();
}
header("location:homepage.php");//跳转回去
?>
</body>
</html>