За последние 24 часа нас посетили 33406 программистов и 1754 робота. Сейчас ищут 1152 программиста ...

Дамп MySQL на PHP

Тема в разделе "PHP для новичков", создана пользователем _AVS_, 11 янв 2008.

  1. _AVS_

    _AVS_ Активный пользователь

    С нами с:
    20 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    Здравствуйте!

    Подскажите, как средствами PHP можно сделать дамп базы данных? Какие запросы нужно выполнить посредством mysql_query(), чтобы в этоге получился текстовый файл с полной копией данных? Спасибо.
     
  2. ssh2010

    ssh2010 Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    11
    Симпатии:
    0
    привет, вот сегодня и я занимался таким вопросом. Может кому это покажется некрасивым и кривым методом, но он рабочий и всех устраивает.
    Вот что я придумал:



    на выходе получаем эксельный файлик.
    естественно в файлике только одна таблица.
     
  3. andrvm

    andrvm Активный пользователь

    С нами с:
    12 окт 2007
    Сообщения:
    19
    Симпатии:
    0
    Адрес:
    Moscow
  4. _AVS_

    _AVS_ Активный пользователь

    С нами с:
    20 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    Готовые не устраивают тем, что хочется написать свое. Для этого мне надо разобраться с запросами дампа и понять как их связать с PHP. Создать файл backup'a как phpMyAdmin.
     
  5. ssh2010

    ssh2010 Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    11
    Симпатии:
    0
    разберешься, отпиши тут, мне тож интересно.
     
  6. _AVS_

    _AVS_ Активный пользователь

    С нами с:
    20 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    PHP:
    1.  
    2. <?php
    3. include($_SERVER["DOCUMENT_ROOT"]."/functions.php");
    4.  
    5. // Запоминается текущее время с точностью до милисекунд
    6. $time_start=microtime(1);
    7.  
    8. // Открывается файл для записис дампа
    9. $file=fopen("dump.sql","w");
    10.  
    11. // Запись в файл информации о дампе: имя сервера и дата
    12. fwrite($file,"#######################################\n");
    13. fwrite($file,"# Дамп базы данных сервера ".strtoupper($_SERVER['HTTP_HOST'])."\n");
    14. fwrite($file,"# ".date($config_date_time,time())."\n");
    15. fwrite($file,"#######################################\n\n");
    16.  
    17. // Обращение к базе данных в целью получить список всех баз данных сервера
    18. $list_dbs_query=mysql_list_dbs();
    19. // Из полученного результата в цикле извлекается по одному названию базы данных
    20. while($row1=mysql_fetch_array($list_dbs_query))
    21. {
    22.     // Создается пустой массив, который будет содержат имена таблиц в данной базе данных
    23.     $list_tables=array();
    24.     // Запись в файл информации о названии текущей таблицы
    25.     fwrite($file,"# Дамп базы данных $row1[0]\n\n");
    26.     // Запись в файл запроса на создание данной базы данных
    27.     fwrite($file,"CREATE DATABASE IF NOT EXISTS $row1[0];\n\n");
    28.     // Запись в файл запроса на переход к данной базе данных
    29.     fwrite($file,"USE $row1[0];\n\n");
    30.     // Запрос на получение списка таблиц текущей базы данных
    31.     $list_table_query=mysql_list_tables($row1[0]);
    32.     // Из неассоциативного массива полученного результата добавляются элементы в пользовательский массив
    33.     while($row2=mysql_fetch_array($list_table_query))
    34.     {
    35.         $list_tables[]=$row2[0];
    36.     }
    37.    
    38.     // Излекается по одному значению из массива имен таблиц
    39.     foreach($list_tables as $table)
    40.     {
    41.         // Запись в файл информации о дампе текущей таблицы
    42.         fwrite($file,"# Дамп таблицы $table\n\n");
    43.         // Запрос на получение списка колонок таблицы
    44.         $query_fields=mysql_query("SHOW FIELDS FROM $table");
    45.         // Начало создания запроса на создание таблицы   
    46.         $str="CREATE TABLE IF NOT EXISTS $table (";
    47.        
    48.         // Массив имен колонок
    49.         $fields=array();
    50.         $k=0; // Количество извлеченных колонок таблицы до цикла извлечения их из выполненного выше запроса
    51.         $i=0; // Индекс массива колонок
    52.         // Цикл извлечения информации о колонках из выполненного выше запроса
    53.         while($row3=mysql_fetch_array($query_fields))
    54.         {
    55.             $k++;
    56.            
    57.             // Извлечение данных о колонке
    58.             $fields[$i]=$row3["Field"]; // Имя
    59.             $type=$row3["Type"]; // Тип
    60.             $null=$row3["Null"]; // Признак NULL
    61.             $key=$row3["Key"]; // Ключевое или нет
    62.             $default=$row3["Default"]; // Значение по-умолчанию
    63.             $extra=$row3["Extra"]; // Дополнительные параметры (auto_increment)
    64.            
    65.             // К запросу на создание таблицы добавляется имя и тип колонки, а также:
    66.             $str.=" '$fields[$i]' ".strtoupper($type);
    67.            
    68.             // Если значение NULL = NO, это свойство добавляется к запросу, иначе по-умолчанию NULL будет = YES
    69.             if($null=="NO")
    70.             {
    71.                 $str.=" NOT NULL";
    72.             }
    73.            
    74.             // Если эта колонка является ключевой, добавляется это свойство
    75.             if($key=="PRI")
    76.             {
    77.                 $str.=" PRIMARY KEY";
    78.             }
    79.            
    80.             // Если значения по-умолчанию не равняется пустым, оно добавляется к запросу
    81.             if(!empty($default))
    82.             {
    83.                 $str.=" DEFAULT $default";
    84.             }
    85.            
    86.             // Если дополнительный параметр = auto_increment, он также добавляется к запросу
    87.             if($extra=="auto_increment")
    88.             {
    89.                 $str.=" AUTO_INCREMENT";
    90.             }
    91.            
    92.             // Если количество колонок, добавленных к запросу меньше их общего количества в данной таблице, добавляется запятая, чтобы разделить колонки в запросе
    93.             if($k<mysql_num_rows($query_fields))
    94.             {
    95.                 $str.=",";
    96.             }
    97.            
    98.             $i++;
    99.         }
    100.        
    101.         // В конце запроса добавляется скобка и точка с запятой
    102.         $str.=");";
    103.        
    104.         // Полученный запрос записывается в файл
    105.         fwrite($file,"$str\n\n");
    106.        
    107.         // Запрос на получение данных из таблицы
    108.         $query_data=mysql_query("SELECT * FROM $table");
    109.        
    110.         // Извлечение данных из запроса
    111.         while($row4=mysql_fetch_array($query_data))
    112.         {
    113.             // Начало формирования запроса на вставку данных
    114.             $str="INSERT INTO $table VALUES (";
    115.             // Цикл извлечения имен колонок из массива, определение их типа
    116.             for($i=0;$i<count($fields);$i++)
    117.             {
    118.                 // Определение типа колонки
    119.                 $field_type=mysql_field_type($query_data,$i);
    120.                
    121.                 // Если тип текстовый, содержимое ячейки берется в кавычки (добавление в начало)
    122.                 if($field_type=="string" || $field_type=="blob")
    123.                 {
    124.                     $str.="'";
    125.                 }
    126.                
    127.                 // К запросу добавляется содержимое ячейки
    128.                 $str.=$row4[$fields[$i]];
    129.                
    130.                 // Если тип текстовый, содержимое ячейки берется в кавычки (добавление в конец)
    131.                 if($field_type=="string" || $field_type=="blob")
    132.                 {
    133.                     $str.="'";
    134.                 }
    135.                
    136.                 // Если индекс массива колонок + 1 меньше общего количесва элементов этого массива...
    137.                 if($i+1<count($fields))
    138.                 {
    139.                     // Добавляется запятая, которая будет разделять данные в запросе
    140.                     $str.=",";
    141.                 }
    142.             }
    143.            
    144.             // Запрос заканчивается скобкой и точкой с запятой
    145.             $str.=");";
    146.             // Запись полученного в файл
    147.             fwrite($file,"$str\n\n");
    148.         }
    149.         // Запись информации о завершении дампа данной таблицы
    150.         fwrite($file,"# Конец дампа таблицы $table\n\n");
    151.         // Удаление массива, содержащего колонки
    152.         unset($fields);
    153.     }
    154.     // Удаление массива, содержащего имена таблиц в текущей базе данных
    155.     unset($list_tables);
    156.     // Запись в файл информации о завершении дампа базы данных
    157.     fwrite($file,"# Конец дампа базы данных $row1[0]\n\n");
    158. }
    159. fwrite($file,"#######################################\n");
    160. // Запись в файл информации о продолжительности выполнения операции   
    161. fwrite($file,"# Процесс дампа занял: ".(microtime(1)-$time_start)." сек.");
    162. // Закрытие файла
    163. fclose($file);
    164. ?>
    165.  
    Вот что получилось у меня. Надо еше разобраться как избежать конфликта с кавычками. Дело в том, что строковые данные у меня в запросе предваряются с обоих сторон кавычками, а может получиться так, что строка тоже содержит кавычки. Как лучше это сделать? Еще надо добавить кодировку к запросам на создание баз и таблиц. Тоже не знаю как.