Archive

‘PHP’ 分類過的Archive

fgetcsv 中文字亂碼排除 for PHP

2010年3月10日 尚無評論

PHP相關的函式真的是很多,而且都蠻簡單操作的
單單要讀CSV檔,只要透過fgetcsv 函式就可以處理,而且還可以把擾人的雙引號問題一併排除,不過在使用時,發現中文的處理上有一些瑕疵

上網找了一些資料,針對此問題有蠻多解法,不過還是要看一下問題發生原因

1.如果你的資料檔是big5,就要在讀入時進行iconv or mb_convert_encoding 轉成UFT-8才能使用

2.如果你都是utf-8還遇到問題,就是fgetcsv 的問題啦(我就是這個啦)

所以找到一篇有人重寫了fgetcsv ,試用後發現問題排除了,所以也分享一下解法

function __fgetcsv(&$handle, $length = null, $d = “,”, $e = '”') {
    $d = preg_quote($d);
    $e = preg_quote($e);
    $_line = “”;
    $eof=false;
    while ($eof != true) {
        $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
        $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
        if ($itemcnt % 2 == 0)
            $eof = true;
    }
   $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));

    $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
    preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
    $_csv_data = $_csv_matches[1];

    for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
        $_csv_data[$_csv_i] = preg_replace(“/^” . $e . “(.*)” . $e . “$/s”, “$1”, $_csv_data[$_csv_i]);
        $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
    }
    return empty ($_line) ? false : $_csv_data;
}

經過使用上面的函式,中文字解析出來,字首不會再是亂碼了,但有點要特別注意的,如果你後方有帶很多空值的欄位,他會一併清除,這和原本的fgetcsv 不太一樣,在轉換時要特別注意。

資料來源:
http://blog.csdn.net/shilian_h/archive/2009/07/22/4371051.aspx

Categories: PHP Tags: , ,

貨幣金額數值轉換加上逗號「,」 for PHP

2010年3月5日 尚無評論

在PHP要顯示貨幣金額,就是有加上逗號「,」的數字是很容易的
原本以為是要使用printf 函式,結果去查了一下,有個number_format 函式就可以達到
以下為他的語法

string number_format(float number, int [decimals], string [dec_point], string [thousands_sep]);

如想看更詳細的說明,請至 http://php.net/manual/en/function.number-format.php

所以我們可以用以下指令

$return=number_format(“1000000.1234″,4,”.”,”,”);

就可以得到1,000,000.1234,看起來還蠻容易的,結果再進一步的測試,發現怪怪的
當我的值為 10000000000000.4232326 應該可以得到

10,000,000,000,000.4232

沒想到結果不對了,竟然得到如下的資料,小數的數值不對了

10,000,000,000,000.4238

多測了幾組,都發現這狀況,看來在數值大於一定位數時,就會有錯亂,應該是PHP數值的變數接受的位數有限,所以大於的數值就可能會補數來補數去的吧..反正就是亂了

所以為了這種位數超大的值,小弟寫了一個小函式,改用字串的方式處理,就可以排除此問題

function money_format($data,$n=0) {
$data1=number_format(substr($data,0,strrpos($data,”.”)==0?strlen($data):strrpos($data,”.”)));
$data2=substr( strrchr( $data, “.” ), 1 );
if($data2==0) $data3=””;
  else {
   if(strlen($data2)>$n) $data3=substr($data2,0,$n);
     else $data3=$data2;
  $data3=”.”.$data3;
  }
return $data1;
}

傳入值為$data 就是你要轉換的數值,$n就是小數點後面的位數

除了排除這個問題,在使用number_format時發現如果設定小數位數四位,如不足四數就會補零 。例如: 100000.12 會顯示  100,000.1200 ,所以小弟也順便調整,可以把後面的零給取消掉。在此提供給一樣遇到這問題的人一個方法(不一定是好方法,但一定是可行的方法)

Categories: PHP Tags: ,

Maximum execution time of 30 seconds exceeded For PHP

2009年2月9日 尚無評論

最近在執行一項功能時,發現都會出現Maximum execution time of 30 seconds exceeded的錯誤訊息
查了一下,才知PHP預設執行時間超過了30秒的限制時,會丟出這個訊息,如果要執行一些複雜的動作
或是讀資料庫過久時,像產生報表時,可能30秒是不夠用的。

所以要調大這個限制時間,要去調整 php的參數設定檔才行
一般php.ini 於Linux平台是在 /etc/php.ini  ,如果是windows平台就是在c:\windows之下
找到打開後,搜尋一下 max_execution_time就可以找到

max_execution_time =30

就是這個參數限制執行時間,所以可以調整為限兩分鐘就是120 (請斟酌調整)
這樣,再重開你的apache就行啦~~

Categories: PHP Tags: ,

JSON 解析與運用 for PHP

2009年1月6日 尚無評論

JSON格式在Javascript裡算是標準的資料格式,但在其它語言就不算是了,所以各家server端的程式語言就要去解析來配合了,目前剛好會先用PHP進行與jquery的測試,所以先對PHP對JSON解析進行瞭解。

目前PHP在5.2版之後已經有內建支援JSON的轉換函式,看來也是因為ajax當道,所以php 直接內建了..^^
在5.2版的PHP 可以使用 json_encode及json_decode 進行轉換成PHP物件陣列,用法如下:

//PHP
$test=array(
“x” => 1,
“y” => 2,
“str” => “test string”,
“a” => array (
  “array value 1”,
  “array value 2”,
  3
}
);

$jsonstr = json_encode($test);
$jsonstr內容則為
{
“x”:1,
“y”:2,
“str”:”test string”,
“a”:[
  “array value 1”,
  “array value 2”,
  3
]
}


目前json_encode對中文字只能用utf8,要特別注意這點。最後取回時在Javascript 執行eval()即可使用了

var test= eval(“(“+ jsonstr + “)”)


那再來如果使用的PHP版本非5.2之後,可以考慮其它人家寫好的套件,像PHP-json 算是library 如果不是自己架設的web server,可能就很不方便了,這裡有一篇網誌 石頭閒語:PHP::JSON
in PHP – 樂多日誌
有在介紹請自行參考
。除此之外,也可以使用Services_JSON (BSD license),或者是Zend-Json (New BSD license)。不過Zend的Framework,在官網顯示PHP版本不能低於5.1.4,建議使用5.2.3以上的版本,所以看來幫助不大。

如果是php4的,可以參考以下兩篇,都有合適的lincude 函式庫可以使用:


相關參考資料:
http://nervstudio.blogspot.com/2007/02/ajaj-php-json-javascript.html

Categories: PHP Tags: , ,

使用imap_open 進行POP3驗證身份 排除 Warning: imap_open(): Couldn't open stream 完全解決方案

2008年4月5日 尚無評論

最近有機會需要透過Email帳號驗證來進行身份的認證,所以就透過POP3的認證方式進行
PHP在連線時相當方便,查了一下資料發現本身有imap函式就可以使用
不過在使用時發生一些問題,看來程式簡單但這也算整合,連線就複雜多了
在此列出一些要注意的事項,方便大家在使用時check

more..

Categories: PHP Tags: ,
分頁: 上一頁 1 2 3 4