php 導入sql文件到數據庫


     今天要做一個導入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封裝的。稍微改動了下

    

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM