關於 PHP, Linux, Open Source 及個人生活記載的網誌。
RSS icon
  • MySQL 編碼函式

    Posted on August 31st, 2007 Sam Tang No comments

    MySQL 內建提供了一些編碼函式,以下會介紹 ENCODE() 及 DECODE() 的作用及用法:

    ENCODE(str,pass_str)
    將字串 str 加密,並使用 "pass_str" 作為加密鑰匙,例如:

    mysql> select encode("testing string", "mykey");
    + – - – - – - – - – - – - – - – - – +
    | encode(“testing string”, “mykey”) |
    + – - – - – - – - – - – - – - – - – +
    | �k��y����ۙ�( |
    + – - – - – - – - – - – - – - – - – +
    1 row in set (0.00 sec)

     
    DECODE(crypt_str,pass_str)
    decode() 的作用就是對 encode() 加密的內容解碼,其中 crypt_str 是經過 encode() 加密的二進字串,而 pass_str 就是解密鑰匙。如果使用的鑰匙與加密時的鑰匙不同,回傳的結果便不會正確,用法如下:

    mysql> select decode(encode("testing string", "mykey"), "mykey");
    + – - – - – - – - – - – - – - – - – - – - – - – - – - +
    | decode(encode(“testing string”, “mykey”), “mykey”) |
    + – - – - – - – - – - – - – - – - – - – - – - – - – - +
    | testing string |
    + – - – - – - – - – - – - – - – - – - – - – - – - – - +
    1 row in set (0.01 sec)

  • 限制 MySQL 只接受 localhost 連線

    Posted on August 30th, 2007 Sam Tang 1 comment

    在預設的情況下 MySQL 接受所有連線,這個不是指 MySQL 的權限設定,而是 MySQL 有監聽它所使用的埠號。例如用 netstat 檢查會得出這個結果:

    # netstat -an | grep 3306
    tcp4 0 0 *.3306 *.* LISTEN

     
    以下是在 FreeBSD 設定只接受 localhost 連線的方法:

    1. 開啟 /etc/rc.conf

    2. 加入 mysql_args:

    mysql_enable="YES"
    mysql_args="–bind-address=127.0.0.1"

     
    3. 重新啟動 mysql

    # /usr/local/etc/rc.d/mysql-server.sh restart

     

    現在可以再用 netstat 檢查一下,可以見到 MySQL 只監聽 127.0.0.1 的 3306 埠號:

    # netstat -an | grep 3306
    tcp4 0 0 127.0.0.1.3306 *.* LISTEN

  • PHP 讀取多重選項清單

    Posted on August 29th, 2007 Sam Tang No comments

    在製作 HTML 表單的清單時,可以用 multiple 屬性讓使用者透過 Ctrl 鍵一次過選擇多個選項,例如:

    HTML:
    1. <form method="post">
    2. <select name="box" multiple="multiple">
    3. <option value="1">1</option>
    4. <option value="2">2</option>
    5. <option value="3">3</option>
    6. </select>
    7. </form>

    但上面的 HTML 碼所傳送的 value 不能給 PHP 正確讀取,因為當同時選擇多個選項時,PHP 只可以讀取一個 value。要修正可以更改 select 的名稱,例如:

    HTML:
    1. <form method="post">
    2. <select name="box[]" multiple="multiple">
    3. <option value="1">1</option>
    4. <option value="2">2</option>
    5. <option value="3">3</option>
    6. </select>
    7. </form>

    當傳送給 PHP 後,使用者所選取的選擇會放到 $_POST['box'] 陣列內。


  • Freebsd 找出空密碼帳號

    Posted on August 28th, 2007 Sam Tang No comments

    有些系統用戶並沒有設定密碼,基於安全考慮,最好找出所有空密碼的帳號並暫時禁止登入。在 FreeBSD 可以透過 awk 在檔案 /etc/master.password 找出空密碼帳號,切換到 root 並輸入以下指令:

    # awk -F: 'NF > 1 &&amp; $1 !~ /^[#+-]/ && $2=="" {print $0}' /etc/master.passwd

     
    以上指令會用 awk 掃瞄 /etc/master.passwd,並以 : 作為分隔字串。並且找出 password 欄位 ($2) 空白的內容。如果系統內有空密碼帳號,便會用以下格式顯示:

    username::1099:1099::0:0:User &:/home/username:/bin/bash

    當發現有空密碼帳號後,可以用以下指令進行 lock 及 unlock 的動作:

    lock user
     
    # pw lock username

     
    unlock user
     
    # pw unlock username


  • PHP 檢查信用卡號碼

    Posted on August 26th, 2007 Sam Tang No comments

    現在網上購物越來越普及,所以對信用卡號碼的檢查也變得重要。要檢查信用卡號碼,一般可以用 LUHN 演算法來實現。現在大部份的主要信用卡也是使用 LUHN 演算法,包括 Visa, Master Card, American Express 及 Discover 等。LUHN 演算法只可以檢查信用卡號碼的合法性,而不會檢查信用卡其他資訊,包括是否過期。使用方法為:

    1. 檢查信用卡號碼是否 16 位。
    2. 將信用卡號碼切割成 16 個個別數字。
    3. 將上面切割得的所有數字,由左至右起計,每逄單數位置的數值乘 2。
    4. 將加總後所有結果都切割成個別數字再相加。
    5. 將上面求得的總數求出 10 的餘數,如果餘數是 0 便表示信用卡號碼正確,否則便是錯誤。

    以下是 PHP 使用 LUHN 演算法檢查信用卡號碼的函式:

    PHP:
    1. <?php
    2. /* luhn_checker(): This is a small PHP function for checking valid *
    3. * credit card with LUHN algorithm                                  *
    4. *                                                                  *
    5. * Last updated: 26 August 2007                                     *
    6. * This is a free PHP script under GNU GPL version 2.0 or above     *
    7. * Copyright (C) 2007 Sam Tang                                      *
    8. * Feedback/comment/suggestions : http://www.real-blog.com/        */
    9.  
    10. function luhn_checker($card_num){
    11.     // 將非數字的字串移除
    12.     $card_num = preg_replace("/\D|\s/", "", $card_num);
    13.  
    14.     $sum = 0;
    15.     for($i=0; $i<strlen($card_num); $i++){
    16.         $digit = substr($card_num, $i, 1);
    17.         if(($i % 2) == 0){
    18.             // 在單數位置的數值乘 2
    19.             $digit = $digit * 2;
    20.         }
    21.  
    22.         if ($digit> 9)  $digit = $digit - 9;
    23.         $sum += $digit;
    24.     }
    25.  
    26.     if(($sum % 10) == 0 && strlen($card_num) == 16){
    27.         return TRUE;
    28.     }else{
    29.         return FALSE;
    30.     }
    31. }
    32.  
    33. /* Example
    34. if(luhn_checker("1234567812345678")){
    35.     echo "Correct!";
    36. }else{
    37.     echo "Wrong card number!";
    38. }
    39. */
    40. ?>

    檔案下載: luhn_checker


  • PHP 列出目錄內容

    Posted on August 26th, 2007 Sam Tang No comments

    以下是用 PHP 列出目錄內容的方法,當然也可以略為修改以程式碼改為 function 使用:

    PHP:
    1. <?php
    2. // 定義要開啟的目錄
    3. $dir = "/var/www/vhosts/dir";
    4.  
    5. // 用 opendir() 開啟目錄,開啟失敗終止程式
    6. $handle = @opendir($dir) or die("Cannot open " . $dir);
    7.  
    8. echo "<b>Files in " . $dir . ":</b><br/>";
    9.  
    10. // 用 readdir 讀取檔案內容
    11. while($file = readdir($handle)){
    12.     // 將 "." 及 ".." 排除不顯示
    13.     if($file != "." && $file != ".."){
    14.         echo "$file<br/>";
    15.     }
    16. }
    17.  
    18. // 關閉目錄
    19. closedir($handle);
    20. ?>


  • 匯豐以股代息

    Posted on August 23rd, 2007 Sam Tang No comments

    買入匯豐後,第一次收到銀行寄來的以股代息意向書,我選擇了全數以股票方式收取股息。股息要在 10 月 4 日才收到,要等到收到股息後才知道換股價。說實在的,現在匯豐的市價真的十分抵買,PE 及 PB 均明顯偏低,以現價計算,明年的股息率最少有 5 厘。


  • 在 Linux 變更多個檔案副檔名

    Posted on August 22nd, 2007 Sam Tang 3 comments

    假如想變改當前目錄下所有檔案的副檔名,可以用一個 loop 完成:
     
    for old in *.php5; do mv $old `basename $old .php5`.php; done

     
    上面指令會在當前目錄裡面搜索所有 ".php5" 副檔名的檔案,然後逐一用 mv 變更為 ".php" 副檔名。


  • Python 連接 MySQL

    Posted on August 20th, 2007 Sam Tang 2 comments

    MySQL 是十分流行的開源資料庫系統,很多網站也是使用 MySQL 作為後台資料儲存,而 Python 要連接 MySQL 可以使用 MySQL 模組。MySQLdb 模組可以讓 Python 程式連線到 MySQL server, 執行 SQL 語句及擷取資料等。

    開始前要確定系統內的 Python 有安裝 MySQLdb 模式,你可以 Python command line interpreter 檢查,在指令模式輸入 python,然後便可以開始檢查:

    Python 2.5.1 (r251:54863, May 2 2007, 16:56:35)
    [GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import MySQLdb
    Traceback (most recent call last):
    File "", line 1, in
    ImportError: No module named MySQLdb
    >>> exit()

     
    如果見以上面的 "ImportError: No module named MySQLdb" 一句,便表示系統沒有安裝,到 MySQLdb 官方網站 下載 MySQLdb,並用以下方法安裝:

    $ tar zxvf MySQL-python-1.2.2.tar.gz
    $ cd MySQL-python-1.2.2
    $ python setup.py build
    $ python setup.py install

     
    安裝好 MySQLdb 後便可以編寫程式碼,以下是簡單的例子:

    CODE:
    1. #!/usr/bin/python
    2.  
    3. # 引入 MySQL 模組
    4. import MySQLdb
    5.  
    6. # 連接到 MySQL
    7. db = MySQLdb.connect(host="localhost", user="db_user", passwd="db_pass", db="db_name")
    8. cursor = db.cursor()
    9.  
    10. # 執行 SQL 語句
    11. cursor.execute("SELECT * FROM db_table")
    12. result = cursor.fetchall()
    13.  
    14. # 輸出結果
    15. for record in result:
    16.     print record[0]


  • PHP 透過 SMTP 發送郵件

    Posted on August 20th, 2007 Sam Tang 2 comments

    PHPMailer 是一個功能豐富的函式庫,以下是用 PHPMailer 通過遠端 SMTP 認證發送郵件的例子:

    PHP:
    1. <?php
    2. // 建立 PHPMailer 物件及設定 SMTP 登入資訊
    3. require("../phpMailer/class.phpmailer.php");
    4. $mail = new PHPMailer();
    5. $mail->IsSMTP(); // send via SMTP
    6. $mail->Host = "remote.smtp.server"; // SMTP servers
    7. $mail->SMTPAuth = true; // turn on SMTP authentication
    8. $mail->Username = "me@localhost"; // SMTP username
    9. $mail->Password = "123456"; // SMTP password
    10.  
    11. $mail->From = "myemail@localhost";
    12. $mail->FromName = "My Name";
    13.  
    14. // 執行 $mail->AddAddress() 加入收件者,可以多個收件者
    15. $mail->AddAddress("to@email.com","Josh Adams");
    16. $mail->AddAddress("to2@email.com"); // optional name
    17.  
    18. $mail->AddReplyTo("jyu@aemtechnology.com","AEM");
    19.  
    20. $mail->WordWrap = 50; // set word wrap
    21.  
    22. // 執行 $mail->AddAttachment() 加入附件,可以多個附件
    23. $mail->AddAttachment("path_to/file"); // attachment
    24. $mail->AddAttachment("path_to_file2", "INF");
    25.  
    26. // 電郵內容,以下為發送 HTML 格式的郵件
    27. $mail->IsHTML(true); // send as HTML
    28. $mail->Subject = "testing email";
    29. $mail->Body = "This is the <b>HTML body</b>";
    30. $mail->AltBody = "This is the text-only body";
    31.  
    32. if(!$mail->Send())
    33. {
    34.     echo "Message was not sent <p>";
    35.     echo "Mailer Error: " . $mail->ErrorInfo;
    36.     exit;
    37. }
    38.  
    39. echo "Message has been sent";
    40. ?>


  • 開發 PHP5 的多工應用

    Posted on August 18th, 2007 Sam Tang 1 comment

    一直我也以為 PHP 沒有支援像 Java 或 C++ 的 threading 的功能,所以不可以寫到 multi-task (多工) 的應用程式。例如當應用程式需要擷取其他網站的內容,應用程式會延遲執行,直至完成擷取遠端的資料為止。原來現在已經可以用 stream_select 及 stream_socket_client 實現 PHP multitasking。

    這篇在 developerWorks 的文章介紹了在 PHP 的 multitasking 及 threading:

    Develop multitasking applications with PHP V5

    昨天的股市真的如坐過山車,我只在收市看見點數跌二百多點,那時以為跌得不多,誰知原來曾跌過 1285 點。無論如何,自己也沒有在這次調整估貨,反而會看看星期一有沒有買貨的機會。我的兩隻千里馬招商銀行 (3968) 及平安保險 (2318) 公佈了中期業績,也交出了理想的成績單,對於有實質盈利支持的股份,在跌市時才也會較有信心。


  • 讓 crontab 自動排程執行 php

    Posted on August 9th, 2007 Sam Tang 1 comment

    要用 crontab 自動執行 php 程式,可以這樣做:

    方法一
    1. 在 php 程式的第一行加入:

    #!/usr/local/php/bin/php -q

    例如:

    PHP:
    1. #!/usr/local/php/bin/php -q
    2. <?php
    3. $foo = 123;
    4. ?>

    請留意,我的 php 是安裝在 /usr/local/php,請根據你的 php 執行檔位置作出修改。

    2. 將 php 程式給予可執行權限:

    chmod +x testing.php

    3. 執行 crontab -e,然後加入以下內容:

    00 00 * * * /path/to/testing.php > /dev/null 2>&2

    以上語法會在每天的零時零分執行 /path/to/testing.php

    方法二
    另一個方法是不用在 php 程式的第一行加入 "#!/usr/local/php/bin/php -q",可以省略第一步及第二步,直接執行 crontab -e,並輸入以下內容:

    00 00 * * * usr/local/php/bin/php -q /path/to/testing.php > /dev/null 2>&2

    這個方法的結果跟方法一的結果相同。


  • 開始了月供股票計劃

    Posted on August 5th, 2007 Sam Tang 2 comments

    比較過幾間銀行的月供股票計劃後,覺得中銀的計劃最適合自己,星期五登記了計劃,今個月十號開始扣數。

    股票選擇了 <2318> 平安保險及 <3968> 招商銀行。媽媽問為何股市升到這麼高點還要供款,這就是月供股票的優點。因為每月固定供款是使用了平均成本法,當股價下調時便買入較多股數;當股價上升便買入較少股數。這樣就無需在乎股價的短線波動,只要供款的股票長線上升就可以了,而且什麼時候開始也沒問題。

    個人認為收費十分便宜,每月收取供款額的 0.25%,或者最低 $50 的收費,當中已包括佣金、印花稅、交易徵費及交易處理費。而且供款十分靈活,可以隨時暫停供款及重新開始。這個費用已經比起很多基金的 5% 認購費 + 每年 1% 至 2.5% 的管理費便宜。

    現時自己的基金不會斷供,如果中途斷供會被徵收費用,只是往後自己想增加投資儲蓄時,會偏向月供股票的形式。因為我覺得如果連同交易費用一同計算,自己選股取得的回報率不會比基金低,且看看這決定是否正確。


  • 跌市沒什麼好怕

    Posted on August 1st, 2007 Sam Tang No comments

    今日恆指最多跌過 975 點,收市跌幅收窄為跌 729 點。可能有些人很怕股市下調,但我已經開始沒什麼感覺,因為自己沒有打算沽貨,所以早前股市創新高也只不過是 "紙上富貴"。而自己心目中的優質股裡面,除了匯豐外,其他也升到一個不合理的水平,如果可以調整一下,反而給予自己買入的機會。至於自己的理財目標,就是 40 歲達致財務自由,即靠股息/利息收入足夠支付自己的生活費。

    昨天減持手上的中石油,原因很簡單,股神巴菲特減持對我的心理影響頗大。正因如此,今天剛好有一點資金買貨,將原本沽出中石油的錢以 $63.2 增持了平保。