2009年12月1日

Windows 下安裝 PHP 的 iconv 的方法

  一般使用者可能會認為在 PHP 下想要使用 iconv 的話,只要把 php.ini 裡面的分號 ; 拿掉就以了:

;extension=php_iconv.dll

  一般像 GD2 之類的 Library 照這樣安裝是沒有錯,但是在 iconv 狀況就不同了,馬上就出現下面的畫面:


    因為要啟動 iconv 的功能,除了 php_iconv.dll 之外,還需要一個 iconv.dll,也就是需要 php_iconv.dll 和 iconv.dll 都可以讓 php 找的到的狀況之下。所以正確安裝的方式是:

1.到 PHP 目錄下的 dlls 找到 iconv.dll
(如果找不到的話,請下載 PHP 的 zip 版本)

2.把 iconv.dll 複製到 c:\windows\system32 下

3.重新啟動 apache

這樣就完成了。

(C:\windows 為 Windows 作業系統的安裝目錄,請視自已電腦的環境做修改。)

  以上的作法是在 extension 路徑設定正確或是直接把 extension 的檔案放到 C:\Windows\System32 的狀況。所以如果還是不行,代表你的 PHP 可能是用手動安裝,或是 php.ini 內的 extension 的目錄與目前執行的目錄不合,所以 php_iconv.dll 找不到。

這時有二種作法:

[作法1]
把 extension 下的 php_iconv.dll 複製到 c:\windows\system32 裡面。

[作法2]
在 php.ini 裡面修改 extension_dir 為 php extension 的目錄,如 c:\php\extension

以下是題外話:

  如果想在 windows 下的 dos 模式可以像 Linux 可以直接使用 iconv 指令的話,可以在這裡下載 Windows 版本的 iconv 套件。

http://www.zlatkovic.com/pub/libxml/iconv-1.9.1.win32.zip

 
參考資料:http://www.neo.com.tw/archives/347

請勿用保留字來取 HTML 的標籤名與讓 Web Script 轉頁時自動指定 Frame

[Javascript] 請勿用保留字來取 HTML 的標籤名

  剛剛查一個 javascript 的 bug ,原因是 document.form1.submit(); 不能動作。出現的錯誤訊息是「物件不支援此屬性或方法」,這種 document.form1.submit(); 的 javascript 是再平常不過的指令,怎麼可能不支援呢?後來才發現,是美編把 submit 的按鈕取名叫 submit,也就是在 HTML 裡面有一行是:

<input type="submit" name="submit" value="submit">

  這樣 document.form1.submit(); 就無法執行了,因為 document.form1.submit 已經變成那個按鈕的物件了,自然 submit 的 method 也無法動作。

  因為自己不會犯這種用保留字來取 HTML Tag name 的錯誤,不過遇到對程式不熟的美編,還是會遇到這種狀況,只能自求多福了。

 
讓 Web Script 轉頁時自動指定 Frame
 
  一般在用 ASP、PHP、JSP 等 Web scripts 轉頁時,有 frame 的狀況下都是轉在同一個 Frame ,變成如果有時要 refresh 整個 frame 時,就會變成這樣。
登入前:


 
 
 
 
 
 
 
 
 
登入後:
 

 
 
 
 
 
 
  看到了嗎? 左邊的地方又重覆多了一層選單出來;對於我這種不喜歡用 javascript 來搭配轉頁的人,利用 meta 的 <base>來指定動作的 Frame 是最好的方法,於是我在左邊 Frame 的 裡面加入 <base target="_top">,target 就是你要反應的 Frame名稱,如果指定 _top 即為頂層frame,也就是右邊視窗的所有動作,都會反應在整個畫面上 。


<head>
<BASE target="_top">
...
...
</head>

  果然 javascript 一行都不用寫,只要右邊轉頁,整個畫面都跟著變動,左邊的選單也不會重覆出現了。



參考資料:

使用PHP解譯 javascript escape() 編碼過的字串

  PHP 跟 Javascript 都有 HTML encoding 的函式,編碼過的結果雖然類似,但是還是有些微的不同,所以不能互轉。


二者的差異可以可參考:

http://web.archive.org/web/20030811181238/http://php.weblogs.com/php_jscript_vbscript_1

節錄如下:

PHP:
urlencode( ) All punctuation, accented characters, and any other non-ASCII characters are replaced with %xx encoding. Spaces converted to +.
urldecode( )All punctuation, accented characters, and any other non-ASCII characters are replaced with %xx encoding. Spaces converted to +.

Javascript::
escape(str) All spaces, punctuation, accented characters, and any other non-ASCII characters are replaced with %xx encoding


  那要如何用 PHP 來讀取 escape() 編碼過的字串呢?可以用以下的方式來讀取 (範例為 Unicode 解譯為 big5)

修改自:http://web.archive.org/web/20041031225806/http://vivian.stripper.jp/index.php?itemid=100

$str = uniDecode($str,'big-5');
function uniDecode($str,$charcode){
$text = preg_replace_callback("/%u[0-9A-Za-z]{4}/",toUtf8,$str);
return mb_convert_encoding($text, $charcode, 'utf-8');
}


function toUtf8($ar){
foreach($ar as $val){
$val = intval(substr($val,2),16);
if($val < 0x7F){ // 0000-007F
$c .= chr($val);
}elseif($val < 0x800) { // 0080-0800
$c .= chr(0xC0
($val / 64));
$c .= chr(0x80
($val % 64));
}else{ // 0800-FFFF
$c .= chr(0xE0
(($val / 64) / 64));
$c .= chr(0x80
(($val / 64) % 64));
$c .= chr(0x80
($val % 64));
}
}
return $c;
}



參考資料:http://www.neo.com.tw/archives/152

資料庫表單的多層分類搜尋 - 資料庫連結與遞迴篇

遞迴篇

  這個需求是在大鳥需要的拍賣網站會用到,其實一般搜尋引擎也常常會用類似這種「搜尋此分類下所有項目」的功能。


  不過這篇不是講如何搜尋,而是要抓出分類之下的所有次分類,有了所有的分類之後,再下搜尋語法就沒什麼困難了。

我們先來定義一個簡單的分類結構範例:

女性用品 ->保養品 ->臉部
->身體
--------------------------------------------------------------------------------
->背包 ->水餃包
->側揹包
->方包

  資料庫規畫上,每個分類只要記住自己屬於誰之下(也就是上一層的分類) 就可以了。

範例:


資料庫:CATA
欄位1 :NAME (分類名稱)
欄位2 ARENT (上層分類名稱)

  再來我們的目的主要是列出某個分類之下所有的分類清單,像是我要抓出「背包」之下的所有分類,只要執行 getSubs("背包"),即可回傳 "水餃包","側揹包","方包"

(以下語法範例為 php + adodb 遞迴)

function getSubs($n)

{
global $conn, $subs;
sql = "SELECT NAME FROM CATA WHERE PARENT=".$n ;
$rs = &$conn->Execute($sql);
$subs.= $n.", ";
while ($rs && !$rs->EOF)
{
$nextname = $rs->fields["NAME"];
getSubs($i); //開始遞迴:
$rs->MoveNext();
}
}


這樣就完成這個功能了。

  使用遞迴雖然很方便,但要注意遞迴的原罪,在層數太多時,系統 Loading 會加重,而且在伺服器記憶體不夠的狀況下,非常容易產生 Stack Overflow ,造成整台伺服器突然就當在那邊了。

  如果需要的層數很多、伺服器記憶體又小的話,在下一篇我將介紹另一種方法來達到同樣的功能,而且一點都不複雜喔!

 
資料庫連結篇
 
  上一次我介紹了多層目錄的遞迴演算法,其實這已經是基礎中的基礎了。但是在不得已的硬體限制下,或許有另一種寫作簡單方式,讓我現在來告訴大家。


  當伺服器主機記憶體不足時,通常會把硬碟當記憶體用,但是這樣是極端耗費系統資源的,別忘了伺服器還有可能當 Web Server、Email Server 使用,在多使用者重覆達行遞迴程式時,那可是不容小看的負擔。

於是,我們就利用資料庫的空間來換取記憶體空間。怎麼說呢?其實很簡單,只要在資料庫加一個欄位,記錄自己所有的上層目錄即可。同樣以上次的範例,我再來解說一次:

女性用品 ->保養品 ->臉部

->身體
--------------------------------------------------------------------------------
->背包 ->水餃包
->側揹包
->方包
資料庫:CATA
欄位1 :NAME (分類名稱)
欄位2 ARENT (上層分類名稱)
欄位3 ARENT_LINK (所有上層分類名稱)

  PARENT_LINK 記載的就是自己所有的上層目錄,以「方包」為例,方包的PARENT_LINK 就是:
"女性用品,背包"

  當每個分類的 PARENT_LINK 都建好之後,我要找「背包」之下所有的分類名稱時,只要下一段 SQL Command:

SELECT NAME FROM CATA WHERE PARENT_LINK LIKE '%背包%'

這樣是不是簡單很多,相信連初學者都看的懂。^_^

  使用這個方法雖然方便,但同時也有一個缺點。就是 PARENT_LINK 的維護相當不容易,當所有分類有任何變動時,必須同時去更新每一個分類的 PARENT_LINK,才能確保這個分類的連結是正確的,這樣程式寫起來或許比遞迴還要多。

  當然使用遞迴或這個方法各有優缺,就看您自己的需求而定囉!

參考資料:
http://www.neo.com.tw/archives/105
http://www.neo.com.tw/archives/109

禁止執行某些 PHP 指令

如何禁止使用者執行某些 PHP 指令?

很多指令如 shell_exec、system、passthru、popen 等都是系統相關的指令,如果虛擬主機開放給使用者使用,或是在系統權限沒設定完整的情況下,必然會造成很大的傷害。

要達到這個需求,只要在 php.ini 裡設定 disble_function 這個選項就能設定禁止執行的指令了。


範例:

disable_functions = phpinfo

要多個指令的話,用逗點隔開,如:

disable_functions = shell_exec, system, passthru, popen



參考資料:http://www.neo.com.tw/archives/56

聖誕跑趴歡樂降★韓版假兩件針織連衣裙$890,新款顯瘦棒球服連帽風衣外套下殺$510,冬新款歐美棉襖棉服連帽短款外套限量↘$530,秋冬新款韓版大碼毛領氣質毛料外套↘$680,快上左耳貓網路購物

您好!如圖太小看不清楚,請 點選此處 看詳細內容 左耳貓蝦皮賣場 https://shopee.tw/hrf5168 左耳貓 露天賣場 http://class.ruten.com.tw/user/index00.php?s=starbox 左耳貓粉...