2014-06-26 32 views
4

這裏是問題所在。我沒有權利創建一個數據庫,並且我收到一個csv,它每天都會產生大量的數據。 (超過20萬行)以倍數頁面分隔很長的表格html/php

我必須讓每個人都可以在Intranet上訪問的數據。所以我創建了一個簡單的html/php頁面,它可以提取所有行,並將這些信息顯示在一個表格中,每個列上都有一個過濾器,並帶有一個簡單的fgetcsv。

問題是,網絡瀏覽器不適合同時顯示那麼多信息,所以它會讓它崩潰或凍結一段時間,而且你暫時不能做任何事情。

我想知道是否有人知道對頁面說的方式「只加載前100行爲例,然後自動創建下一頁,將加載並顯示下100行等。」

我設法只顯示前x行,然後當你點擊一個按鈕時表格會隨着下一個x行展開,但它們仍然全部被加載。剩下的y只是隱藏的,所以瀏覽器仍然死亡或凍結。

有什麼想法?

謝謝

+2

如果您可以顯示目前爲止所做的一些代碼,這將會非常有用。你只是渲染所有的行,並在其上放置一個「display:none」? –

+1

你想要一個基於JavaScript的解決方案,它將[通過AJAX加載CSV文件](http://datatables.net/forums/discussion/1632/import-csv-into-datatable) - 問題是,這仍然是立即下載整個CSV文件,這會消耗內存。最好的解決方案的確是使用數據庫,可以告訴LIMIT返回的行數。 – Blazemonger

+1

即使您使用csv,您也可以檢索所需的行,不需要擁有數據庫。即使他使用數據庫,他也必須解決這個問題。 –

回答

2

真的是一個普通的分頁問題。數據存儲在數據庫或CSV文件中並不重要。

只需通過查詢字符串或URL重寫將一些偏移量參數傳遞給您的PHP腳本,並使用它僅選擇部分CSV列表。

像這樣:/big-table.php?page=3

// Getting passed argument. 
$pageNumber = (int) $_GET['page']; 

// Items per page default. 
$itemsPerPage = 100; 

// Calculating offset. 
$offset = ($pageNumber - 1) * $itemsPerPage; 

然後使用$offset$itemsPerPage通過限制您的CSV解析循環的範圍檢索您的CSV文件的一部分。

您也可以將每個頁面的項目值作爲參數傳遞給您的腳本,以便從您的Web界面控制此值。例如,如果您想創建一個可以選擇每頁10,50,100項的下拉菜單等。

如果您需要它 - 您可以始終使用AJAX動態獲取更多項目,但它不會「不會影響你的分頁實現服務器端,只有輸出格式(JSON而不是HTML)。

當然數據庫的實現會更快,我建議選擇它,如果可能的話。和/或你可以使用一些緩存層來加快速度。

1

你可以使用jQuery的數據表插件http://datatables.net/

這是很簡單的事你想使用什麼。

指代這個例子:http://datatables.net/examples/data_sources/ajax.htmlhttp://datatables.net/examples/data_sources/server_side.html

+0

謝謝,但問題是你的插件仍然加載整個文件。它只是「隱藏」了部分內容並按需顯示。但是你仍然會加載200k行的csv,這會佔用太多的內存,並使瀏覽器崩潰 – user2407268

0

最明智的做法就是要求數據庫訪問。現在,你被告知建造一輛汽車,但不使用車輪和發動機。

現在,您可以使用PHP將大csv分割成多個較小的文件,分別爲n行。你必須只做一次,或者一天一次/小時,如果大csv更新。然後,只有在需要時才加載這些文件,無論是通過導航到其他頁面還是使用Javascript動態加載。