2015-11-04 71 views
0

我已經花了5個小時左右的時間搜索論壇和互聯網來解決這個問題。PHP導出爲CSV - 不導出最新數據

基本上,我有一個網頁,其中使用從Oracle SQL Server收集的數據生成表格。

頁面加載時,表格顯示過去7天的數據。我有一個帶有「Go」按鈕和「導出到CSV」按鈕的日期選擇字段。

如果我點擊導出按鈕,它會提示保存或打開。 CSV是好的,它有正確的數據等等等等

問題是,當我使用日期選擇字段選擇一個日期,然後打開...頁面上的表刷新顯示我具體日期的數據。如果我然後單擊導出到CSV,數據似乎仍然是頁面第一次加載時的原始數據。

這是我的代碼... 對不起,如果代碼不是很好我是一個完全新手到PHP。

if(isset($_POST['csv'])) $csv_request=$_POST['csv']; else $csv_request=""; 
if(isset($_POST['datepicker'])) $date_filter=$_POST['datepicker']; else $date_filter=""; 

$output_csv = ""; 
$chosenDate = $date_filter; 

if($chosenDate== "" || $chosenDate == Null){ 
     $mywhere = 'where timestamp >= trunc(sysdate)-7'; 
    } 
    elseif ($chosenDate=='datepicker'){ 
      $date_chosen = $_POST['datePicker']; 
      $mywhere = "where timestamp like to_date('$date_chosen', 'dd/mm/yyyy')"; 
    } 


     $sql = "Select to_char(timestamp, 'dd/mm/yy hh24:mi') timestamp, site, sum(Manual_coos) Manual_COOS,Sum(Faulty_COOS) Faulty_COOS, bearer from t_ca_Processed 
        ".$mywhere." 
        AND bearer = '4G' 
        AND faulty_coos = 1 
        group by timestamp, site, Manual_coos, Faulty_COOS, bearer 
       UNION ALL 
       Select to_char(timestamp, 'dd/mm/yy hh24:mi') timestamp, site, sum(Manual_coos) Manual_COOS,Sum(Faulty_COOS) Faulty_COOS, bearer from t_ca_Processed 
        ".$mywhere." 
        AND bearer = '4G' 
        AND Manual_coos = 1 
        group by timestamp, site, Manual_coos, Faulty_COOS, bearer 
       Order by timestamp ASC"; 



      $st = $db->execute($sql); 

     $output = "<table class = 'sortable' border = 1 Align = 'Center'> 
         <tr style = 'background-color: #f00;'> 
          <th>TimeStamp</th> 
          <th>Site</th> 
          <th>Manual COOS Total</th> 
          <th>Faulty COOS Total</th> 
          <th>Bearer</th> 
         </tr>"; 

     $output_csv = "TimeStamp,Site,Manual COOS Total,Faulty COOS Total,Bearer\n"; 
     $counter = 0; 

     while (($row = oci_fetch_row($st)) != false) 
      { 
        $output .= "<tr"; 

        $output .= "><td>$row[0]</td> 
         <td align=center>$row[1]</td> 
         <td align=center>$row[2]</td> 
         <td align=center>$row[3]</td> 
         <td align=center>$row[4]</td></tr>\n"; 

        $output_csv .= "$row[0],$row[1],$row[2],$row[3],$row[4]\n"; 
        $counter ++; 
      } 
     $output .= "</table>"; 
     unset($db); 

    If ($csv_request=='csv'){ 

     header("Content-Type: application/octet-stream"); 
     header("Content-Disposition: attachment; filename=\"".$File_name.".csv\";"); 
     header("Content-Transfer-Encoding: binary"); 
     echo $output_csv; 
    } 
    else 
    { 

這是我的HTML

<!DOCTYPE html> 
<html> 
    <head> 
    <style> 
     table.sortable tbody tr:nth-child(2n) td { 
     background: #DDDDDD; 
     } 
     table.sortable tbody tr:nth-child(2n+1) td { 
     background: #ccfffff; 
     } 
    </style> 
     <script type='text/javascript' src="/common/javascript/kpc_sorttable2.js"></script> 
     <script type='text/javascript' src='/common/flot/jquery.js'></script> 
     <script type="text/javascript" src="/common/jquery/ui/1.10.2/ui/jquery-ui.js"></script> 
     <script type="text/javascript" src="/Common/jQuery/ui/1.10.2/ui/jquery.ui.core.js"></script> 
     <script type="text/javascript" src="/Common/jQuery/ui/1.10.2/ui/jquery.ui.widget.js"></script> 
     <script type="text/javascript" src="/Common/jQuery/ui/1.10.2/ui/jquery.ui.datepicker.js"></script> 
     <link rel= 'stylesheet' type=text/css href='/common/style.css'> 
     <script> 
       $(function() { 
        $("#datepicker").datepicker({ 
         dateFormat: 'dd/mm/yy' 
        }) 
       }) 
     </script> 
     <script> 

     </script> 
    </head> 
    <body> 

     <?php generateHeader($menu,'4G Cells Down',1); ?> 
     <div class='whitebox'> 
     <form method='post' action="" name="parameters" id="parameters"> 
      <input type='hidden' name='csv' value='csv'> 
      <input type='submit' value="Export as CSV" style="float: right;"> 
     </form> 
     <form method='post' action="" name="parameters1" id="parameters1"> 
      <h3>Last Refreshed <?= $page_load_time ?></h3> 
      <input type='hidden' name='datepicker' value='datepicker'> 
      <h3>Date: <input type="text" id="datepicker" name="datePicker"><input type='submit' value="Go"></h3> 
      <p><?= $output ?><p> 
     </form> 
     </div> 
     <?php 
      generateFooter(); 
     ?> 
    </body> 
</html> 
<?php } ?> 
當我回聲$ output_csv我總是看到最新的數據集

...但是CSV始終是原始數據。我試圖回聲的CSV,我得到一個錯誤,說頭已被髮送...

我想知道,如果最初加載頁面,csv已創建,並且只有提示下載一次,我打了導出按鈕,當我有新的數據時,文件不能被重寫?

如果我不是很清楚,新的這個:)

歡呼 邁克再次抱歉

+0

您的CSV會被瀏覽器緩存始終保持。要測試此操作,請按CTRL + F5進行頁面的硬刷新,然後嘗試下載CSV。如果它正確,那麼你的過期信息被緩存。爲了解決這個問題,只需要在文件名上添加時間,以便瀏覽器不會認爲它是相同的文件並重新下載。 –

+0

嘗試過Crtl + F5,但沒有運氣仍然是原始數據。不過謝謝。 – Mikey

+0

然後,也許你的問題是進一步上管 –

回答

0

您的文件可能被通過服務器緩存。 如果你添加一個Cache buster和/或緩存頭文件,它應該可以工作。

header("Content-Transfer-Encoding: binary"); 
header("Cache-Control: no-cache, must-revalidate"); 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 

有關PHP header函數的更多信息,包括緩存指令。

如果您爲每個更改或請求生成一個唯一的文件名,它也將被視爲一個新文件,並且緩存將被禁用。

# Generate a unique name for each request 
$File_name = uniqid($File_name . "_"); 
header("Content-Disposition: attachment; filename=\"".$File_name.".csv\";"); 

有關功能的更多細節,請參閱PHP函數uniqid

+0

嗨moorscode我試過緩存控制頭,但它仍然沒有工作,我也放在過期頭,但再次沒有工作。然而,我會嘗試uniqid並在其他頭文件中加回去,謝謝 – Mikey

0

問題是,當你搜索一個日期時,頁面刷新和窗體刷新也是如此,所以當你點擊導出csv時,「請求」就是獲取默認視圖。保持用當前視圖更新表單(選定數據)。

<input type="text" id="datepicker" name="datePicker"> 

的價值必須被中與當前視圖

+0

如何使用當前視圖更新表格? – Mikey

+0

我增加了額外的代碼,使輸入的值保持爲所選內容......但它仍然不起作用 – Mikey