php導入sql文件到數據庫裏,常用於安裝源碼
封裝了一個類,摘自互聯網
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/10/13
* Time: 10:25
*/
class ImportData{
//數據庫信息
private $dbhost;
private $dbuser;
private $dbpw;
private $dbport;
private $dbname;
private $dbcharset;
private $link;
private $tablepre;
public function __construct($data)
{
$this->dbhost=isset($data['dbhost'])?$data['dbhost']:'';
$this->dbuser=isset($data['dbuser'])?$data['dbuser']:'';
$this->dbpw=isset($data['dbpw'])?$data['dbpw']:'';
$this->dbport=isset($data['dbport'])?$data['dbport']:'3306';
$this->dbname=isset($data['dbname'])?$data['dbname']:'';
$this->dbcharset=isset($data['dbcharset'])?$data['dbcharset']:'utf8';
$this->tablepre=isset($data['tablepre'])?$data['tablepre']:'';
$link_info=$this->link_data();
if(!$link_info['status']){
return $link_info;
}
}
//鏈接設置數據庫
protected function link_data(){
$link=mysqli_connect($this->dbhost,$this->dbuser,$this->dbpw,null,$this->dbport);
if(!$link)
return array('status'=>false,'info'=>'數據庫連接失敗');
else
$this->link=$link;
//mysql 版本
//獲得mysql版本
$version = mysqli_get_server_info($this->link);
//設置字符集
if($version > '4.1' && $this->dbcharset) {
mysqli_query($link, "SET NAMES {$this->dbcharset}");
}
//選擇數據庫
mysqli_select_db($this->link,$this->dbname);
}
//導數據
/**
* @param $dbfile 要導入的sql數據文件
* @param string $dbfile_table_pre 導入的sql文件的表前綴
* @return array
*/
public function import_data($dbfile,$dbfile_table_pre='zq_'){
if(!file_exists($dbfile)){
return array('status'=>false,'info'=>'數據庫文件不存在');
}
$sql = file_get_contents($dbfile);
$status=$this->_sql_execute($this->link, $sql,$dbfile_table_pre);
if($status){
// echo '導入數據庫成功';
return array('status'=>true,'info'=>'導入數據庫成功');
}else{
return array('status'=>true,'info'=>'導入數據庫失敗');
// echo '導入數據庫失敗';
}
}
/**
* @param $link 數據庫鏈接
* @param $sql 要導入的sql語句
* @param $dbfile_table_pre 導入的sql文件的表前綴
* @return bool
*/
protected function _sql_execute($link,$sql,$dbfile_table_pre) {
$sqls =$this-> _sql_split($link,$sql,$dbfile_table_pre);
if(is_array($sqls))
{
foreach($sqls as $sql)
{
if(trim($sql) != '')
{
mysqli_query($link,$sql);
}
}
}
else
{
mysqli_query($link,$sqls);
}
return true;
}
/**
* @param $link 錶鏈接對象
* @param $sql 導入的sql
* @param $dbfile_table_pre sql文件中的sql表前綴
* @return array
*/
protected function _sql_split($link,$sql,$dbfile_table_pre) {
if(mysqli_get_server_info($link) > '4.1' && $this->dbcharset)
{
$sql = preg_replace("/TYPE=(InnoDB|MyISAM|MEMORY)( DEFAULT CHARSET=[^; ]+)?/", "ENGINE=\\1 DEFAULT CHARSET=".$this->dbcharset,$sql);
}
//如果有表前綴就替換現有的前綴
if($this->tablepre){
$sql=str_replace($dbfile_table_pre, $this->tablepre, $sql);
}
$sql = str_replace("\r", "\n", $sql);
$ret = array();
$num = 0;
$queriesarray = explode(";\n", trim($sql));
unset($sql);
foreach($queriesarray as $query)
{
$ret[$num] = '';
$queries = explode("\n", trim($query));
$queries = array_filter($queries);
foreach($queries as $query)
{
$str1 = substr($query, 0, 1);
if($str1 != '#' && $str1 != '-') $ret[$num] .= $query;
}
$num++;
}
return $ret;
}
}
/**
* 初始化數據庫信息
*/
$data=array(
'dbhost'=>'127.0.0.1'
,'dbuser'=>'root'
,'dbpw'=>'root'
,'dbname'=>'phptest'
);
$obj=new ImportData($data);
$obj->import_data('./zq.sql');