標籤

2014-10-09

{PHP} 網頁傳值超過限制

做公司內部ERP的case,

常會使用到大量的GET、POST甚至COOKIE、SESSION。



我遇到的問題為,明明使用少量資料時系統正常執行,

但大量資料POST時,卻少了好多資料。



原以為是POST資料超過最大值,

但POST的資料在正常使用中是很難被用到最大值的,

爬文之後,發現:

在 PHP 5.3.9 版之後加入了 max_input_vars 的屬性,

詳細可參照 max_input_vars

該值如未設定時,預設為 max_input_vars 1000

也就是最大的傳值總數量為1000

而這數量包含 POST GET COOKIE

最後於pnp.ini將該值設大之後,

便可正常傳送較大量的值了。





2014-09-20

{PHP} 不使用套件匯出格式固定Excel


做這個行業,
一定會遇到沒有程式底的USER說:

「這個東西應該還好吧?」、「小改一下就好了吧?」、「我覺得沒有很難啊?」

聽到常常讓人哭笑不得。


我這次遇到的問題是,

USER希望能直接從web上下載檔案,並且不需要再去調整任何東西,

按個列印,就能漂漂亮亮把他們需要的報表列印出來。

這個部分,一些知名的套件如:PHPExcel 都可以做到,

但若不希望使用套件,實際上也可以直接匯出固定格式的Excel檔案,

雖然步驟較複雜,但其實不難理解。

Step1:
首先,需要使用office 2003 以下的版本,來製作你要的Excel格式


可以看到我設定了欄寬、列高、欄位填滿顏色,甚至還設定了列印的版面橫向與紙張大小。

Step2:
設定好格式之後,我們把要交由PHP去填的欄位資料改為字串

註:以範例來看,{name}這個字串,是後面要用php去取代成要填入的資料,用大括號是為了確保該字串是唯一,不會取代到別的東西。

Step3:
將Excel另存為網頁


Step4:
用文字編輯器,將你另存的htm/html打開

看過檔案你會發現,
這時你在Excel上做的所有動作,其實都已變成用css與Table的Html格式。
因Excel預設開啟格式為BIG5,所以請將html裡的
<*meta http-equiv=Content-Type content="text/html; charset=big5">
改為:
<*meta http-equiv=Content-Type content="text/html; charset=utf-8">
並存檔。

Step5:
這步驟極為重要,
以我的習慣,會將該HTML至少切割成三個部分,Head/Body/Foot,分別把剛剛打開的HTML以TXT格式的方式存檔

如圖示,我會將A線以上的所有資料,存成Head
A線與B線之間的資料,存成Body
B線以下的資料,存成Foot
若還是不清楚,可下載我範例檔案研究 Link

Step6:
以上,所有前置作業已完成,
將Step5所分割好的TXT檔存到同一路徑下,
以我的習慣會將他們再獨立一個資料夾做存放


Step7:
最後匯出的方法為:
//讀入HEAD
$fd = fopen("Excel/forT_head.txt", "r");
while (!feof($fd)) {
    $buffer = fgets($fd, 4096);
    $m_strHead.=$buffer;
}

//讀入BODY
$fd = fopen("Excel/forT_body.txt", "r");
while (!feof($fd)) {
    $buffer = fgets($fd, 4096);
    $m_strBody.=$buffer;
}

//讀入FOOT
$fd = fopen("Excel/forT_foot.txt", "r");
while (!feof($fd)) {
    $buffer = fgets($fd, 4096);
    $m_strFoot.=$buffer;
}
//示範使用迴圈
for ($i = 1; $i < 3; $i++) {
    //將body資料存入temp資料
    $m_strBodytemp = $m_strBody; 
    //取代temp資料的{name}字串
    $m_strBodytemp = str_replace("{name}", "哎唷威".$i, $m_strBodytemp); 
    //取代temp資料的{sex}字串
    $m_strBodytemp = str_replace("{sex}", "男".$i, $m_strBodytemp);
    //取代temp資料的{address}字串
    $m_strBodytemp = str_replace("{address}", "wei6028.blogspot.com".$i, $m_strBodytemp);
    //取代temp資料的{tel}字串
    $m_strBodytemp = str_replace("{tel}", "091234567".$i, $m_strBodytemp);
    
    //再存入$m_strBodyMix
    $m_strBodyMix .= $m_strBodytemp; 
}


//最後利用header方式匯出Excel
$m_strFilename = sprintf("excel_teach_%s.xls", date("YmdHis"));
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=" . $m_strFilename);

//印出Head BodyMix Foot 
echo $m_strHead . $m_strBodyMix . $m_strFoot; 
最後,匯出來的資料,

除了格式完全正確之外,
甚至連列印的預設也是按照原本的設定。

這樣,不論user想要什麼格式,
只要Excel做的出來,你就能給的出來!(得意)

其中還有很多細節用法,若有問題也歡迎提出討論或來信。



註1:在Step4的時候,你可以發現Excel轉成Html時有很多css(例:xl83...)
這些css編號在每次製作excel時都會不同。
所以,若你已經做好,但User又希望再做修改時,
請一定要將Excel重新轉一次HTML並重新切割Head Body Foot

註2:請一定使用office2003以下版本,
在Office2007轉存成HTML時,
無法將其轉存成正常可用之HTML,
這部分我還在測試。

2014-09-18

{PHP} 查出使用者所用的瀏覽器

最近在自己寫的功能裡,

放了一些css3的icon特效。

但把東西做完之後發現IE8不能使用!!!!!

一氣之下決定加入判斷瀏覽器的方式,

爬文之後找到了以下的功能:

if (strpos($_SERVER["HTTP_USER_AGENT"], "MSIE 8.0"))
    echo "Internet Explorer 8.0";
else if (strpos($_SERVER["HTTP_USER_AGENT"], "MSIE 7.0"))
    echo "Internet Explorer 7.0";
else if (strpos($_SERVER["HTTP_USER_AGENT"], "MSIE 6.0"))
    echo "Internet Explorer 6.0";
else if (strpos($_SERVER["HTTP_USER_AGENT"], "Firefox/3"))
    echo "Firefox 3";
else if (strpos($_SERVER["HTTP_USER_AGENT"], "Firefox/2"))
    echo "Firefox 2";
else if (strpos($_SERVER["HTTP_USER_AGENT"], "Chrome"))
    echo "Google Chrome";
else if (strpos($_SERVER["HTTP_USER_AGENT"], "Safari"))
    echo "Safari";
else if (strpos($_SERVER["HTTP_USER_AGENT"], "Opera"))
    echo "Opera";
else
    echo $_SERVER["HTTP_USER_AGENT"];

之後就依照查出來的瀏覽器做切換。

2014-09-11

{PHP} 混合字串切割


在撰寫PHP程式時,時常會使用字元切割抓字串。

substr()
$str = "HelloWorld";
echo substr($str,3); 

執行結果: 
loWorld

或是str_split()
$str = "HelloWorld";
print_r (str_split($str)); 

執行結果: 
Array ( [0] => H [1] => e [2] => l [3] => l [4] => o [5] => W [6] => o [7] => r [8] => l [9] => d )

若是資料組成不複雜,變動性亦不大,用這幾種方式大致上就可解決。


但若遇上中英文組合時,會因字元的不同而造成錯誤。

這時,我在Tsung's Blog找到了Joomla-pasamioutf8_str_split()
function utf8_str_split($str, $split_len = 1) {
    if (!preg_match('/^[0-9]+$/', $split_len) || $split_len < 1) {
        return FALSE;
    }
    $len = strlen($str);
    if ($len <= $split_len) {
        return array($str);
    }
    preg_match_all('/.{' . $split_len . '}|[^\x00]{1,' . $split_len . '}$/us', $str, $ar);

    return $ar[0];
}
簡單解釋是利用正規式加上strlen達成切割的功能。 實際使用結果:
$str = "Hello哈囉";
print_r (utf8_str_split($str));

執行結果:
Array ( [0] => H [1] => e [2] => l [3] => l [4] => o [5] => 哈 [6] => 囉 )

print_r (utf8_str_split($str,3));

執行結果:
Array ( [0] => Hel [1] => lo哈 [2] => 囉 )