php自动创建数据库,php导入sql

自己写的一个利用php导入sql的类,准备好sql文件后可以直接导入到指定数据库中。

功能:创建数据库、导入sq

关键点:创建用户、创建数据库、分配用户权限、利用新的库地址导入sql文件。

待完善:动态自定义数据内容,错误和异常问题抓取,其他问题

注意问题:sql中注释不要用英文分号隔开,否则会sql报错,因为利用英文分号拆分为sql语句了;

这里用了medoo的类,也可以直接用mysqli连接数据库,这里是未来兼容其他数据库类型。

创建库的用户必须是有DROP,CREATE,INSERT 等高级权限,否则无权操作

下面是类:

<?php
/**
 * @Created by Brisklan
 * @User: 1076963452@qq.com
 * @Datetime: 2018/9/1017:39
 * @use :初始化数据库
 */
require "medoo.php";
//超级管理
define('ROOT_DB_USER',json_encode(
    ["master"=>[
        'database_type' => 'mysql',
        'database_name' => 'aaatest',
        'server' => '127.0.0.1',
        'username' => 'root',
        'password' => 'root',
        'charset' => 'utf8mb4',
        'port' => 3306,
        'option' => [
            PDO::ATTR_CASE => PDO::CASE_NATURAL
        ],
        'command' => [
            'SET SQL_MODE=ANSI_QUOTES'
        ]
    ]]));
Class INIDB
{

    protected static $_SQL = null;
    //新加的数据库类
    protected function DbA($client='master',$new_obj=array())
    {
        if (self::$_SQL === null)
        {
            if (!empty($new_obj))
            {
                self::$_SQL = new \Medoo\Medoo($new_obj,$client);
            }else
            {
                // 初始化配置
                self::$_SQL = new \Medoo\Medoo(json_decode(ROOT_DB_USER,true),$client);
            }

        }
        return self::$_SQL;
    }


    /**
     * fixme 内容自定义
     * 新增数据库
     * @param $sql_file :基础sql文件
     * @param $database :数据名称
     * @param $host :链接名称
     * @param $root_user :有创建库权限的用户名称
     * @param $pwd :用户密码
     */
    public function createNewDb($sql_file,$new_db_name,$db_user,$pwd,$charset='utf8mb4')
    {
        $user = self::DbUser($db_user,$pwd);//新建用户
        $db = self::CreateDb($new_db_name,$charset);//新增库
        $auth = self::DbUserAuth($new_db_name,$db_user,$pwd);//赋予权限

        if ($user && $db && $auth)
        {
            self::$_SQL = null;
            $new_con = [
                "master"=>[
                    'database_type' => 'mysql',
                    'database_name' => $new_db_name,
                    'server' => '127.0.0.1',
                    'username' => $db_user,
                    'password' => $pwd,
                    'charset' => $charset,
                    'port' => 3306,
                    'option' => [
                        PDO::ATTR_CASE => PDO::CASE_NATURAL
                    ],
                    'command' => [
                        'SET SQL_MODE=ANSI_QUOTES'
                    ]
                ]];
            $sqls = self::sqlFile($sql_file);

            if (!empty($sqls) )
            {
                foreach ($sqls as $sql)
                {
                    //包含删除库、创建库、插入数据的才执行SQL
                    if (!empty($sql) && (strpos($sql,'DROP') || strpos($sql,'CREATE') || strpos($sql,'INSERT')))
                    {
                        $this->DbA('master',$new_con)->query($sql.';');
                    }
                }

                $admin = $this->DbA('master',$new_con)->get('admin','*');
                if ($admin)
                {
                    return array('code'=>0,'msg'=>'执行成功','data'=>$admin['admin_id']);
                }
                return array('code'=>1,'msg'=>'执行完毕,获取表失败');
            }
        }

        return array('code'=>1,'msg'=>'未知错误');
    }

    /**
     * 读取文件
     * @param $sql_file :基础sql文件,达到最佳性能请勿直接用Navicat导出的直接使用
     * @return array :读取sql文件后的数组
     */
    private function sqlFile($sql_file)
    {
        if (!file_exists($sql_file))
        {
            return ['code'=>1,'msg'=>'基础sql文件不存在'];
        }
        $file = file_get_contents($sql_file);

        $sqls = explode(';', $file);
        return $sqls;
    }

    //新建数据库
    private function CreateDb($new_db_name,$charset='utf8mb4')
    {
        $sql = 'CREATE DATABASE IF NOT EXISTS '.$new_db_name.' DEFAULT CHARSET '.$charset.' COLLATE '.$charset.'_general_ci';
        return $this->DbA('master')->query($sql);
    }

    /**
     * 给予新用户对数据的操作权限
     * @param $user_name :新用户名称
     * @param $user_pwd : 新用户密码
     * @param string $auth : 链接域,默认内网链接,改成%后是外网可以链接
     */
    private function DbUser($user_name,$user_pwd,$auth='localhost')
    {
        //新用户名
        $new_user ="create user '".$user_name."'@'".$auth."' identified by '".$user_pwd."'";

        $res = $this->DbA('master')->query($new_user);//执行创建
        $this->DbA('master')->query('flush privileges');//刷新授权
        return $res;
    }

    //分配用户权限
    private function DbUserAuth($db_name,$user_name,$user_pwd,$auth='localhost')
    {
        //用户权限
        $user_auth = "grant all privileges on ".$db_name.".* to ".$user_name."@".$auth." identified by '".$user_pwd."'";

        $res = $this->DbA('master')->query($user_auth);//执行权限
        $this->DbA('master')->query('flush privileges');//刷新授权
        return $res;
    }
}

$db  = new INIDB();

$res = $db->createNewDb('ini.sql','db5','user5','dafxz4d5f4a6dfwe');
echo '<pre>';
print_r($res);


评论/留言