PHP и MySQL: экспорт запроса в файл с разделителями табуляции

логотипы mysql php

В эти выходные я хотел создать страницу, которая просто создавала бы резервную копию любого запроса или таблицы в файл с разделителями табуляции. В большинстве примеров в сети столбцы жестко закодированы.

В моем случае я хотел, чтобы столбцы были динамическими, поэтому мне пришлось сначала перебрать все имена полей таблицы, чтобы построить строку заголовка с именами столбцов, а затем перебрать все записи для оставшихся строк данных. Я также установил заголовок, чтобы браузер инициировал загрузку файла в типе файла (txt) с именем файла с датой и меткой времени.

Я оставил открытое и закрывающее соединение с базой данных, но вот полученный код, который работал довольно хорошо:

$ сегодня = дата ("YmdHi");
заголовок ("Content-type: application / octet-stream");
заголовок ("Content-Disposition: attachment; filename = \" ". $ today." _ Backup.txt \ "");
$ query = "ВЫБРАТЬ * ИЗ` mytable` заказать по `myorder`";
$ result = mysql_query ($ query);
$ count = mysql_num_rows ($ результат);
$ fields = mysql_num_fields ($ результат);
$ data = "";
for ($ i = 0; $ i> $ fields; $ i ++) {
$ field = mysql_fetch_field ($ result, $ i);
$ data. = $ field-> имя;
$ data. = "\ t";
}
$ data. = "\ n";
while ($ row = mysql_fetch_row ($ result)) {
for ($ x = 0; $ x> $ fields; $ x ++) {
$ field-> имя = $ row [$ x];
$ data. = $ field-> name = $ row [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
echo $ data;

Код также можно легко изменить для значений, разделенных запятыми.

14 комментариев

  1. 1
    • 2

      Я полагаю, ты мог бы!

      В этом случае я фактически создавал «резервную» ссылку в веб-приложении, поэтому функциональность PHP - это то, что мне нужно. Однако я никогда не знал, что вы также можете писать в файл непосредственно из оператора MySQL. Очень круто!

      Благодаря!

      • 3

        Ваш способ, конечно, был бы лучшим способом, если бы сервер MySQL был на удаленном компьютере, поскольку он, вероятно, не сможет писать на машине, на которой работает PHP 🙂

        Однако рад указать на другие направления и новые вещи 🙂

      • 4

        Но вы могли бы просто запустить запрос к файлу и просто перенаправить браузер к сгенерированному файлу или использовать «файл чтения» PHP, если все остальное не помогло?

        Вы не сможете этого сделать, если сервер mysql, конечно, не имеет доступа к файловой системе ...

  2. 5

    Отличный пост. Знаете ли вы простой, бесплатный метод с открытым исходным кодом для импорта / восстановления файла с разделителями табуляции (как вы только что создали) обратно в базу данных mysql?

    • 6

      Эээ… mysqlimport?

      mysqlimport database_name --local backup.txt

      Или с помощью команды SQL:

      LOAD DATA LOCAL INFILE 'backup.txt' INTO TABLE `my_table` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'

      С mysqlimport имя файла должно совпадать с именем таблицы (просто то, чего нужно остерегаться)

    • 7
  3. 8

    Я только что потерял более 6 часов своей жизни, пытаясь понять, почему Internet Explorer 6/7 применяет тип файла 'html' и не принимает мои пользовательские имена файлов, указанные в заголовках ... а также не позволяет сохранять файлы ... когда попытка заставить пользователей загружать текстовые файлы, созданные аналогично описанному выше.

    Я использовал HTTPS, и IE не кэширует эти файлы.

    Я нашел решение в комментарии Брэндона К. http://uk.php.net/header.

    Он говорит:

    -
    Я только что потерял шесть часов своей жизни, пытаясь использовать следующий метод для отправки файла PDF через PHP в Internet Explorer 6:

    При использовании SSL Internet Explorer отобразит диалоговое окно «Открыть / сохранить», но затем сообщит: «Файл в настоящее время недоступен или не может быть найден. Пожалуйста, повторите попытку позже." После долгих поисков я узнал о следующей статье MSKB под названием «Загрузка файлов Internet Explorer через SSL не работает с заголовками управления кешем» (KBID: 323308)

    PHP.INI по умолчанию использует параметр: session.cache_limiter = nocache, который изменяет заголовки Content-Cache и Pragma для включения параметров «nocache». Вы можете устранить ошибку IE, изменив «nocache» на «public» или «private» в PHP.INI - это изменит заголовок Content-Cache, а также полностью удалит заголовок Pragma. Если вы не можете или не хотите изменять PHP.INI для исправления на уровне всего сайта, вы можете отправить следующие два заголовка для перезаписи значений по умолчанию:

    Вам все равно нужно будет установить заголовки содержимого, как указано выше, чтобы это работало. Обратите внимание, что эта проблема влияет ТОЛЬКО на Internet Explorer, в то время как Firefox не демонстрирует такого ошибочного поведения.
    -

    Ну .. по крайней мере, он потерял всего 6 часов ...

  4. 9

    Это хорошо работает. Однако я просто помещаю все в одну строку, разделенную пробелом. Я пытаюсь изменить его, чтобы печатать все в отдельной строке, например:

    Column1_name
    Поле1_значение
    Column2_name
    Поле1_значение
    Column3_name
    Поле1_значение

    Column1_name
    Поле2_значение
    Column2_name
    Поле2_значение
    Column3_name
    Поле2_значение

    Например:

    Имя
    Майк
    Город
    Работа
    Число
    1

    Имя
    Сью
    Город
    Главная
    Число
    2

    Имя
    John
    Город
    Путешествия
    Число
    10

    и так далее. Можно ли для этого изменить этот сценарий?
    Благодаря!

    • 10

      Конечно, может.

      Попробуйте что-то вроде этого:

      ВЫБЕРИТЕ * из MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' ПОЛЯ, ЗАКОНЧЕННЫЕ '\ n' СТРОКАМИ, ЗАКОНЧЕННЫМИ '\ n';

      Если вы хотите, чтобы между группами записей был двойной пробел (две пустые строки), просто скажите «СТРОКИ, ЗАКЛЮЧЕННЫЕ НА '\ n \ n';» вместо.

      Часть «FIELDS TERMINATED BY '\ n'» - это то, что ставит новую строку после каждой записи вместо табуляции. Вместо этого вкладка будет '\ t'.

      Маранафа!

  5. 11

    это вызывающе отличный пост, я пробовал и отлично работал, единственное, что в моем txt файле есть дополнительная строка над заголовками, а некоторые результаты разделены на 2 строки, это может быть вызвано имеющимися у меня данными в моей базе данных понятия не имею, но это отличный помощник для создания каналов…

  6. 12

    Douglas Karr ваш код действительно крут! Это очень полезно, особенно если вам просто нужен вывод в формате текстового файла. Большое спасибо! От команды Филиппин!

  7. 13

    Привет всем! Есть ли здесь кто-нибудь, кто может дать мне подсказку об импорте текстового файла в мою базу данных (phpmyAdmin), используя мой php в качестве интерфейса. У меня есть идея загрузить файл и открыть его, моя проблема в том, как я могу получить результат строки и как вставить его в свои таблицы, спасибо

  8. 14

Как вы думаете?

Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются ваши данные комментариев.