PHP和MySQL:將查詢導出到製表符分隔文件

mysql php徽標

這個週末,我想建立一個頁面,將所有查詢或表簡單地備份到製表符分隔文件中。 網絡上的大多數示例都對列進行了硬編碼。

就我而言,我希望列是動態的,因此我必須首先遍歷所有表字段名稱以使用列名構建標題行,然後遍歷所有記錄以查找剩餘的數據行。 我還設置了標題,以便瀏覽器將使用文件日期和時間戳記的文件類型(txt)啟動文件下載。

我省略了數據庫的打開和關閉連接,但這是運行良好的結果代碼:

$ today = date(“ YmdHi”);
header(“ Content-type:application / octet-stream”);
header(“ Content-Disposition:附件; filename = \”“。$ today。” _ Backup.txt \“”));
$ query =“ SELECT * FROM`mytable`由`myorder`命令”;
$結果= mysql_query($查詢);
$ count = mysql_num_rows($ result);
$ fields = mysql_num_fields($ result);
$ data =“”;
對於($ 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-> name = $ row [$ x];
$ data。= $ field-> name = $ row [$ x];
$ data。=“” \ t“;
}
$ data。=“” \ n“;
}
echo $ data;

該代碼也可以很容易地修改為逗號分隔的值。

14 個評論

  1. 1
    • 2

      我想你可以!

      在這種情況下,我實際上是在Web應用程序中構建“備份”鏈接,因此我需要PHP功能。 但是,我不知道您是否還可以直接從MySQL語句寫入文件。 很酷!

      謝謝!

      • 3

        如果MySQL服務器位於遠程計算機上,那麼您的方法當然是最好的方法,因為它可能無法寫到運行PHP的計算機上🙂

        很高興指出其他方向和新事物🙂

      • 4

        但是您可以只運行查詢到文件,然後將瀏覽器重定向到生成的文件,或者如果所有其他方法都失敗,則使用PHP的“ readfile”?

        當然,如果mysql服務器無權訪問文件系統,您將無法執行此操作…

  2. 5
    • 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則不會緩存這些文件。

    我在以下網址的Brandon K的評論中找到了解決方案 http://uk.php.net/header.

    他說:

    -
    我只是失去了6小時我的生活嘗試使用下面的方法通過PHP發送PDF文件到Internet Explorer XNUMX:

    使用SSL時,Internet Explorer會提示“打開/保存”對話框,但提示“文件當前不可用或找不到。 請稍後再試。” 經過大量搜索之後,我發現以下MSKB文章標題為“通過SSL的Internet Explorer文件下載不適用於緩存控制標頭”(KBID:323308)

    默認情況下,PHP.INI使用以下設置:session.cache_limiter = nocache,它修改Content-Cache和Pragma標頭以包含“ nocache”選項。 您可以通過在PHP.INI中將“ nocache”更改為“ public”或“ private”來消除IE錯誤-這將更改Content-Cache標頭並完全刪除Pragma標頭。 如果您不能或不想為站點範圍內的修改而修改PHP.INI,則可以發送以下兩個標頭來覆蓋默認值:

    您仍然需要設置上面列出的內容標題,此功能才能起作用。 請注意,此問題僅會影響Internet Explorer,而Firefox不會出現此錯誤行為。
    -

    好吧..至少他只損失了6個小時...

  4. 9

    這很好。 但是,我只是將所有內容都用空格隔開。 我正在嘗試對其進行修改,以將所有內容打印在這樣的單獨行上:

    列1_名稱
    欄位1_值
    列2_名稱
    欄位1_值
    列3_名稱
    欄位1_值

    列1_名稱
    欄位2_值
    列2_名稱
    欄位2_值
    列3_名稱
    欄位2_值

    例如:

    您的大名
    麥克風
    地區
    工作

    1

    您的大名
    起訴
    地區
    首頁

    2

    您的大名
    約翰福音
    地區
    旅行

    10

    等等。 可以對此腳本進行修改嗎?
    謝謝!

    • 10

      當然可以。

      嘗試這樣的事情:

      SELECT * from MyTableName INTO OUTFILE'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt'以'\ n'終止的字段'\ n'終止的行;

      如果要在記錄組之間使用雙倍空格(兩個空行),只需說“以'\ n \ n'結尾的行;“ 代替。

      “ FIELDS TERMINATED BY'\ n'”部分是在每條記錄後放置換行符而不是選項卡的地方。 選項卡將改為“ \ t”。

      馬拉納莎!

  5. 11

    這絕對是一個很棒的帖子,我嘗試了一下,工作得很好,唯一的是我的txt文件在標題標題上方有一個額外的行,並且某些結果分為兩行,這可能是由於我擁有的數據所致在我的數據庫中不知道,但這對構建提要很有幫助……

  6. 12

    Douglas Karr 您的代碼真的很糟糕! 如果僅需要文本文件格式的輸出,這特別有用。 非常感謝! 來自菲律賓隊!

  7. 13

    嘿! 從這裡是否有任何可以給我提示的關於使用我的php作為前端將文本文件導入到數據庫(phpmyAdmin)的提示。 我有一個下載文件並打開它的想法,我的問題是如何獲取行結果以及如何將其插入表中,謝謝

  8. 14

你覺得呢?

本網站使用Akismet來減少垃圾郵件。 了解您的評論如何處理.