【问题标题】:How to create a temporary table in MySQL to output table data as a CSV file?如何在 MySQL 中创建临时表以将表数据输出为 CSV 文件?
【发布时间】:2024-01-11 04:36:02
【问题描述】:

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

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

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

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

这是我得到的代码:

<?
$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,似乎没有创建临时表。我显然在这里做错了什么或遗漏了什么,但我不知道是什么。

【问题讨论】:

标签: php mysql csv temp-tables


【解决方案1】:

在稍作休息之后,我又回到了它,正如你们所说,我实际上根本不需要临时表。

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

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

最后我发现我需要添加额外的变量 $username 并从 URL 上的查询字符串中获取它的值(不太确定我是如何假设会话信息会到达脚本的 - 头是'没有齿轮!)。是因为脚本无法访问'$session-&gt;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']);

至少现在一切正常! (我确实尝试了其他讨论中的一些建议,但没有任何工作 - 我只有标题行或大量错误)。

【讨论】:

  • 想必任何用户都可以通过更改 URL 中的$user变量来下载其他用户的图书。
【解决方案2】:

如果列类型很简单,我制作 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 存在。

您可以按照自己的意愿打开文件。顺便说一句,所有字段都用双引号括起来。

试试看!!!

【讨论】: