MeZon Team
ГлавнаяО насДокументацияКаталог статейСсылкиОбратная связь

Экспорт структуры и данных таблиц MySQL через PHP

Одной из наиболее значимых задач разработчика является резервное копирование таблиц баз данных MySQL. Для этого необходимо произвести экспорт информации в текстовый формат SQL и сохранить полученный результат в файл. Изучив особенности поставленной задачи, я создал три функции. Первая, самая главная, производит подключение к БД, получает список таблиц и для каждой таблицы вызывает остальные две функции. Вторая функция получает структуру таблицы БД и создает SQL запрос на создание. Третья функция экспортирует данные таблицы.

Размеры таблиц могут быть очень большими, поэтому если сразу читать все содержимое, то скрипт PHP может не поместиться в памяти сервера. Поэтому я в третьей функции ввел размер читаемого блока $delta = 500; (т.е. читается не больше 500 записей данных за один раз).

function backup_tables($file, $host, $user, $pass, $name){
    $link = mysql_connect($host, $user, $pass);
    mysql_select_db($name, $link);
    file_put_contents($file, '');
    
    //получение списка таблиц
    $tables = array();
    $result = mysql_query('SHOW TABLES;', $link);
    while($row = mysql_fetch_row($result)){
        $tables[] = $row[0];
    }
    
    //обработка таблиц
    if(count($tables)>0){
        foreach($tables as $table){
            backup_table_structure($file, $table, $link);
            backup_table_data($file, $table, $link);
        }
    }
}

function backup_table_structure($file, $table, $link){
    //получение и сохранение структуры таблицы
    $content = 'DROP TABLE IF EXISTS `'.$table."`;\n\n";
    $result = mysql_fetch_row(mysql_query('SHOW CREATE TABLE `'.$table.'`;', $link));
    $content .= $result[1].";\n\n";
    file_put_contents($file, $content, FILE_APPEND);
}

function backup_table_data($file, $table, $link){
    //получение и сохранение данных таблицы
    $result = mysql_fetch_row(mysql_query('SELECT COUNT(*) FROM `'.$table.'`;', $link));
    $count = $result[0];
    $delta = 500;
    
    //если данные существуют
    if($count>0){
        //определяем не числовые поля
        $not_num = array();
        $result = mysql_query('SHOW COLUMNS FROM `'.$table.'`;', $link);
        $start = 0;
        while($row = mysql_fetch_row($result)){
            if (!preg_match("/^(tinyint|smallint|mediumint|bigint|int|float|double|real|decimal|numeric|year)/", $row[1])) {
                $not_num[$start] = 1;
            }
            $start++;
        }
        //начинаем производить выборки данных
        $start = 0;
        while($count>0){
            $result = mysql_query('SELECT * FROM `'.$table.'` LIMIT '.$start.', '.$delta.';', $link);
            $content = 'INSERT INTO `'.$table.'` VALUES ';
            $first = true;
            while($row = mysql_fetch_row($result)){
                $content .= $first ? "\n(" : ",\n(";
                $first2 = true;
                foreach($row as $index=>$field){
                    if(isset($not_num[$index])){
                        $field = addslashes($field);
                        $field = ereg_replace("\n", "\\n", $field);
                        $content .= !$first2 ? (',"'.$field.'"') : ('"'.$field.'"');
                    }else{
                        $content .= !$first2 ? (','.$field) : $field;
                    }
                    $first2 = false;
                }
                $content .= ')';
                $first = false;
            }
            //сохраняем результаты выборки
            file_put_contents($file, $content.";\n\n", FILE_APPEND);
            $count -= $delta;
            $start += $delta;
        }
    }
}

 

Главная | Новости | О нас | Проекты | Документация | Каталог статей | Ссылки | Обратная связь
Каталог TUT.BY © 2002-2017 MeZon Team, Minsk, Republic of Belarus.
Meta Zone Web Engine v4.9
2017.08.19 06:43:57