今天要做一個導入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');
代碼參考phpcms封裝的。稍微改動了下