ThinkPHPフレームワーク実装のMySQLデータベースバックアップ機能例

6206 ワード

この例では、ThinkPHPフレームワークで実装されるMySQLデータベースのバックアップ機能について説明します.皆さんの参考にしてください.具体的には以下の通りです.
1、缘由
2010年にThinkPHPを試用して以来、確かに多くの便利さをもたらした.確かに私に多くの便利さをもたらしてくれた.今回は、データの頻繁なバックアップが必要ですが、リモートでサーバに接続するたびに不便です.ThinkPHPデータベースを書いてSQL生成クラスをバックアップする考えが芽生えた.
2、紹介
データベースにトリガが使用されているためです.そのため、一括バックアップも必要です.また,データを挿入する際にフリップフロップの影響を受けずに以前に挿入したデータを破壊するために,データを挿入する前にフリップフロップを削除するコードを生成した.このクラスでは、データ・テーブルの作成および削除コードを生成することはできません.したがって、使用中は両端テーブル構造の一貫性を保証することに注意してください.
WEB開発を行い、これまでNavicat For Mysqlを用いてローカルデータベースをサーバに同期してきた.先日、突然、ローカルデータベースをMysql 5.5にアップグレードし、再びデータを同期させたところ、エラーが発生しました.前に書いたThinkPHPがMysqlデータベースのバックアップを実現したのは、テーブル構造をエクスポートする機能ではなく、データをバックアップする機能だけだったことを思い出します.そこでアップグレードを考えました.より完全にします.
今回のアップグレードでは、バックアップ・テーブル構造、ビュー機能が追加されました.エクスポートデータにタイプ判定が追加され、insert文はフィールドが空の場合NULLを出力し、数値の場合は一重引用符を付けません.

query("SHOW FULL TABLES FROM `{$dbName}` WHERE Table_Type = 'BASE TABLE'");
    foreach ($result as $v){
      $tbArray[]=$v['Tables_in_'.C('DB_NAME')];
    }
    return $tbArray;
  }
  static protected function getViews()
  {
    $dbName=C('DB_NAME');
    $result=M()->query("SHOW FULL TABLES FROM `{$dbName}` WHERE Table_Type = 'VIEW'");
    foreach ($result as $v){
      $tbArray[]=$v['Tables_in_'.C('DB_NAME')];
    }
    return $tbArray;
  }
  /**
   * @description   SQL  ,         。
   * @static
   * @return string
   */
  static public function ExportAllData()
  {
    $tables = self::getTables();
    $arrAll = array(
      "SET FOREIGN_KEY_CHECKS=0;",
      self::BuildAllTriggerDropSql(),
      self::BuildTableSql(),
      self::BuildViewSql()
    );
    $tbl = new Model();
    foreach($tables as $table)
    {
      $arrAll[]="\r
DELETE FROM {$table};"; /* $rs = $tbl->query("SHOW COLUMNS FROM {$table}"); $arrFields = array(); foreach ($rs as $k=>&$v){ $arrFields[] = "`{$v['Field']}`"; } $sqlFields = implode($arrFields,","); */ $rs=$tbl->query("select * from `{$table}`"); foreach ($rs as $k=>&$v){ $arrValues = array(); foreach($v as $key=>$val) { if(is_numeric($val)){ $arrValues[]=$val; }else if(is_null($val)){ $arrValues[]='NULL'; }else{ $arrValues[]="'".addslashes($val)."'"; } } $arrAll[] = "INSERT INTO `{$table}` VALUES (".implode(',',$arrValues).");"; } } $arrAll[]=self::BuildTriggerCreateSql(); return implode("\r
",$arrAll); } static protected function BuildTableSql() { $tables = self::getTables(); $arrAll = array(); foreach($tables as &$val){ $rs = M()->query("SHOW CREATE TABLE `{$val}`"); $tbSql = preg_replace("#CREATE(.*)\\s+TABLE#","CREATE TABLE",$rs[0]['Create Table']); $arrAll[] = "DROP TABLE IF EXISTS `{$rs[0]['Table']}`;\r
{$tbSql};\r
"; } return implode("\r
",$arrAll); } static protected function BuildViewSql() { $views = self::getViews(); $arrAll = array(); foreach($views as &$val){ $rs = M()->query("SHOW CREATE VIEW `{$val}`"); $tbSql = preg_replace("#CREATE(.*)\\s+VIEW#","CREATE VIEW",$rs[0]['Create View']); $arrAll[] = "DROP VIEW IF EXISTS `{$rs[0]['View']}`;\r
{$tbSql};\r
"; } return implode("\r
",$arrAll); } /** * @description , 。 : 。 * @static * @return string */ static public function BuildAllTriggerDropSql() { $rs = M()->query("show triggers"); $arrAll = array(); foreach ($rs as $k=>&$v) { $arrSql = array( 'DROP TRIGGER IF EXISTS `',$v['Trigger'],'`;' ); $arrAll[] = implode('',$arrSql); } return implode("\r
",$arrAll); } /** * @description 。 * @static * @return string */ static protected function BuildTriggerCreateSql() { $rs = M()->query("show triggers"); $arrAll = array(); foreach ($rs as $k=>&$v) { $arrSql = array( 'CREATE TRIGGER `',$v['Trigger'],'` ',$v['Timing'],' ',$v['Event'],' ON `', $v['Table'],'` FOR EACH ROW ',$v['Statement'],';' ); $arrAll[] = implode('',$arrSql); } return implode("\r
",$arrAll); } }

呼び出し例:

vendor('DBExport',COMMON_PATH);
header('Content-type: text/plain; charset=UTF-8');
$dbName = C('DB_NAME');
header("Content-Disposition: attachment; filename=\"{$dbName}.sql\"");
echo DBExport::ExportAllData()

thinkPHPに関する詳細については、「ThinkPHP入門チュートリアル」、「thinkPHPテンプレート操作テクニック総括」、「ThinkPHP常用方法総括」、「codeigniter入門チュートリアル」、「CI(CodeIgniter)フレームアップチュートリアル」、「Zend FrameWork入門チュートリアル」、「PHPテンプレート技術総括」を参照してください.
本明細書では、ThinkPHPフレームワークに基づくPHPプログラムの設計に役立つことを期待します.