使用PHP将MySQL表导出为.txt或.doc文件

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

1
CRON/为MySQLdump安排定时任务... - OMG Ponies
5个回答

6
<?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);
?>

4

这个简单的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” 文件保存在哪里? - user446836
我拼错了一个变量,请再次运行代码。 - EdoDodo
我已经注意到并修复了这个问题,但它仍然无法正常工作 :( - user446836
嗯...奇怪。您确定PHP有适当的权限来创建文件吗?此外,从数据库返回的结果是否正确?也许您可以在循环内的某个地方添加var_dump($row);语句进行检查。 - EdoDodo
也许是权限的问题。我该如何给 PHP 正确的权限? - user446836
显示剩余3条评论

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命令。它不包含任何来自表格的信息。 - user446836

0
我之前发布的答案只有在一行中的最后一个字段的值不等于该行中任何其他字段的值时才能完美运行。因为逗号分隔的检查是基于最后一个字段值进行的,现在已更改为最后一个字段索引。
如果您使用先前的代码,则无法获得与该行中最后一个字段值相等的字段值附近的正确逗号分隔,否则代码也是正确的。
<?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);
?>

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接