Вход Регистрация
Файл: pma/lib/phpMyDumper.php
Строк: 283
<?php
/*
* phpMyDumper
* -------------
* Version: 1.10
* Copyright (c) 2009 by Micky Holdorf
* Holdorf.dk/Software - micky.holdorf@gmail.com
* GNU Public License http://opensource.org/licenses/gpl-license.php
*
* -------------------------------------------
* Aug 2012
* upgraded to mysqli by ionutvmi@gmail.com
* modified to fit wap phpmyadmin
*/

class phpMyDumper {
    
/**
    * @access private
    */
    
var $database = null;
    var 
$compress = null;
    var 
$hexValue = null;
    var 
$dropTable = null;
    var 
$createTable = null;
    var 
$tableData = null;
    var 
$expInsert = null;
    var 
$phpMyAdmin = null;
    var 
$utf8 = null;
    var 
$autoincrement = null;

    var 
$filename = null;
    var 
$file = null;
    var 
$filestream = null;
    var 
$outputTofile = false;
    var 
$isWritten = false;
    var 
$tables = array();
    var 
$rds = false;
    var 
$query = false;

    
/**
    * Class constructor
    * @param string $db The database name
    * @param string $connection The database connection handler
    * @param boolean $compress It defines if the output/import file is compressed (gzip) or not
    * @param string $filepath The file where the dump will be written
    */
    
function phpMyDumper($dbn=null, $filepath='dump.php', $compress=false, $tables=false, $rds=false,$query=false) {
        
$this->compress = $compress;
        
$this->tables = $tables;
        
$this->rds = $rds;
        
$this->query = $query;

        
$this->hexValue = false;
        
$this->dropTable = true;
        
$this->createTable = false;
        
$this->tableData = false;
        
$this->expInsert = false;
        
$this->phpMyAdmin = true;
        
$this->utf8 = true;
        
$this->autoincrement = false;

        
$this->outputTofile = ( $filepath!='' ) ? true : false;
        if ( 
$this->outputTofile && !$this->setOutputFile($filepath) ) {
            
//if filepath is null, then we want stream
            
return false;
        }

        return 
$this->setDatabase($dbn);
    }

    
/**
    * Sets the database to work on
    * @param string $db The database name
    */
    
function setDatabase($dbn){
    global 
$db;
        
$this->database = $dbn;
        if ( !
$db->select_db($this->database) )
            return 
false;
        return 
true;
      }

    
/**
    * Sets the output file
    * @param string $filepath The file where the dump will be written
    */
    
function setOutputFile($filepath) {
        if ( 
$this->isWritten )
            return 
false;
        echo 
"Creating file '".$filepath."': ";
        
$this->filename = $filepath;
        
$this->file = $this->openFile($this->filename);
        echo 
" DONE!n";
        return 
$this->file;
      }
    
    
/**
     * Writes to file all the selected database tables structure with SHOW CREATE TABLE
    * @param string $table The table name
    */
    
function getTableStructure($table) {
    global 
$db;
        
// Header
        
$structure = "n-- --------------------------------------------------------n";
        
$structure .= "-- n";
        
$structure .= "-- Table structure for table ".PMA_bkq($table)."n";
        
$structure .= "-- nn";

        
// Dump Structure
        
if ( $this->dropTable )
            
$structure .= "DROP TABLE IF EXISTS ".PMA_bkq($table).";n";
        
$records = $db->query("SHOW CREATE TABLE ".PMA_bkq($table));
        if ( 
$records->num_rows == 0 )
            return 
false;
        while ( 
$record = $records->fetch_assoc() ) {
            
$structure .= $record['Create Table'];
        }
        
$records = $db->query("SHOW TABLE STATUS LIKE '".$db->real_escape_string($table)."'");
        while ( 
$row = $records->fetch_assoc() ) {
            if (
$this->autoincrement AND $row['Name']==$table AND $row['Auto_increment']!='') {
                
$structure .= " AUTO_INCREMENT=".$row['Auto_increment'];
            }
        }
        
$structure .= ";n";
        
$this->saveToFile($this->file,$structure);
      }

    
/**
    * Writes to file the $table's data
    * @param string $table The table name
    * @param boolean $hexValue It defines if the output is base 16 or not
    */
    
function getTableData($table,$hexValue = true) {
    global 
$db;
        
// Header
        
$data = "n-- --------------------------------------------------------n";
        
$data .= "-- n";
        
$data .= "-- Dumping data for table ".PMA_bkq($table)."n";
        
$data .= "-- nn";
        
$data1= $data;
            
        
// Field names
        
if ($this->expInsert || $this->hexValue) {
            
$records = $db->query("SHOW FIELDS FROM ".PMA_bkq($table));
            
$num_fields = $records->num_rows;
            if ( 
$num_fields == 0 )
                return 
false;
            
$hexField = array();

            
$insertStatement = "INSERT INTO ".PMA_bkq($table)." (";
            
$selectStatement = "SELECT ";
            for (
$x = 0; $x < $num_fields; $x++) {
                
$record = mysqli_fetch_assoc($records);
                if ( (
$hexValue) && ($this->isTextValue($record['Type'])) ) {
                    
$selectStatement .= 'HEX(`'.$record['Field'].'`)';
                    
$hexField [$x] = true;
                }
                else
                    
$selectStatement .= '`'.$record['Field'].'`';
                
                
$insertStatement .= '`'.$record['Field'].'`';
                
$insertStatement .= ", ";
                
$selectStatement .= ", ";
                
            }
            
$insertStatement = @substr($insertStatement,0,-2).') VALUES';
            
$selectStatement = @substr($selectStatement,0,-2).' FROM `'.$table.'`';
        }
        
        if (!
$this->expInsert)
            
$insertStatement = "INSERT INTO ".PMA_bkq($table)." VALUES";
        
        if (!
$this->hexValue)
            
$selectStatement = "SELECT * FROM ".PMA_bkq($table)." ".$this->rds;
            
        if (
$this->query){
            
$selectStatement = $this->query;
            
$insertStatement = "INSERT INTO ".PMA_bkq($table)." ";
            }
        
// Dump data
        
$records = $db->query($selectStatement);
        
$num_rows = $records->num_rows;
        
$num_fields = $records->field_count;
        
        while(
$_f = $records->fetch_field()){
            
$_fields[] = PMA_bkq($_f->name);
        }
        
$procent = 0;
        for (
$i = 1; $i <= $num_rows; $i++) {
            
$data .= $insertStatement;
            
$record = $records->fetch_assoc();
            
$data .= ' (';
            
$data2 .= ' (';
            for (
$j = 0; $j < $num_fields; $j++) {
                
$field_name = $records->fetch_field_direct($j);
                
$field_name = $field_name->name;
                if (
is_null($record[$field_name])) {
                     
$data .= "NULL";
                     
$data2 .= "NULL";
                } 
                else {
                    if ( isset(
$hexField[$j]) && (@strlen($record[$field_name]) > 0) ) {
                        
$data .= "0x".$record[$field_name];
                        
$data2 .= "0x".$record[$field_name];
                    }
                    else {
                        
$data .= '''.@str_replace('"','"',$db->real_escape_string($record[$field_name])).''';
                        
$data2 .= '''.@str_replace('"','"',$db->real_escape_string($record[$field_name])).''';
                    }
                }
                
$data .=  ',';
                
$data2 .=  ',';
            }
            if (
$this->query){
                
$data = (!$y ? $data1 : "").$insertStatement."(".implode(",",$_fields).") VALUES ".$data2;
                
$y=1;
            }
             
            
$data = @substr($data,0,-1).");n";

            
$this->saveToFile($this->file,$data);
            
// cleaning searvice :)
            
$data = $data1 = $data2 = '';
        }
    }

     
/**
    * Writes to file all the selected database tables structure
    * @return boolean
    */
    
function getDatabaseStructure() {
    global 
$db;
        
$records = $db->query('SHOW TABLES');
        if ( 
$records->num_rows == 0 )
            return 
false;
        while ( 
$record = $records->fetch_row() ) {
            echo 
"Exporting table structure for '".$record[0]."': ";
            
$this->getTableStructure($record[0]);
            echo 
" DONE!n";
        }
        return 
true;
     }

    
/**
    * Writes to file all the selected database tables data
    * @param boolean $hexValue It defines if the output is base-16 or not
    */
    
function getDatabaseData($hexValue = true) {
    global 
$db;
        
$records = $db->query('SHOW TABLES');
        if ( 
$records->num_rows == 0 )
            return 
false;
        while ( 
$record = $records->fetch_row() ) {
            if (
$this->filename) echo "Exporting table data for '".$record[0]."': ";
            
$this->getTableData($record[0],$hexValue);
            if (
$this->filename) echo " DONE!n";
        }
      }

    
/**
    * Writes to file all the selected database tables data
    * @param boolean $hexValue It defines if the output is base-16 or not
    */
    
function getDatabaseStructureData($hexValue = true){
    global 
$db;
        
$records = $db->query('SHOW TABLES');
        if ( 
$records->num_rows == 0 )
            return 
false;
        while ( 
$record = $records->fetch_row() ) {
            if((
in_array($record[0],$this->tables) && $this->tables != false) || $this->tables == false){ 
                if ( 
$this->createTable) {
                    if (
$this->filename) echo "Exporting table structure for '".$record[0]."': ";
                    
$this->getTableStructure($record[0]);
                    if (
$this->filename) echo " DONE!n";
                }
                if ( 
$this->tableData) {
                    if (
$this->filename) echo "Exporting table data for '".$record[0]."': ";
                    
$this->getTableData($record[0],$hexValue);
                    if (
$this->filename) echo " DONE!n";
                }
            }
        }
// end while
      
}

    
/**
    * Writes the selected database to file 
    */
    
function doDump($doDB = false,$i=1) {
    global 
$db, $pma;
        if ( !
$this->setDatabase($this->database) )
            return 
false;

        if ( 
$this->utf8 ) {
            
$encoding = $db->query("SET NAMES 'utf8'");
        }
        if(
$i<2) {
            
$cur_time=date("Y-m-d H:i");
            
$server_info = $db->get_server_info();
            
$this->saveToFile($this->file,"-- Wap PhpMyAdmin $pma->versionn");
            
$this->saveToFile($this->file,"-- http://master-land.net/phpmyadmin n");
            
$this->saveToFile($this->file,"-- Generation Time: $cur_timen");
            
$this->saveToFile($this->file,"-- MySQL Server Version: $server_infon");
            
$this->saveToFile($this->file,"-- PHP Version: ".phpversion()."nn");
        }
        if(
$doDB) {
            
$this->saveToFile($this->file,"-- --------------------------------------------------------n--n-- Database: ".PMA_bkq($this->database)."n-- n");
            
$create_query = "CREATE DATABASE ".PMA_bkq($this->database);
            
$collation=$db->query('SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '' . $db->real_escape_string($this->database) . '' LIMIT 1')->fetch_row();
            
$collation = $collation[0];
            if (
strpos($collation, '_')) {
            
$create_query .= ' DEFAULT CHARACTER SET ' . substr($collation, 0, strpos($collation, '_')) . ' COLLATE ' . $collation;
            } else {
            
$create_query .= ' DEFAULT CHARACTER SET ' . $collation;
            }
            
$create_query.=";nUSE ".PMA_bkq($this->database).";nn";
            
$this->saveToFile($this->file,$create_query);
        }else {
            
$this->saveToFile($this->file,"-- Database: ".PMA_bkq($this->database)."nn");
        }

        if (
$this->phpMyAdmin) {
            
$this->getDatabaseStructureData($this->hexValue);
        }
        else {    
            if ( 
$this->createTable )
                
$this->getDatabaseStructure();
            if ( 
$this->tableData )
                
$this->getDatabaseData($this->hexValue);
        }
        
        if (
$this->outputTofile){
            
$this->closeFile($this->file);
            return 
true;
        }
        else {
            return 
$this->filestream;
        }
    }

     
/**
    * @access private
    */
    
function isTextValue($field_type) {
        switch (
$field_type) {
            case 
"tinytext":
            case 
"text":
            case 
"mediumtext":
            case 
"longtext":
            case 
"binary":
            case 
"varbinary":
            case 
"tinyblob":
            case 
"blob":
            case 
"mediumblob":
            case 
"longblob":
                return 
True;
                break;
            default:
                return 
False;
        }
    }
    
    
/**
    * @access private
    */
    
function openFile($filename) {
        
$file = false;
        if ( 
$this->compress )
            
$file = @gzopen($filename, "w9");
        else
            
$file = @fopen($filename, "w");
        return 
$file;
    }

    
/**
    * @access private
    */
    
function saveToFile($file, $data) {
        if (
$this->outputTofile){
            if ( 
$this->compress )
                @
gzwrite($file, $data);
            else
                @
fwrite($file, $data);
            
$this->isWritten = true;
        }
        else {
            
$this->saveToStream($data);
        }
    }

    
/**
    * @access private
    */
    
function saveToStream($data) {
        
$this->filestream .= $data;
    }
    
    
/**
    * @access private
    */
    
function closeFile($file) {
        if ( 
$this->compress )
            @
gzclose($file);
        else
            @
fclose($file);
    }
}
?>
Онлайн: 1
Реклама