TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码
/
注册
用户名
邮箱
文章目录

PHP 封装MySQL操作函数、魔术常量、封装函数

2020-12-02
/
0 评论
/
68 阅读
/
正在检测是否收录...
12/02

mysql.php

<?php

/**
 * mysql.php mysql系列操作函数
 * @author nianbaibai
 */

/**
 * 连接数据库
 *
 * @return resource 连接成功,返回连接数据库的资源
 */
function mConn()
{
    static $conn = null;
    if ($conn === null) {
        $db = require ROOT . '/lib/config.php';
        $conn = mysqli_connect("$db[host]", "$db[name]", "$db[password]", "$db[databaseName]", "$db[port]");
        mysqli_query($conn, 'set names ' . $db['charset']);
    }

    return $conn;
}

/**
 * 查询的函数
 * @return mixed resoure/bool
 */
function mQuery($sql)
{
    $rs = mysqli_query(mConn(), $sql);
    if ($rs) {
        // mLog($sql);//执行成功的日志,如果需要的可以显示这段
    } else {
        mLog($sql . "\n" . mysqli_error(mConn()));
    }

    return $rs;
}

/**
 * log日志记录功能
 * @param str $str 待记录的字符串
 */
function mLog($str)
{
    $filename = ROOT . '/log/' . date('Ymd') . '.txt';
    $log = "-----------------------------------------\n" . date('Y/m/d H:i:s') . "\n" . $str . "\n" . "-----------------------------------------\n\n";
    return file_put_contents($filename, $log, FILE_APPEND);
}

/**
 * select 查询多行数据
 *
 * @param str $sql select 待查询的sql语句
 * @return mixed select 查询成功,返回二维数组,失败返回false
 */

function mGetAll($sql)
{
    $rs = mQuery($sql);
    if (!$rs) {
        return false;
    }

    $data = array();
    while ($row = mysqli_fetch_assoc($rs)) {
        $data[] = $row;
    }

    return $data;
}

/*$sql = "select * from cat";
print_r(mGetAll($sql));
 */

/**
 * select 取出一行数据
 *
 * @param str $sql 待查询的sql语句
 * @return arr/false 查询成功 返回一个一维数组
 */

function mGetRow($sql)
{
    $rs = mQuery($sql);
    if (!$rs) {
        return false;
    }

    return mysqli_fetch_assoc($rs);
}

/*$sql = "select * from cat where cat_id=1";
print_r(mGetRow($sql));*/

/**
 * select 查询返回一个结果
 *
 * @param str $sql 待查询的select语句
 * @return mixed 成功,返回结果,失败返回false
 */
function mGetOne($sql)
{
    $rs = mQuery($sql);
    if (!$rs) {
        return false;
    }

    return mysqli_fetch_row($rs)[0];
}

/*$sql = "select count(*) from art where cat_id=1";
echo mGetOne($sql);*/
/**
 * 自动拼接insert 和 update sql语句,并且调用mQuery() 去执行sql
 *
 * @param str $table 表名
 * @param arr $data 接收到的数据,一维数组
 * @param str $act 动作 默认为'insert'
 * @param str $where 防止update更改时少加where条件
 * @return bool insert 或者update 插入成功或失败
 */

function mExec($table, $data, $act = 'insert', $where = 0)
{
    if ($act == 'insert') {
        $sql = "insert into $table (";
        $sql .= implode(',', array_keys($data)) . ") values ('";
        $sql .= implode("','", array_values($data)) . "')";
        return mQuery($sql);
    } else if ($act == 'update') {
        $sql = "update $table set ";
        foreach ($data as $k => $v) {
            $sql .= $k . "='" . $v . "',";
        }

        $sql = rtrim($sql, ',') . " where " . $where;
        return mQuery($sql);
    }
}
//$data = array('title'=>'今天的空气' , 'content'=>'空气质量优' , 'pubtime'=>12345678,'author'=>'baibai');
//insert into art (title,content,pubtime,author) values ('今天的空气','空气质量优','12345678','baibai');
//update art set title='今天的空气',conte='空气质量优',pubtime='12345678',author='baibai' where art_id=1;
//echo mExec('art' , $data , 'update' , 'art_id=1');;
//insert into cat (id,catname) values (5 , 'test');

/**
 * 取得上一步insert 操作产生的主键id
 */
function getLastId()
{
    return mysqli_insert_id(mConn());
}

/**
 * 使用反斜线 转义字符串
 * @param arr 待转义的数组
 * @return arr 被转义后的数组
 */

function _addslashes($arr)
{
    foreach ($arr as $k => $v) {
        if (is_string($v)) {
            $arr[$k] = addslashes($v);
        } else if (is_array($v)) {
            $arr[$k] = _addslashes($v);
        }
    }

    return $arr;
}

config.php

<?php
//salt为cookie登录的安全码
return array(
    'host' => 'localhost',
    'name' => 'cs',
    'password' => '123456',
    'databaseName' => 'cs',
    'port' => '3306',
    'charset' => 'utf8',
    'salt' => 'Q!!RN13q&y'
);

func.php

<?php
/**
 *@param str $msg 成功返回的信息
 *@param str $file 跳转的文件名,返回上一页为-1
 *@param int $time 延时跳转的时间,单位秒
 */
function succ($msg, $file = '', $time = 1)
{
    $res = 'succ';
    require ROOT . '/view/admin/info.html';
    if ($file != '') {
        if ($file == '-1') {
            // header("Refresh:$time;url=$_SERVER[HTTP_REFERER]");
            echo '<script>window.setTimeout(function() {window.history.back(-1);},' . $time . '000)</script>';
        } else {
            header("Refresh:$time;url=$file");
        }
    }
    exit();
}

/**
 *@param str $msg 失败返回的报错信息
 *@param str $file 跳转的文件名,返回上一页为-1
 *@param int $time 延时跳转的时间,单位秒
 */
function error($msg, $file = '', $time = 1)
{
    $res = 'fail';
    require ROOT . '/view/admin/info.html';
    if ($file != '') {
        if ($file == '-1') {
            // header("Refresh:$time;url=$_SERVER[HTTP_REFERER]");
            echo '<script>window.setTimeout(function() {window.history.back(-1);},' . $time . '000)</script>';
        } else {
            header("Refresh:$time;url=$file");
        }
    }
    exit();
}

/**
 *获取访客IP
 */
function getRealIp()
{
    static $realip = null;
    if ($realip !== null) {
        return $realip;
    }

    if (getenv('REMOTE_ADDR')) {
        $realip = getenv('REMOTE_ADDR');
    } else if (getenv('HTTP_CLIENT_IP')) {
        $realip = getenv('HTTP_CLIENT_IP');
    } else if (getenv('HTTP_X_FROWARD_FOR')) {
        $realip = getenv('HTTP_X_FROWARD_FOR');
    }

    return $realip;
}

/**
 * 生成随机字符串
 * @param int $num 生成的随机字符串的个数
 * @return str 生成的随机字符串
 */
function randStr($num = 6)
{
    $str = str_shuffle('abcedfghjkmnpqrstuvwxyzABCEDFGHJKMNPQRSTUVWXYZ0123456789');
    return substr($str, 0, $num);
}

//echo randStr();

/**
 * 创建目录 ROOT.'/upload/2015/01/25/qwefas.jpg'
 * @return str 成功返回路径,失败返回false
 */
function createDir()
{
    $path = '/upload/' . date('Y/m/d');
    $fpath = ROOT . $path;
    if (is_dir($fpath) || mkdir($fpath, 0777, true)) {
        return $path;
    } else {
        return false;
    }
}

/**
 * 获取文件后缀
 * @param str $filename 文件名
 * @return str 文件的后缀名,且带点.
 */
function getExt($filename)
{
    return strrchr($filename, '.');
}

/**
 * 检测用户是否登录
 * @return bool 已登录返回true,未登录返回false
 */
function acc()
{
    if (!isset($_COOKIE['name']) || !isset($_COOKIE['ccode'])) {
        return false;
    }
    return $_COOKIE['ccode'] === cCode($_COOKIE['name']);
}

/**
 * 加密用户名
 * @param str $name 用户登陆时输入的用户名
 * @return str md5(用户名+salt)=>md5码
 */
function cCode($name)
{
    $salt = require ROOT . '/lib/config.php';
    return md5($name . '|' . $salt['salt']);
}

info.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
     <div id="rside">
            <?php if($res == 'succ'){?>
            <div class="succ"><?php echo $msg?></div>
            <?php }else if($res == 'fail'){?>
            <div class="danger"><?php echo $msg?></div>
            <?php }?>
        </div>
</body>
</html>

login.php

<?php

require 'lib/init.php';

if (acc()) {
    header('location: artlist.php');
}
if (empty($_POST)) {
    require ROOT . '/view/admin/login.html';
} else {
    $name = trim($_POST['username']);
    if ($name == '') {
        error('用户名不能为空');
    }
    if (!preg_match('/^[A-Za-z0-9_\x{4e00}-\x{9fa5}]+$/u', $name)) {
//用户名只能由数字、字母、中文汉字及下划线组成,不能包含特殊符号,在php中,不支持[\u4e00-\u9fa5]匹配汉字,而是用\x表示十六进制数据,然而php中用"[\x4e00-\x9fa5]"的写法也是错的,必须用{}把它包起来才行。此外,由于编码关系,需要用到"/u"声明编码格式。
        error('用户名格式不正确');
    }
    $password = trim($_POST['password']);
    if ($password == '') {
        error('密码不能为空');
    }
    // $sql = "select * from user where name='$name' and password='$password'";
    $sql = "select * from user where name='$name'";
    $res = mGetRow($sql);
    if (!$res) {
        error('用户名不存在');
    } else if (md5($res['salt'] . $password) !== $res['password']) {//这里的salt为密码的安全码,可以在注册成功后生成一个随机的安全码
        error('密码错误');
    } else {
        setcookie('name', $res['name']);
        setcookie('ccode', cCode($res['name']));
        header('location: artlist.php');
    }
}

init.php

<?php

//echo __DIR__,'<br>';//D:\xampp\htdocs\1\Blog
//echo __FILE__,'<br>';//D:\xampp\htdocs\1\Blog\init.php
//echo __LINE__;//4

header('content-type:text/html;charset=utf8');
define('ROOT', dirname(__DIR__)); //定义个ROOT常量,dirname往上跳一级
require ROOT . '/lib/mysql.php';
require ROOT . '/lib/func.php';
$_GET = _addslashes($_GET);
$_POST = _addslashes($_POST);
$_COOKIE = _addslashes($_COOKIE);

使用方法

首先引入init.php,这里的art和cat是表名,mysqli_query($conn, $sql)可变为mQuery($sql)

1、增

$art['title'] = trim($_POST['title']);
$art['cat_id'] = trim($_POST['cat_id']);
$art['content'] = trim($_POST['content']);
$art['pubtime'] = time();
if (mExec('art', $art)) {
        succ('添加成功');
    } else {
        error('添加失败');
    }

2、删

$sql = "delete from cat where cat_id='$cat_id'";
if (mQuery($sql)) {
    succ('删除成功');
} else {
    error('删除失败');
}

3、改

$cat_id = $_GET['cat_id'];
$cat['catname'] = trim($_POST['catname']);
if (mExec('cat',$cat,'update',"cat_id=$cat_id")) {
    succ('修改成功');
} else {
    error('修改失败');
}

4、查
查询多行数据

$sql = "select * from cat";
$arr = mGetAll($sql);
print_r($arr);

取出一行数据

$sql = "select * from cat where cat_id='$cat_id'";
if (!mGetRow($sql)) {
    error('栏目不存在');
    exit();
}

查询返回一个结果

$sql = "select * from cat where cat_id='$cat_id'";
echo mGetOne($sql);

获取上一步insert 操作产生的主键id

getLastId();

使用反斜线,转义字符串
使用方法:在顶部添加一下代码

$_GET = _addslashes($_GET);
$_POST = _addslashes($_POST);
$_COOKIE = _addslashes($_COOKIE);

检测用户是否登录

if(!acc()){
    header('location: login.php');
}

登录成功后添加name和ccode的cookie,请参考上面的login.php

setcookie('name', $res['name']);
setcookie('ccode', cCode($res['name']));

退出登录

setcookie('name', '', 0);
setcookie('ccode', '', 0);
header('location: login.php');
经验PHPMySQL魔术常量封装函数
朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwll.cn/archives/4964/(转载时请注明本文出处及文章链接)

评论 (0)