0

我有一个用于从数据库表创建 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,似乎没有创建临时表。我显然在这里做错了什么或错过了什么,但我不知道是什么。

4

2 回答 2

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']);

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

于 2009-11-15T20:03:31.870 回答
0

只要列类型简单,我就有一种穷人的方法来制作 CSV 文件。它可以通过CSV 存储引擎来完成。

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 存在。

您可以根据需要打开文件。顺便说一句,所有字段都用双引号括起来。

试试看 !!!

于 2012-02-16T22:17:18.313 回答