实现后台登陆前的准备工做
include include_once require require_once
- 这四个语句都是用来引入文件
include
和 require
的区别在于, 若是找不到须要引入的文件, include之后的代码, 继续执行, require后面的代码没法执行
include
和 include_once
的区别在于, 屡次引入同一个文件, include会屡次引入, include_once只会引入一次, 好处在于, 能够避免函数重复定义的错误
config.php
配置文件
<?php
$arr = [
'db_host'=>'127.0.0.1',
'db_port'=>'3306',
'db_user'=>'root',
'db_password'=>'root',
'db_name'=>'shop',
'db_prefix'=>'',
'db_charset'=>'utf8'
];
return $arr;
复制代码
db.func.php
数据库的相关函数
<?php
function connect(){
$config = require dirname(__FILE__)."/config.php";
$link = mysqli_connect(
$config['db_host'].':'.$config['db_port'],
$config['db_user'],
$config['db_password'],
$config['db_name']
);
if(!is_null(mysqli_connect_error())){
die('数据库链接错误: '.mysqli_connect_error());
}
return $link;
}
function queryOne($sql){
$link = connect();
$result = mysqli_query($link,$sql);
$data = [];
if($result && mysqli_num_rows($result)>0){
$data = mysqli_fetch_assoc($result);
}
return $data;
}
function queryAll($sql){
$link = connect();
$result = mysqli_query($link,$sql);
$data = [];
if($result && mysqli_num_rows($result)>0){
$data = mysqli_fetch_all($result,MYSQLI_ASSOC);
}
return $data;
}
function getDBPrefix(){
$config = require dirname(__FILE__)."/config.php";
return $config['db_prefix'];
}
function execute($sql){
$link = connect();
mysqli_query($link,$sql);
return mysqli_affected_rows($link)>0;
}
复制代码
toos.func.php
工具函数/公共函数
<?php
function setSession($key, $value, $prefix = '') {
session_id() || session_start();
if (!empty($prefix)) {
$_SESSION[$prefix][$key] = $value;
} else {
$_SESSION[$key] = $value;
}
}
function getSession($key, $prefix = '') {
session_id() || session_start();
if (!empty($prefix)) {
return isset($_SESSION[$prefix][$key]) ? $_SESSION[$prefix][$key] : '';
} else {
return isset($_SESSION[$key]) ? $_SESSION[$key] : '';
}
}
function deleteSession($key, $prefix = '') {
session_id() || session_start();
if (!empty($prefix)) {
unset($_SESSION[$prefix][$key]);
} else {
unset($_SESSION[$key]);
}
}
function setInfo($info) {
setSession('info', $info, 'system');
}
function getInfo() {
$info = getSession('info', 'system');
deleteSession('info', 'system');
return $info;
}
function hasInfo() {
return !empty(getSession('info', 'system'));
}
复制代码
后台登陆的实现
引入文件
<?php
require_once '../db.func.php';
require_once '../tools.func.php';
复制代码
判断是否点击了登陆, 若是没有登陆, 先不执行php逻辑, 只展现html页面
if(!empty($_POST['adminuser'])){
}
复制代码
链接数据库, 获取表前缀, 接受参数, 拼接sql语句
if (!empty($_POST['adminuser'])) {
$prefix = getDBPrefix();
$adminuser = $_POST['adminuser'];
$adminpass = md5('yunhe_' . md5($_POST['adminpass']));
$sql = "select id,adminuser from {$prefix}admin where adminuser = '{$adminuser}' and adminpass = '{$adminpass}' ";
}
复制代码
执行sql语句, 判断结果, 若是有则更新状态, 跳转index.php,
若是没有, 则保存并展现错误信息...
$result = queryOne($sql);
if ($result) {
setSession('admin',['adminuser'=>$result['adminuser'],'id'=>$result['id']],'admin');
$login_at = date('Y-m-d H:i:s');
$ip = $_SERVER['REMOTE_ADDR'] == "::1"? '127.0.0.1':$_SERVER['REMOTE_ADDR'];
$login_ip = ip2long($ip);
$sql = "update {$prefix}admin set login_at = '{$login_at}', login_ip = '{$login_ip}' where id = {$result['id']}";
execute($sql);
header('location:index.php');
}else{
setInfo('用户名或密码错误');
}
复制代码
在html的代码中, 展现错误信息
// 省略代码...
<div class="card-body">
<p>
<?php if(hasInfo()) echo getInfo(); ?>
</p>
<form method='post'>
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label class="bmd-label-floating">用户名</label>
// 省略代码...
复制代码