【问题标题】:Exporting mysql table to .txt or .doc file using PHP使用 PHP 将 mysql 表导出到 .txt 或 .doc 文件
【发布时间】:2011-09-28 07:55:36
【问题描述】:

我有一个 mysql 表,用于记录用户每天发送的消息。我想要做的是每天一次将消息日志导出到文本文件中,但不知道该怎么做。我们的服务器有 phpmyadmin,我可以手动将表导出到文本文件中,但我不知道如何 A)让 phpmyadmin 每天自动导出一次该文件,或者 B)用 php 代码编写导出。我希望导出的文件可供我网站的用户下载。它用 php 编写的网站。如果您需要任何其他信息来回答这个问题,请告诉我!

【问题讨论】:

  • MySQLdump 的 CRON/计划作业...

标签: php mysql export


【解决方案1】:

这个简单的 PHP 脚本会将表格中的所有数据保存到 .txt 文件中。记录将由新行分隔,字段由制表符分隔。这里是:

<?
$fh = fopen('data.txt', 'w');
mysql_connect('host', 'username', 'password');
$result = mysql_query("SELECT * FROM myTable;");
while ($row = mysql_fetch_array($result)) {
    $last = end($row);
    foreach ($row as $item) {
        fwrite($fh, $item);
        if ($item != $last)
            fwrite($fh, "\t");
    }
    fwrite($fh, "\n");
}
fclose($fh);
?>

【讨论】:

  • “data.txt”到底保存在哪里?
  • 它将保存在与 PHP 脚本相同的文件夹中。如果要保存在别处,请指定完整路径,例如:$fh = fopen('/var/www/downloads/data.txt', 'w');
  • 两种方法都试过了,好像没有创建文件
  • 我拼错了其中一个变量。请尝试再次运行代码。
  • 我实际上已经发现并修复了它。它仍然无法正常工作:(
【解决方案2】:

小心滚动你自己的,除非你处理诸如 NULL、字符集等的事情。

第一种选择:

<?php
$pdo = new PDO(...);
$results = $pdo->query("SELECT * FROM myTable INTO OUTFILE 'data.txt'");
$dummy = $result->fetchAll(); 

data.txt 文件将被写入 MySQL 服务器。该目录必须可由 mysqld 进程的 uid 写入。它不会覆盖任何现有文件,并且需要您拥有FILE SQL 权限。

第二种选择:使用 mysqldump 输出到纯文本文件(如@OMG Ponies 所述):

mysqldump -t -T <directory> <database> <table>

类似INTO OUTFILE,需要运行在MySQL服务器主机上,目录必须是mysqld uid可写的。

第三个选项:使用 mysql 客户端运行查询并输出文本:

mysql -B -e "SELECT * FROM MyTable" <database> > mytable.txt

这可以在任何主机上运行,​​并且不需要特殊权限或目录权限。但 NULL 可能无法像使用 mysqldump 或 INTO OUTFILE 那样处理。

【讨论】:

  • 当我运行第三个选项时,会创建 txt 文件,但会填充 mysql 命令。它不包含表格中的任何信息
【解决方案3】:

这个脚本的主要问题是您没有选择数据库,即在“mysql_query”之前使用“mysql_select_db”。然后从“myTable(;)”中删除分号。还要在根文件夹中创建一个空白文本文件,这是存储数据的地方。之后您的脚本应该可以正常工作。此解决方案适用于可能需要此脚本来帮助他们设计的未来用户。

【讨论】:

    【解决方案4】:
    <?php
        $fh = fopen('data.txt', 'w');
        $con = mysql_connect("localhost","root","");
        mysql_select_db("db_name", $con);
    
        /* insert field values into data.txt */
    
        $result = mysql_query("SELECT * FROM table_name");   
        while ($row = mysql_fetch_array($result)) {          
            $last = end($row);          
            $num = mysql_num_fields($result) ;    
            for($i = 0; $i < $num; $i++) {            
                fwrite($fh, $row[$i]);                      
                if ($row[$i] != $last)
                   fwrite($fh, ", ");
            }                                                                 
            fwrite($fh, "\n");
        }
        fclose($fh);
    ?>
    

    【讨论】:

      【解决方案5】:

      我之前发布的答案只有在一行中的最后一个字段值不等于同一行中的任何其他字段值时才能完美工作。因为逗号分隔的检查是基于最后一个字段值,现在它改变了到最后一个字段索引。

      如果你使用前面的代码,那么你不能在字段值附近得到正确的逗号分隔,它等于该行中的最后一个字段值,其他方式代码也是正确的。

      <?php
          $fh = fopen('data.txt', 'w');
          $con = mysql_connect("localhost","root","");
          mysql_select_db("db_name", $con);
      
          /* insert field values into data.txt */
      
          $result = mysql_query("SELECT * FROM table_name");   
          while ($row = mysql_fetch_array($result)) {          
              $num = mysql_num_fields($result) ;    
              $last = $num - 1;
              for($i = 0; $i < $num; $i++) {            
                  fwrite($fh, $row[$i]);                       
                  if ($i != $last) {
                      fwrite($fh, ",");
                  }
              }                                                                 
              fwrite($fh, "\n");
          }
          fclose($fh);
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        • 2021-08-03
        相关资源
        最近更新 更多