最近工作的某一個案子中,遇到需要在前台讀取資料庫的資料並以表格方式呈現,且可以直接在前台修改表格內容。

No.商品名稱商品料號建議售價實際售價尺寸....n項
1產品1a00000120101....
2產品2a00000240202....
...........................
n產品na00000n2001001n...

嗯...大致上就像上面的表格,看起來是挺普通的...一般來說,直接在table上修改資料內容也挺常見的,但這次Aidec卻遇到些狀況

那就是此次客戶要求所有的更新不直接存入資料庫,而是要在線上編輯後輸出成csv格式,然後在經過它們公司內部層層審核後,再將此csv匯入到網站中更新資料庫的內容....


老實說,第一次遇到這種情況,所以也沒有什麼好方法,唯一能想到的做法就是將所有的欄位都弄成input等修改完後,在以POST的方式傳遞到處理頁並將全部的input整理輸出成csv格式。起初在測試10幾筆資料時,並沒有什麼問題。但是當測試約300筆資料(約1000個input)時,就發現出現資料有遺漏的問題...


事件的元凶

當絕望之際,上網抱google大腿後,發現到事件的元凶了!!原來是因為php預設有限制input的數量不可超過1000個,所以當input太多時就會被截斷。從來也沒想過會遇到一個頁面有1000個以上input的問題,但既然遇到了該如何解決呢??


解決辦法

上網搜尋後,有找到一個辦法,那就是修改php.inimax_input_vars的值,將這個值的數量調大後,便可以接收更多的input。但是,問題又來了!!假如是用虛擬主機沒辦法修改php.ini呢?? 所以又上網搜尋了一番發現到可以建立 .htaccess 文件在裡面添加 

php_value max_input_vars 6000 

php_value suhosin.post.max_vars 6000 

php_value suhosin.request.max_vars 6000

修改php_max_input_vars

沒那麼簡單

但是事情沒那麼簡單,又有問題出現了!!那就是沒辦法保證到底會有多少個input,一直修改php_max_input_vars這個辦法似乎有些OOXX,而且有些虛擬主機好像也無法修改 .htaccess ,那到底還能怎麼做呢??


最後自己想出了一個辦法,那就是將所有的input轉換成json格式,在以字串的方式傳遞到伺服端,然後再用json_decode還原成array。這樣就不必去管有多少個input了。

範例:

html:

<form  id="form" method="POST"  > 
<input type="text"  name="output_data[1][product_name]" value="商品1">
<input type="text"  name="output_data[2][product_name]" value="商品2">
<input type="text"  name="output_data[3][product_name]" value="商品3">
<input type="text"  name="output_data[4][product_name]" value="商品4">
<input type="text"  name="output_data[5][product_name]" value="商品5"> 
</form>


javascipt:

為了方便將input序列化成json格式所以用jquery.serializeJSON外掛來輔助。

<script>
 var data=[];
 data.push({ 
    name: "myData",  
    value: JSON.stringify($('#form').serializeJSON()) 
 }); 
//以load的方式,傳遞post參數(偷懶) 
$('#result').load('action.php',data); 
</script>

註:這個案子是用jQuery做。

jquery.serializeJSON外掛載點


php:

<?php 
$data=json_decode($_POST['myData'],JSON_FORCE_OBJECT);
?>


這樣就可以解決有大量的input問題了,當然有更好的方法請告知我 ^^


文章轉載或引用,請先告知並保留原文出處與連結!!(單純分享或非營利的只需保留原文出處,不用告知)

原文連結:
https://blog.aidec.tw/post/php-max-input-limit