我有一个用于从数据库表创建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,似乎没有创建临时表。我显然在这里做错了或遗漏了什么,但我不知道是什么。
答案 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所有字段都用双引号括起来。
试一试!!!