Month: June 2011

MySQL 字串連接 concat

Posted by – June 30, 2011

在 MySQL 資料庫中想產生一組獨一無二的 key,這樣可以做為比對的依據。打算直接在資料庫上操作新增欄位,至於 key 的產生是很直覺地想用 md5() 這個 function 來處理。但是因為要拿什麼資料來雜湊呢? 想說就用其他欄位加一加,再加上時間來湊。很直覺地寫下這樣的 query

SELECT md5( id + name + now() )

可惜這樣的結果會因為 id 是 int,而且 name 是 string 而產生非預期的結果。解決方法是把所有的欄位轉成 string 來處理,這時候需要 concat() 來組合字串。

SELECT md5( concat( id, name, now() ) )

這樣就可以得到正確的 md5 值了。

deaf03c84d18a56b70e0b7d6438ada3e

PHP mail function 如何避免亂碼?

Posted by – June 16, 2011

又是一個工作上碰到的問題,需要寫一個簡單的 email 發送功能。雖然是基本功能,不過常見的作法還是藉由 PHPMailer Library 來達成。不過這個案子因為寄信頻率很低,想說用 PHP 內建的 mail() 就可以處理了。但是人算不如天算,怎知 mail() 成功了,但是卻是一堆亂碼,標題、寄件人欄位都是亂碼..... 囧

經過一番 Google Search 的奮戰,找到一個很 tricky 的解決方法。將會出現亂碼的文字用以下方式處理....

"=?UTF-8?B?".base64_encode(" 會出現亂碼的文字 ")."?="

這樣用 GMAIL 收到信的時候就可以看到正常的文字了。

mail function 範例如下...

function sendMail($recipient){
    $subject = "=?UTF-8?B?".base64_encode("信件標題")."?=";
    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=UTF-8\r\n";
    $headers .= "From: "."=?UTF-8?B?".base64_encode("寄件人 ")."?=";
    $headers .= "<sender@email.com>";
    $message  = '<p><font size="3" face="新細明體">信件內文</font></p> ';

    return mail($recipient, $subject, $message, $headers);
}

順便補充一下,為了送出 html 格式的郵件,必須在 header 中指定 Content-type: text/html 才行。

PHP 有 mb_encode_mimeheader 來為雙位元文字編碼,不過以此方式編碼的信件在 Gmail 中仍顯示亂碼,所以只好用比較 tricky 的方法來處理了。

[Excel] Convert Date and UNIX time

Posted by – June 2, 2011

這個問題是最近工作上碰到的,把 SQL 裡的 time 欄位輸出,整理成 Excel 給 PM,不過報表裡的時間都是 UNIX time 格式,除非有超強的心算,不然一般人是沒辦法直接看著 UNIX time 換成算時間日期的。

UNIX time 是以 1970 年 1 月 1 日零點 (UTC) 為起點,每過一秒加 1 的時間計算方式,更詳細的介紹請參考維基百科。根據這個公式,本文撰文時刻是 1306971424

Excel 內部的時間計算方式和 UNIX time 有異曲同工之妙,不過起點是 1900 年 1 月 1 日,日期是整數,時間是小數,詳情請參考這篇如何在 Excel 中使用日期與時間。翻遍 Excel 2010 的 Help 也找不到和 UNIX 或 POSIX 相關的 function,看來只能土法轉換了。

轉換公式 =Unixtime / 86400 + 25569

More

[Guide] XName.org DNS settings

Posted by – June 2, 2011

很久以前寫過一篇[Guide] Google App 服務設定教學,沒有想到這篇教學後來的詢問度超級高,到現在還常有人留言詢問相關的問題。

文中是用 EveryDNS.net 完成 DNS 設定的,因為 xname.org 一直沒弄成功,不過隨著 EveryDNS 被收購了,還是趕緊研究 xname 如何設定。其實仔細看完說明後,發現設定跟 EveryDNS 其實沒兩樣,唯一的差別是這句話....

You have to use the full qualified name of the computer, with the trailing dot at the end.
ex: mail.500cc.tw

之前一直沒設成功居然是因為沒注意到這行而自爆。最後在網址結尾多打一個點就收工結束了,就醬。下面是範例圖,請參考,我沒有設定 MX record。