2014-03-31 60 views
0

我發現許多類似於這個問題的「部分」答案,但我是PHP和MySQL的新手,似乎並不是一個那裏有很好的連貫的答案;我想要做的是這樣的:保存文件對話框出現在MySQL數據導出後(使用PHP)

  1. 從一個名爲「生產者」的MySQL表中獲取所有數據。
  2. 讓用戶在本地機器上選擇一個文件名/'另存爲'位置。
  3. PHP/MySQL/HTML獲取數據並將其作爲CSV文件寫入。

第1部分和第3部分很容易;但讓用戶選擇文件位置/文件名的方式似乎幾乎不可能。用戶選擇一個文件進行上傳很簡單,所以爲什麼我很難找到一種方法讓用戶選擇「保存」位置/名稱?當然,這不是一個安全風險 - 從服務器下載安全風險要遠遠低於將某些內容上傳到服務器。

我想能夠使用漂亮和簡單的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); 

?> 
+0

實際上,這是一個安全風險。如果瀏覽器可以寫入任何目錄,那麼JavaScript可以寫入任何目錄。我認爲這是事實。 –

+0

謝謝瑞安 - 我沒有意識到,允許用戶選擇一個文件可能會允許javacsript寫訪問。馬特,如果該文件還不存在(它正在「即時創建」)?如果可能的話,讓MySQL首先在服務器上創建文件可能會更好(如果可能),並且一旦該過程完成,那麼是否啓動了下載/文件選擇過程? – Paul

+0

@MattThompson,但是您可以從瀏覽器上運行的程序設置下載位置,還是用戶必須至少響應下載提示? –

回答

0

好了,這個概念是要生成一個CSV文件,並讓用戶保存。

形式獲取文件名

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Example</title> 
</head> 

<body> 
<form name="test" action="csv_gen.php" method="post"> 
    <label for="filename">File name </label> 
    <input type="text" name="filename" id="filename" /> 
    <input type="submit" name="submit" value="go get file" /> 
</form> 
</body> 
</html> 

腳本來處理和力CSV下載

<?php 
if($_POST) { 

    header('Content-Type: text/csv'); 
    header('Content-Disposition: attachment; filename='.$_POST['filename'].'.csv'); 

    //replace this with whatever generates your csv and print it 
    echo "field1,field2,field3,field4,field5\n"; 

} 
?> 

這將做力下載。對於具有默認下載位置的較新瀏覽器(例如Chrome),將使用用戶輸入到表單字段的任何文件名立即下載該文件。然後他們將打開該位置並移動文件。這是非常標準的瀏覽器功能,我不會嘗試覆蓋。它可能會混淆爲下載設置了默認位置的人。

希望能幫助你開始。

+0

啊 - 我知道我做錯了什麼......我花了一段時間才弄清楚PHP腳本是純PHP的 - 我將它嵌入到HTML頁面中,並且破壞了內容。我曾嘗試過一些關於使用頭文件的建議('Content-Type ...'沒有成功,我沒有看到它在任何地方都指出這個過程似乎不能在某些HTML中使用,並且再次感謝所有你幫幫我! – Paul