2013-12-12 38 views
1

我在這裏要做的是讓用戶輸入DATEFROM和DATETO。然後,當用戶單擊按鈕解壓縮到Excel文件時,將執行查詢,在該位置將從表中選擇所有列,其中BETWEEN DATEFROM and DATETO。同時,它會下載一個excel文件,輸出應該在那裏。將用戶輸入的查詢導出到Excel - 只有HTML部分可見

我能夠得到正確的查詢並將其輸出到html中,但我在將它導出到Excel時遇到問題。下面是問題:

  1. 即使我不單擊按鈕,導出到Excel仍在工作。當我在本地主機上運行程序時,它會自動導出到Excel文件。

  2. Excel文件內部只有HTML部分。

    <form method="POST" action=""> 
        DATE FROM: <input type="date" name="datefrom"> TO: <input type="date" name="dateto"> <input type="submit" value="Extract excel file" name="extract"></input> 
        </form> 
    
        <?php 
        header("Content-type: text/csv; charset=UTF-8"); 
        header('Content-Disposition: attachment; filename=Export.csv'); 
    
        if(isset($_POST['extract'])){ 
         $con = mysql_connect("localhost", "root"); 
         if(!$con){ 
          echo "Error connection"; 
           } 
    
         $select_db = mysql_select_db('sample', $con); 
         if(!$select_db){ 
          echo "Error to select database"; 
           } 
         mysql_set_charset("utf8", $con); 
    
         $datefrom = $_POST['datefrom']; 
         $dateto = $_POST['dateto']; 
    
        $myquery = mysql_query("SELECT * FROM biometrics WHERE date_created BETWEEN '" . $datefrom . "' AND '" . $dateto . "' ORDER BY empno"); 
    
        //While loop to fetch the records 
        $contents = "id_biometrics,empno,date_created,time_created,status\n"; 
        while($row = mysql_fetch_array($myquery)) 
        { 
         $contents.=$row['id_biometrics'].","; 
         $contents.=$row['empno'].","; 
         $contents.=$row['date_created'].","; 
         $contents.=$row['time_created'].","; 
         $contents.=$row['status']."\n"; 
    
        } 
    
        $contents_final = chr(255).chr(254).mb_convert_encoding($contents, "UTF-16LE","UTF-8"); 
        print $contents_final; 
        } 
        ?> 
    </body> 
    

+0

*旁註:*停止使用不推薦使用的'mysql_ *'函數。改爲使用[MySQLi](http://php.net/manual/en/book.mysqli.php)或[PDO](http://php.net/manual/en/book.pdo.php)。 – Raptor

回答

1

CSV文件被下載立即之所以裏面是因爲這些頭你只要在頁面加載設置。

header("Content-type: text/csv; charset=UTF-8"); 
    header('Content-Disposition: attachment; filename=Export.csv'); 

這是告訴瀏覽器採取什麼,並將其保存到名爲Export.csv的csv文件。但是,您已經在響應正文(您的HTML)中輸出了數據,因此這是標題將作爲數據發送的內容。當你使用PHP header()函數時,它必須在任何輸出通過管道返回之前運行。

那麼,你如何解決這個問題?在你的PHP文件的最頂端,之前這就是你想放的東西的影響:

<?php 
if(!empty($_POST)){ 
    header("Content-type: text/csv; charset=UTF-8"); 
    header('Content-Disposition: attachment; filename=Export.csv'); 
} 

然後開始你的HTML元素和PHP代碼的其餘部分,或者告訴你的腳本結束,並允許內容作爲文件發送。 blahblahblah

因此,這裏要說的是,必須先設置標題,然後才能將任何內容發送回去,而且這也適用於您可能想要做的任何事情。這裏是PHP頭完整的文檔,如果你需要一個快速reference :)

我會用我的答案的第二部分,兩個挑剔: 1)mysql_ *功能設置已被棄用,轉而使用mysqli_儘快地!

2)您的查詢是開放的SQL注入攻擊,得到擦洗擦洗擦洗!我的意思是使用prepared statements

+1

如果參數已正確轉義,則準備好的語句不是必須的。 – Raptor

+0

當然,如果你正確地逃脫他們。準備好的陳述是,恕我直言,你將能夠有效地做到這一點的最佳方式,儘可能減少人爲錯誤。 – Zarathuztra

+0

調用'mysqli_real_escape_string()'只是一條線,比使用多行預處理語句好得多。 – Raptor

1

這些行:

header("Content-type: text/csv; charset=UTF-8"); 
header('Content-Disposition: attachment; filename=Export.csv'); 

是導致力下載。他們應該在你的if(isset($_POST...裏面。

此外,你的PHP腳本需要在這個文件的最頂端,否則這是行不通的。理想情況下,你將不得不在年底下面你if(isset($_POST

header("Content-type: text/csv; charset=UTF-8"); 
header('Content-Disposition: attachment; filename=Export.csv'); 
print $contents_final; 
exit; 
+0

謝謝!有效。 :D – nicole101

+0

我的榮幸,祝你好運! –