關於 PHP, Linux, Open Source 及個人生活記載的網誌。
RSS icon
  • PHP 檢查 apache module 是否啟動

    Posted on July 22nd, 2009 Sam Tang No comments

    如果要用 PHP 檢查 apache 的 module 是否已啟動,可以用以下方法實現:

    PHP:
    1. <?php
    2. function module_enabled($module){
    3.     $modules = apache_get_modules();
    4.     return in_array($module, $modules);
    5. }
    6.  
    7. if(module_enabled("mod_rewrite")){
    8.     echo "mod_rewrite enabled.";
    9. }
    10. ?>

    以上程式碼會檢查 mod_rewrite 是否開啟。這個方法只支援 apache module 安裝的 php,而不支援以 cgi 執行的 PHP。


  • Perl 或 Shell 變更 Linux 用戶密碼

    Posted on June 6th, 2009 Sam Tang No comments

    用 Perl 更改 Linux 系統密碼,可以使用 Unix::PasswdFile,它是處理 /etc/passwd 檔案的 CPAN module。
    Perl code:

    PERL:
    1. #!/usr/bin/perl
    2. use Unix::PasswdFile;
    3.  
    4. $pw = new Unix::PasswdFile "/etc/passwd";
    5. $pw->passwd("monk", $pw->encpass("My-New-Password"));
    6. $pw->commit();
    7. undef $pw;

    如果想透過 Shell Script 來變更用戶密碼,可以用以下指令:

    # echo $PASSWORD | /usr/bin/passwd --stdin $USERNAME

  • FreeBSD 新增/更改用戶密碼 Shell Script

    Posted on June 5th, 2009 Sam Tang No comments

    在 FreeBSD 下可以用以下非互動方法新增用戶或修改用戶密碼:

    新增使用者: (使用者名稱為 new_user,密碼為 new_pass)

    # echo topSecrete | pw add user vivek -h 0

    更改現有使用者密碼:

    # echo newPassword | pw mod user user_name -h 0

    只要用以上指令,便可以編寫新增及更改用戶密碼的 shell script。


  • PHPExcel 及 PHPPowerPoint

    Posted on April 30th, 2009 Sam Tang No comments

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


  • 修改 IIS 上傳限制

    Posted on March 26th, 2009 Sam Tang No comments

    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" 的選項。


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

    Posted on March 17th, 2009 Sam Tang No comments

    在編寫了一些 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 使用空間

    Posted on February 27th, 2009 Sam Tang No comments

    要查詢 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);


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

    Posted on January 23rd, 2009 Sam Tang 1 comment

    在 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. ?>


  • open_basedir 設定多個目錄問題

    Posted on July 9th, 2008 Sam Tang 1 comment

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

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

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


  • Microsoft 的免費軟件開發工具

    Posted on February 27th, 2008 Sam Tang No comments

    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


  • 基本分析 vs 技術分析

    Posted on December 15th, 2007 Sam Tang No comments

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

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

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


  • 不使用 form 之下傳送 POST 變數

    Posted on December 11th, 2007 Sam Tang No comments

    可以打開 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. ?>


  • 使用 MySQL 儲存圖片

    Posted on December 10th, 2007 Sam Tang 1 comment

    其實這個方法不單可以用在 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. ?>


  • PHP 內將數值自動補零

    Posted on December 7th, 2007 Sam Tang No comments

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

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

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


  • PHP 存取 MySQL 4.1 的亂碼問題

    Posted on December 6th, 2007 Sam Tang No comments

    早前替客戶開發了一個系統,原本沒遇到問題,但這個星期他們致電給我說不能輸入中文。這時覺得奇怪,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;