ThinkPHP 5ベースのデータベーステーブルインポートエクスポートクラス

19680 ワード

具体的な実現の構想と方式は参考にした:https://github.com/tp5er/tp5-databackup
もともとこれを直接使うつもりでしたが、私のビジネスニーズが簡単なので、元のクラスは少し肥大化していたので、自分のニーズに合わせてこのクラスを書き直しました.
現在の機能は、データベースのバックアップ、バックアップしたデータベースのリストア、既存のバックアップファイルのリストの取得、指定したバックアップファイルの削除です.
 
// +----------------------------------------------------------------------
// |  ThinkPHP5 
// +----------------------------------------------------------------------
// |  :1.0.0 
// +----------------------------------------------------------------------
// |  : 
// +----------------------------------------------------------------------

namespace app\index\common;
use think\Controller;
use think\Db;

class BackupSql extends Controller
{
    private $dbConfig = array();
    private $path = '';
    private $table = '';
    private $file = null;
    
    public function __construct($path)
    {
        parent::__construct();
        
        $this -> dbConfig = config('database');
        if(!$this -> checkPath($path))
        {
            echo ' ';
            die();
        }
        else
        {
            $this -> path = rtrim($path, '/');
        }
    }
    
    public function export($table)
    {
        $db = Db::connect();
        $table = $this -> dbConfig['prefix'] . strtolower($table);
        $this -> table = trim($table, '/');
        
        $sql = "-- -----------------------------
"; $sql .= "-- Xmsb & ThinkPHP —— MySql Transfer
"; $sql .= "--
"; $sql .= "-- Host : " . $this -> dbConfig['hostname'] . "
"; $sql .= "-- Database : " . $this -> dbConfig['database'] . "
"; $sql .= "--
"; $sql .= "-- Date : " . date("Y-m-d H:i:s") . "
"; $sql .= "-- -----------------------------

"; $sql .= "SET FOREIGN_KEY_CHECKS = 0;

"; if(false === $this -> writeSql($sql)) { return false; } $result = $db -> query("SHOW CREATE TABLE `{$table}`"); $sql = "
"; $sql .= "-- -----------------------------
"; $sql .= "-- Table structure for `{$table}`
"; $sql .= "-- -----------------------------
"; $sql .= "DROP TABLE IF EXISTS `{$table}`;
"; $sql .= trim($result[0]['Create Table']) . ";

"; if(false === $this -> writeSql($sql)) { return false; } $result = $db -> query("SELECT COUNT(*) AS count FROM `{$table}`"); $count = $result['0']['count']; if($count) { $sql = "-- -----------------------------
"; $sql .= "-- Records of `{$table}`
"; $sql .= "-- -----------------------------
"; $this -> writeSql($sql); $result = $db -> query("SELECT * FROM `{$table}`"); foreach ($result as $row) { $row = array_map('addslashes', $row); $sql = "INSERT INTO `{$table}` VALUES ('" . str_replace(array("\r", "
"), array('\\r', '\
'), implode("', '", $row)) . "');
"; if (false === $this -> writeSql($sql)) { return false; } } } fclose($this -> file); $this -> file = null; return '1000'; } public function import($file) { if(substr(strrchr($file, '.'), 1) != 'sql') { return ' '; } if(!file_exists($fullPath = $this -> path . '/' . $file)) { return ' sql '; } $db = Db::connect(); $sql = ''; $gz = fopen($fullPath, 'r'); while(1 == 1) { $sql .= fgets($gz); if(preg_match('/.*;$/', trim($sql))) { if(false === $db -> execute($sql)) { return false; } $sql = ''; } if(feof($gz)) break; } return '1000'; } public function fileList() { $flag = \FilesystemIterator::KEY_AS_FILENAME; $glob = new \FilesystemIterator($this -> path, $flag); $list = array(); foreach($glob as $name => $file) { $fileSplit = explode('-', $name); if(substr(strrchr($name, '.'), 1) == 'sql' && strlen(end($fileSplit)) == '18') $list[] = $name; } return $list; } public function fileDelete($file) { $fullPath = $this -> path . '/' . $file; if(file_exists($fullPath)) { unlink($fullPath); return '1000'; } else { return ' '; } } protected function checkPath($path) { if(is_dir($path) || mkdir($path, 0755, true)) { return true; } else { return false; } } protected function writeSql($sql) { $this -> openFile(); return fwrite($this -> file, $sql); } protected function openFile() { if($this -> file === null) { $fullPath = $this -> path . '/' . $this -> table . '-' . date('YmdHis') . '.sql'; $this -> file = fopen($fullPath, 'a'); } } }

 
 
使用方法:
//    1 sql 
$backup = new BackupSql('./backupSql');

//    1 , ( thinkphp5 database.php )
$backup -> export('table_name');

//    
$backup -> fileList();

//    1 
$backup -> import('file_name');

//    1 
$backup -> fileDelete('file_name');