创建mysql结果列表后强制下载.txt文件

时间:2014-11-22 01:27:44

标签: php mysql

我想下载一个包含我的mysql查询结果的文件,但我的问题是,.txt文件只包含我的mysql查询的最后一个结果。它实际应该包括5个这样的结果:

http://user:password@server.com:8080

有人能告诉我问题在哪里吗?

<?php
        $result = mysql_query("SELECT serverurl FROM ibn");
    echo mysql_error();
    while ($row = mysql_fetch_array($result)) { 

    $result2 = mysql_query("SELECT streamport,streamname FROM streams");
    echo mysql_error();
    while ($row2 = mysql_fetch_array($result2)) { 

    $result3 = mysql_query("SELECT client_username,client_openpasswd FROM clients WHERE `client_id` = '$id' ");
    echo mysql_error();
    while ($row3 = mysql_fetch_array($result3)) { 

    $streamurl= $row['serverurl'];
    $streamport = $row2['streamport'];
    $streamuser= $row3['client_username'];
    $streampassword= $row3['client_openpasswd'];
    $streamchannel= $row2['streamname'];

    echo "<p>http://$streamuser:$streampassword@$streamurl:$streamport</p>";
                }   
            }

    }

//Generate text file on the fly

header("Content-type: text/plain");
header("Content-Disposition: attachment; filename=bouquet.txt");

?>

1 个答案:

答案 0 :(得分:0)

您可以通过将调用header()移至脚本顶部并稍后发送数据来实现基本输出。只有在将任何输出发送到客户端之前发出标头命令才会生效。

您可以使用简单的脚本演示此内容:

<?php
header("Content-type: text/plain");
header("Content-Disposition: attachment; filename=bouquet.txt");
echo "A line of text\n";

您的代码的其余部分更有问题。目前尚不清楚为什么要这样做,但代码的效果是产生三个表的笛卡尔积。即每个表中的每一行都与每个其他表中的每一行组合。我怀疑这实际上是你想要的,但是......

使用没有JOIN子句的SQL ON可以更有效地实现相同的结果。使用它并连接所需的字段,您可以在单个SQL查询中执行几乎所有操作:

select
  concat('http://',
      clientname,':',
      clientopenpassword,'@',
      serverurl,':',
      streamsport)
  as URL 
from ibn, streams, clients where client_id=1

我将把这个转换为一个可用的PHP脚本作为读者的练习,但上面的代码提供了一个很好的模板。请记住,只有一个查询和一个循环来获取结果并将其发出。

请注意,mysql_*()已弃用 - 请将mysqli_*()用于新代码。您还应该在查询中使用$id时注意可能的SQL注入。