自己写的一个利用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);