Recent Articles / Archives

PHPExcel 及 PHPPowerPoint

在網上找到兩個實用的 php class,分別是 PHPExcelPHPPowerPoint。它們分別可以很簡單地透過 PHP 讀取及寫入 Excel 2007 及 PowerPoint 2007 的檔案。

April 30, 2009 · 程式設計分享 · No Comments Yet

修改 IIS 上傳限制

IIS 預設上傳限制為 200kb,要修改這個限制,方法如下:

1. 開啟 Internet Information Services Manager (IIS)。 (中文版好像叫 IIS 管理員)

2. 在 server 上面 right click 及選擇 Properties

3. 選取 "Enable Direct Metabase Edit" 並按 OK

4. 開啟 Notepad,開啟以下檔案

%Windows dir%\System 32\Inetsrv\MetaBase.xml

5. 找出字串 AspMaxRequestEntityAllowed,預設是 204800,即 200kb,例如想改為 5mb 的話,應改為:

預設為 AspMaxRequestEntityAllowed = "52428800"

6. 完成後儲存 MetaBase.xml 便完成,不須要重新啟動 IIS。

7. 回到 Internet Information Services Manager (IIS),移除 "Enable Direct Metabase Edit" 的選項。

March 26, 2009 · 程式設計分享 · No Comments Yet

編寫只給特定用戶執行的 shell script

在編寫了一些 shell script 並打算只給予特定用戶執行,可以先取得用戶的 user id,或者直接用 whoami 指令檢查使用者名稱,例如:

if [ $(whoami) = "samtang" ]
then
   # 執行程式碼
else
   echo "You cannot run this script."
   exit 0
fi

如果在另一個情況下,不容許特定用戶執行,可以這樣寫:

if [ $(whoami) = "root" ]
then
   echo "You cannot run this script."
   exit 1
fi

用 PHP 查詢 MySQL Table 使用空間

要查詢 MySQL 資料表所用的空間,雖然資料表是用 MyISAM 的話,可以直接用 ls 指令知道,但這個方法不可以用在 InnoDB 資料表上面。

要計算資料表的容量,可以供用 MySQL 語句 "SHOW TABLE STATUS" 實現,然後將回傳的 Data_length 加 Index_length 即可。以下程式會擷取資料庫內所有資料表的使用空間:

PHP:
  1. <?php
  2. $db_link = mysql_connect("localhost", "db_username", "db_password");
  3. mysql_select_db("db_name", $db_link);
  4.  
  5. $result = mysql_query("SHOW TABLE STATUS");
  6. while($rows = mysql_fetch_array($result)){
  7.     $total_size = $rows['Data_length'] + $rows['Index_length'];
  8.  
  9.     // return table size by KB or MB
  10.     if($total_size <1048576){
  11.         $total_size = $total_size / 1024;
  12.     }else{
  13.         $total_size = $total_size / 1024 / 1024;
  14.     }
  15.  
  16.     $tables[$rows['Name']] = sprintf("%.2f", $total_size);
  17. }
  18.  
  19. print_r($tables);

February 27, 2009 · 程式設計分享 · No Comments Yet

“==” 及 “===” 在 PHP 的分別

在 PHP 裡面,兩個比較運算式 "==" 及 "===" 的分別是,"==" 用作檢查變數的值是否相同;而 "==" 則會檢查變數的值及資料型態。

"==":

PHP:
  1. <?php
  2. $str_var = "123";
  3. if($str_var == 123){
  4.     echo "Yes";
  5. }else{
  6.     echo "No";
  7. }
  8. ?>

以上程式碼執行結果會輸入 "Yes",因為變數 $str_var 及整數 123 是相同的值,但如果改用 "===" 便會有不同的結果:

"==="

PHP:
  1. <?php
  2. $str_var = "123";
  3. if($str_var === 123){
  4.     echo "Yes";
  5. }else{
  6.     echo "No";
  7. }
  8. ?>

以上程式碼會輸入 "No",因為雖然 $str_var 及 123 的值是相同,但兩者的資料型態不同。 (用引號包著的 "123" 是字串;而沒有引號的 123 則是整數)

但如果將程式碼改成以下這樣,便會輸出 "Yes"

PHP:
  1. <?php
  2. $str_var = 123;
  3. if($str_var === 123){
  4.     echo "Yes";
  5. }else{
  6.     echo "No";
  7. }
  8. ?>

January 23, 2009 · 程式設計分享 · No Comments Yet


open_basedir 設定多個目錄問題

在 PHP 內有一個安全選項是 open_basedir,這個選項是限制 PHP 可以開啟的目錄,可以透過 php.ini 及 httpd.conf 設定,而我一直也有使用這個選項。

今天 server 要改一些設定,要將兩個目錄加入 open_basedir 內,發現用論用空格、逗號、分號來區隔兩個目錄都不行,而根據 PHP 官方網站的說法,這個選擇是支援多個目錄的。在 google 找了一下,原來要用冒號來區隔兩個目錄,例如:

open_basedir "/path/dir1/:/var/tmp/"

July 9, 2008 · 程式設計分享 · Comments (1)

Microsoft 的免費軟件開發工具

Microsoft 開始一項名為 DreamSpark 的活動,內容是讓學生可以免費用微軟的軟件開發工具。一套完整的 .net 開發平始十分昂貴,要購買這類昂貴的商業軟件才可以學習一門技術,那已經對入門已經加上一重障礙,這項舉動無疑可以讓學生更早接觸微軟的開發工具。

如果你是全職學生,只要到 DreamSpark 網站登記,那便可以免費下載以下產品:

-- Microsoft Visual Studio 2008 Professional Edition
-- Windows Server 2003 Standard Edition
-- Microsoft SQL Server 2005 Developer Edition
-- Microsoft Expression Studio
-- Game Studio 2.0
-- Creators Club Online
-- Microsoft Visual Studio 2005 Professional Edition
-- Microsoft Visual C# 2005 Express Edition
-- Microsoft Visual C++ 2005 Express Edition
-- Microsoft Visual Basic 2005 Express Edition
-- Microsoft SQL Server 2005 Express Edition
-- Microsoft Visual Web 2005 Express Edition
-- Microsoft Visual J++ 2005 Express Edition
-- Microsoft Visual PC

February 27, 2008 · 程式設計分享 · No Comments Yet

基本分析 vs 技術分析

大家如有看一些 phone-in 的財經節目,一定會聽過支持位、阻力位、黃金比率等字眼,這些都是股票技術分析的名詞。看技術分析一般是從事短線買賣,或者對於長線投資者,希望從技術分析捕捉一個較佳的入市位。

我沒有學過技術分析,也不打算學,因為個人較認同基本分析,相信股價長遠而言會和盈利掛鈎,而且基本因素比技術因素較紮實。如果公司有優秀的業績,那麼即使股價下跌也會較有信心。

近期比較少留意財經消息,因為這個月較多工作。正如特首所講:「我要做好呢份工」,做好正職才是根本,從沒想過全職炒股,搞不好分分鐘成為病態股民,我買股票的目的只是對抗通漲及資本增值。

December 15, 2007 · 程式設計分享 · No Comments Yet

不使用 form 之下傳送 POST 變數

可以打開 HTTP socket 連線及傳送 HTTP POST 指令,以下是範例:

PHP:
  1. <?php
  2. // Generate the request header
  3. $ReqHeader =
  4. "POST $URI HTTP/1.1n".
  5. "Host: $Hostn".
  6. "Content-Type: application/x-www-form-urlencodedn".
  7. "Content-Length: $ContentLengthnn".
  8. "$ReqBodyn";
  9.  
  10. // Open the connection to the host
  11. $socket = fsockopen($Host, 80, &$errno, &$errstr);
  12. if (!$socket){
  13.  
  14.    $Result["errno"] = $errno;
  15.    $Result["errstr"] = $errstr;
  16.    return $Result;
  17. }
  18. $idx = 0;
  19. fputs($socket, $ReqHeader);
  20. while (!feof($socket)){
  21.    $Result[$idx++] = fgets($socket, 128);
  22. }
  23. //-------------------------------------------
  24. ?>

或者可以使用 PHP 的 cURL extension。當你安裝了 cURL 及重新編譯 PHP 支援 cURL後,便可以用以下這個較簡單的方法:

PHP:
  1. <?php
  2. $URL="www.mysite.com/test.php";
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_URL,"https://$URL");
  5. curl_setopt($ch, CURLOPT_POST, 1);
  6. curl_setopt($ch, CURLOPT_POSTFIELDS, "Data1=blah&Data2=blah");curl_exec ($ch);
  7. curl_close ($ch);
  8. ?>

December 11, 2007 · 程式設計分享 · No Comments Yet

使用 MySQL 儲存圖片

其實這個方法不單可以用在 MySQL,在其他資料庫及非圖片也應該也沒問題,原理是 使用 base64_encode() 將檔案轉成 MIME base64 字串編碼,然後放入資料表,當然儲存檔案用的欄位要夠大才可以,在取出時用 base64_decode() 回復原狀即可,以下是例子:

PHP:
  1. <?php
  2. $file_str=base64_encode($file);
  3. mysql_query("insert into table_name values ('$file_str')");
  4. ?>

December 10, 2007 · 程式設計分享 · Comments (1)


PHP 內將數值自動補零

如果在 PHP 想將數值自動補零,例如以 00, 01, 02 ...... 等方式顯示,可以用以下方法:

$var = 1;
echo sprintf("%02d", $var);

這樣就會印出 01,其中 2 是顯示的位數,如果想顯示 001,可以改成 sprintf("%03d", $var);

December 7, 2007 · 程式設計分享 · No Comments Yet

PHP 存取 MySQL 4.1 的亂碼問題

早前替客戶開發了一個系統,原本沒遇到問題,但這個星期他們致電給我說不能輸入中文。這時覺得奇怪,MySQL 內的 table 欄位已設成 utf8,而輸入介面及顯示頁面的編碼均為 utf8。

然後在 MySQL 官方網站的 Character Set Support 找到解決方法。

只要在查詣資料表時使用 SET NAMES 'utf8'; 即可解決,這個語句等同於以下句:

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

December 6, 2007 · 程式設計分享 · No Comments Yet

解決 MySQL 4.1.x 以上的認證問題

因為 MySQL 在 4.1 或以上的版本的認證加密方法更改了,那即是說在 php 程式內即使密碼正確也會連接失敗。解決方法為:

1. 重新編譯 PHP
將 --with-mysql 的選項改為 --with-mysqli=mysql_config_path/mysql_config,其中 mysq_config_path 是 MySQL 的安裝路徑下的 bin 目錄。

2. 修改 my.cnf
打開 /etc/my.cnf,在 "[mysqld]" 下加入一行

old-passwords

然後重啟 MySQL,這樣就會強逼 MySQL 使用舊加密認證。

隨機抽取 MySQL 內的資料

如果要在資料庫內隨機抽取資料,可以用 PHP 或 MySQL 內置的 RAND() 函式來做,以下是使用 MySQL 的語法:

SELECT * FROM table_name ORDER BY RAND() LIMIT 1;

December 5, 2007 · 程式設計分享 · No Comments Yet

用 ImageMagick 製作縮圖

只要在系統安裝 ImageMagick 後,就可以在指令模式下製作各種圖片的持效。當然也可以使用 PHP 從 shell 下使用 ImageMagick,以下是製作縮圖的方法:

shell_exec("/usr/local/bin/convert -sample 500x500 /pathto/images/image1.jpg /pathto/images/image2.jpg");

以上是將來源圖片 /pathto/images/image1.jpg 製作縮圖,高和闊都以 500 像素為上限,那就是說製作出的縮圖會根據原始圖片的比例下,高和閣都不會超出 500 像素,然後檔案會輸出到 /pathto/images/image2.jpg.

如果要單單用 PHP 完成以上工作,要自行計算出縮圖片大小才可以做,而且更加可以用百份比,例如 50%x50% 就是高和闊都是原圖的 50% 大小。

December 5, 2007 · 程式設計分享 · Comments (1)


  Next Page »