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');