【发布时间】:2014-03-31 15:08:32
【问题描述】:
我已经找到了许多与此类似的问题的“部分”答案,但我是 PHP 和 MySQL 新手,似乎没有一个很好的大而连贯的答案;我想要做的是:
- 从名为“producers”的 MySQL 表中获取所有数据。
- 让用户在其本地计算机上选择文件名/“另存为”位置。
- PHP / MySQL / HTML 获取数据并将其作为 CSV 文件写入。
第 1 部分和第 3 部分很简单;但是让用户选择文件位置/文件名的方法似乎几乎是不可能的。用户选择要上传的文件在 HTML 中很简单,那么为什么我很难找到一种方法让用户选择“保存”位置/名称?这当然不是安全风险 - 从服务器下载的安全风险远低于将内容上传到服务器。
我希望能够使用漂亮而简单的 MySQL 方法,但我不知道如何将这个命令从 PHP 发送到 MySQL;只是把它放在 mysqli_query 中似乎没有任何作用:
SELECT prodCompany,prodPhone,prodFirstname FROM producers
INTO OUTFILE '/Users/me/Desktop/file.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(此方法在 phpMyAdmin 中可以正常工作)。
所以我现在已经采用了笨拙的逐步 PHP 方法,该方法有效,但显然只会将“file.csv”保存到我的桌面。我读过关于 MIME 类型的奇怪提及,但我不确定这对我有什么帮助以及如何实现它。
我只想触发一个文件选择器对话框,将该文件路径/名称放入 $filename 变量中。但是经过几天的挫折之后,我找不到任何有效的方法。任何帮助或建议将不胜感激!
- 保罗
保存到那个文件的 PHP:
<?php
// Create connection
$con=mysqli_connect("xxxxxxxxx","xxxxxxxxx","xxxxxxxxxxxxxx","xxxxxxxxxx");
// Check connection
if (mysqli_connect_errno())
{ echo "Failed to connect to MySQL: " . mysqli_connect_error(); }
$filename = '/Users/me/Desktop/file.csv';
$headers = array('prodCompany', 'prodPhone', 'prodFirstname');
$handle = fopen($filename, 'w');
fputcsv($handle, $headers, ',', '"');
$sql = mysqli_query($con, 'SELECT * FROM producers');
while($results = mysqli_fetch_array($sql)) {
$row = array(
$results['prodCompany'],
$results['prodPhone'],
$results['prodFirstname']
);
fputcsv($handle, $row, ',', '"');
}
fclose($handle);
?>
【问题讨论】:
-
其实是有安全隐患的。如果浏览器可以写入任何目录,那么 javascript 可以写入任何目录。我认为这是真的。
-
感谢 Ryan - 我没有意识到允许用户选择文件可能会允许 javacsript 写访问。马特,如果文件还不存在(它正在“动态”创建)怎么办?让 MySQL 首先在服务器上创建文件会更好(如果可能),一旦该过程完成,然后开始下载/文件选择过程?
-
@MattThompson,但是您可以从浏览器上运行的程序设置下载位置,还是用户至少必须响应下载提示?
-
@MattThompson,问题不是用户响应提示问题。他们希望以编程方式设置文件目标并绕过用户提示。这是可怕的一点。
-
理想情况下,我会出现一个“保存对话框”,用户在文件名中选择一个位置/类型,然后将文件路径放入 $filename 变量中。然后 PHP 的其余部分进行实际保存。我当前的 PHP(显示在原始帖子中)完美运行(这是“强制写入客户端”吗?)但只将一个文件保存在那个位置。如果浏览器不实际保存某些内容,是否无法以某种方式触发“保存对话框”?