如何在MySQL中创建临时表以将表数据输出为CSV文件?

时间:2009-11-14 17:57:42

标签: php mysql csv temp-tables

我有一个用于从数据库表创建CSV文件的脚本,除了输出表中的所有数据外,它的工作正常,我需要它才能为当前登录的用户输出数据。我正在开发的应用程序是用户能够存储他们已阅读,想要阅读等的书籍列表,我希望能够允许他们下载他们可以导入Excel的书籍列表例如。 (鉴于还有OpenOffice等以及MS Excel,CSV文件是否是最佳选择?)

我发现我需要创建一个临时表来使用select查询来仅选择属于当前登录用户的记录。我可以使用WHERE username='$session->username'

访问当前用户的数据

我认为在尝试运行输出数据以供在CSV文件中使用的查询之前创建临时表一样容易,然后再删除表格,但我再次尝试了CSV创建代码使用在CSV内容之前创建的临时表,再次生成的CSV文件包含所有用户的所有记录。

有一个配置文件设置数据库连接属性,还有用于创建文件的表,作为变量$table,我将其设置为临时表的名称I我试图创造。

这是我得到的代码:

<?
$link = mysql_connect($host, $user, $pass) or die("Cannot connect to the database." . mysql_error());
mysql_select_db($db) or die("Can not connect.");

$temp = mysql_query("CREATE TEMPORARY TABLE books_temp SELECT * FROM books WHERE username='$session->username'");
$tempresult = mysql_query($temp);

$result = mysql_query("SHOW COLUMNS FROM ".$table."");
$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output .= $row['Field']."; ";
$i++;
}
}
$csv_output .= "\n";

$values = mysql_query("SELECT * FROM ".$table."");
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) {
$csv_output .= $rowr[$j]."; ";
}
$csv_output .= "\n";
}

$filename = $file."_".date("Y-m-d_H-i",time());
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("d-m-Y") . ".csv");
header( "Content-disposition: filename=".$filename.".csv");
print $csv_output;
$query  = 'DROP TABLE books_temp';
$result = mysql_query($query);
exit;
?>

它可以完美地输出所有数据,但在我尝试将它与临时表一起使用时仍会输出所有数据。顺便说一句,我已经尝试删除指令从最后删除临时表,这没有任何区别。此外,检查PhpMyAdmin,似乎没有创建临时表。我显然在这里做错了或遗漏了什么,但我不知道是什么。

2 个答案:

答案 0 :(得分:1)

经过一段时间的休息之后,我又回过头来了,正如你们所说,我根本不需要临时桌子。

为了完整起见,并且任何其他人遇到同样的问题,这是最终的解决方案。

使用SELECT查询的when子句,脚本工作正常,我最终发现,但我仍然没有得到任何数据(只是列名)。我终于弄清楚我没有得到任何数据的原因是因为尽管'$session->username'在我的PHP页面中工作以访问当前用户的名称,但脚本(仅链接到页面)无法访问该会话信息。

最后我解决了我需要添加额外变量$username并从URL上的查询字符串中获取该值(不太确定我是如何假设会话信息将到达脚本 - 头没装备!)。这是因为脚本无法访问脚本无效的'$session->username'

而不是用以下内容链接到脚本:

<a href=\"scripts/mysql2csv.php">Download your list</a>

我使用了它(在页面上声明变量之后):

$accname = $session->username;

<a href=\"scripts/mysql2csv.php?user=$accname\">Download your list</a>

然后,我所要做的就是将$ username变量添加到脚本的顶部,并使用变量修改SELECT查询。

$username = mysql_real_escape_string($_GET['user']);

至少现在一切正常! (我确实在其他讨论中尝试了一些建议,但无法工作 - 要么我只得到标题行,要么加载错误)。

答案 1 :(得分:0)

如果列类型很简单,我有一个穷人制作CSV文件的方法。可以通过CSV Storage Engine来完成。

USE mydb
CREATE TABLE books_csv SELECT * FROM books WHERE 1=2;
ALTER TABLE books_csv ENGINE=CSV;
INSERT INTO books_csv SELECT * FROM books WHERE username='...';

完成此步骤后,文件/var/lib/mysql/mydb/books_csv.CSV存在。

您可以按照自己的意愿打开文件。 BTW所有字段都用双引号括起来。

试一试!!!