2016-10-15 52 views
0

我想通過點擊一個按鈕來下載我的數據庫。我有四處搜尋,發現這個代碼。 yii2 database downloadYii2如何下載數據庫

我在我的控制器上添加了一個動作並添加了這個修改後的代碼。我已經刪除了原始代碼中的數據庫連接,因爲我想我不需要再次進行連接。 'fetch_row()'出現錯誤。我嘗試了Yii::$app->db->createCommand('fetch_row'),但仍然出現錯誤。

define('BACKUP_DIR', 'download/') ; 
     // Define Database Credentials 
     define('HOST', 'localhost') ; 
     define('USER', 'root') ; 
     define('PASSWORD', 'x24613rt') ; 
     define('DB_NAME', 'panthoibi') ; 
     $files = scandir(BACKUP_DIR); 
     if(count($files) > 2) { 
      for ($i=2; $i < count($files); $i++) { 
       unlink(BACKUP_DIR."/".$files[$i]); 
      } 
     } 
     /* 
     Define the filename for the sql file 
     If you plan to upload the file to Amazon's S3 service , use only lower-case letters 
     */ 
     $fileName = 'mysqlibackup--' . date('d-m-Y') . '@'.date('h.i.s').'.sql' ; 
     // Set execution time limit 
     if(function_exists('max_execution_time')) { 
      if(ini_get('max_execution_time') > 0)  
       set_time_limit(0) ; 
     } 

     // Check if directory is already created and has the proper permissions 
     if (!file_exists(BACKUP_DIR)) mkdir(BACKUP_DIR , 0700) ; 
     if (!is_writable(BACKUP_DIR)) chmod(BACKUP_DIR , 0700) ; 

     // Create an ".htaccess" file , it will restrict direct accss to the backup-directory . 
     //$content = 'deny from all' ; 
     //$file = new SplFileObject(BACKUP_DIR . '/.htaccess', "w") ; 
     //$file->fwrite($content) ; 


     // Introduction information // 
     $return = ""; 
     $return .= "--\n"; 
     $return .= "-- A mysqli Backup System \n"; 
     $return .= "--\n"; 
     $return .= '-- Export created: ' . date("Y/m/d") . ' on ' . date("h:i") . "\n\n\n"; 
     $return = "--\n"; 
     $return .= "-- Database : " . DB_NAME . "\n"; 
     $return .= "--\n"; 
     $return .= "-- --------------------------------------------------\n"; 
     $return .= "-- ---------------------------------------------------\n"; 
     $return .= 'SET AUTOCOMMIT = 0 ;' ."\n" ; 
     $return .= 'SET FOREIGN_KEY_CHECKS=0 ;' ."\n" ; 
     $tables = array() ; 

     // Exploring what tables this database has 
     $result = Yii::$app->db->createCommand('SHOW TABLES'); 

     // Cycle through "$result" and put content into an array 
     while ($row = $result->fetch_row()) 
      $tables[] = $row[0] ; 

     // Cycle through each table 
     foreach($tables as $table) 
     { 
      // Get content of each table 
      $result = $mysqli->query('SELECT * FROM '. $table) ; 
      // Get number of fields (columns) of each table 
      $num_fields = $mysqli->field_count ; 
      // Add table information 
      $return .= "--\n" ; 
      $return .= '-- Tabel structure for table `' . $table . '`' . "\n" ; 
      $return .= "--\n" ; 
      $return.= 'DROP TABLE IF EXISTS `'.$table.'`;' . "\n" ; 
      // Get the table-shema 
      $shema = $mysqli->query('SHOW CREATE TABLE '.$table) ; 
      // Extract table shema 
      $tableshema = $shema->fetch_row() ; 
      // Append table-shema into code 
      $return.= $tableshema[1].";" . "\n\n" ; 
      // Cycle through each table-row 
      while($rowdata = $result->fetch_row()) 
      { 
       // Prepare code that will insert data into table 
       $return .= 'INSERT INTO `'.$table .'` VALUES (' ; 
       // Extract data of each row 
       for($i=0; $i<$num_fields; $i++) 
        $return .= '"'.$rowdata[$i] . "\"," ; 
       // Let's remove the last comma 
       $return = substr("$return", 0, -1) ; 
       $return .= ");" ."\n" ; 
      } 
      $return .= "\n\n" ; 
     } 

     $return .= 'SET FOREIGN_KEY_CHECKS = 1 ; ' . "\n" ; 
     $return .= 'COMMIT ; ' . "\n" ; 
     $return .= 'SET AUTOCOMMIT = 1 ; ' . "\n" ; 
     //$file = file_put_contents($fileName , $return) ; 
     $zip = new ZipArchive() ; 
     $resOpen = $zip->open(BACKUP_DIR . '/' .$fileName.".zip" , ZIPARCHIVE::CREATE) ; 
     if($resOpen) 
      $zip->addFromString($fileName , "$return") ; 
     $zip->close() ; 
     $fileSize = $this->get_file_size_unit(filesize(BACKUP_DIR . "/". $fileName . '.zip')) ; 

回答

0

你混合Yii的查詢命令的mysqli命令這不工作..

如:

您正在使用CreateCommand

// Exploring what tables this database has 
    $result = Yii::$app->db->createCommand('SHOW TABLES'); 

但不執行。 。你應該試試

$result = Yii::$app->db->createCommand('SHOW TABLES')->execute(); 

$result = Yii::$app->db->createCommand('SHOW TABLES')->queryOne(); 

$result = Yii::$app->db->createCommand('SHOW TABLES')->queryAll(); 

然後嘗試看看在$結果內容如:

var_dump($result); 

你$結果內容不建議立即進行刪除被用於

適應
$result->fetch_row() 

bu t最終你可以迭代或管理實際的$結果內容與PHP函數..

+0

'$ result = Yii :: $ app-> db-> createCommand('SHOW TABLES') - > execute();'我添加了'var_dump($ result);'我刪除了其他所有內容以查看結果。我得到了結果'int(23)1'。這代表什麼嗎?謝謝! – gojiraki

+0

這意味着該命令被執行..(但我想不會返回sql show命令的內容).anyway。我已經更新與其他執行方法的答案..嘗試如果這些給你一個更好的結果.. – scaisEdge