實現後臺登陸前的準備工做
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>
// 省略代碼...
複製代碼