2007/09/18

資料庫比對程式 - diffdb.php

別人寫的總是用不順手,還是自己寫的比較好用。

這程式的目的很簡單,比對兩個資料庫裡的所有資料表,把兩邊不一樣的地方 highlight 出來,可以一目了然地知道那邊不一樣。

使用情境:
一、撰寫程式時常會調整測試資料庫上的資料結構,在程式上線前一定要同步調整上線資料庫的結果,否則程式一上線,系統馬上就會出錯。
二、將程式模組移植到另一個系統時,要先確認兩邊的資料結構是否有差異,如果該有的欄位沒有、或欄位屬性不一致,那麼程式移植過去後一樣會出問題。

Demo: http://weblog.gilbert.tw/public/scripts/diffdb/
Download: http://weblog.gilbert.tw/public/scripts/diffdb/diffdb.zip
這程式是在 FreeBSD 4.11 + PHP 4.4.4 + MySQL 4.0.18 環境下開發測試,有興趣的人請自行下載、修改,不用客氣。

2007/09/12

Firefox 多了個 menuitem 字樣

Firefox 下方出現 menuitem 字樣
今天冒出來的怪問題。

參考網友的說明(Google://Firefox menuitem),原來問題出在 Java RE 上。
檢查之後發現我裝了兩個 Java RE,一個 1.5.0,一個 1.6.0。
把 1.5 那版 uninstall 之後,Firefox 就恢復正常了。

2007/09/09

PHP 的 include_path 設定

依據官網的說明:
http://tw.php.net/manual/en/ini.core.php#ini.include-path
include_path 這個設定會決定 require、include、fopen、file、readfile、file_get_contents 這些函式的搜尋檔案時的路徑順序。
設定時各路徑的分隔符號與作業系統的環境變數 PATH 一樣:在 UNIX 下是用冒號( : ),在 Windows 下是用分號( ; )。
引入檔案時,越左邊的路徑越先被搜尋,一旦搜尋到就會停止搜尋,不會繼續往右側的路徑找。

要調整 include_path 設定,可以利用以下方式設定:在
1. 直接修改 php.ini。
2. 修改 Apache 設定檔 httpd.conf 或 .htaccess 檔。
3. 利用 PHP 函式 ini_set() 或 set_include_path()。

補充說明:
1. 路徑名稱中的句點( . ),表示程式執行時的目錄。
2. PHP 執行期間,可以利用 get_include_path() 函式得知目前的 include_path 設定。

2007/09/05

FreeBSD 6.2 之前版本利用 ports 裝套件時的錯誤訊息

在 FreeBSD 4.11 上裝套件時出現以下錯誤訊息:

On FreeBSD before 6.2 ports system unfortunately can not set default X11BASE by itself so please help it a bit by setting X11BASE=${LOCALBASE} in make.conf.
On the other hand, if you do wish to use non-default X11BASE, please set variable USE_NONDEFAULT_X11BASE.
*** Error code 1

Stop.

解決方法就是照著英文的說明做,在 make.conf 檔裡加上這麼一行

X11BASE=${LOCALBASE}

就可以了!
(make.conf 一般是放在 /etc 下,找不到就用 locate 或 find 找)

2007/09/04

PHP 消失的 ?>

一般 PHP 程式都是以 <?php 開頭,以 ?> 結束。可是不時會發現一些套件裡的 php 檔,沒有用 ?> 結束,感覺好像是漏掉了一樣。
直到最近才瞭解這是怎麼一回事,原來消失的 ?> 是有含意在裡頭的。

寫程式時難免會 include 或 require 其他檔案,對於 php 來說,如果引入的檔案最後有多餘的空白或換行,有時候就會出問題。
舉例來說,假設有兩個程式 inc.php 與 endofphpfile.php,程式內容如下:

// inc.php
$filename = 'php.jpg';
?>

// endofphpfile.php
require_once "inc.php";
$size = getimagesize($filename);
$fp = f o p e n($filename, "rb");
if ($size && $fp) {
h e a d e r ("Content-type: {$size['mime']}");
f p a s s t h ru ($fp);
exit;
}
?>
開啟 endofphpfile.php 可以看到 PHP 的 icon(範例一)。

但如果 inc.php 的文末多了一個換行,就像下圖這樣:
20070903_endofphpfile_1rn
這樣也還是可以看到圖檔(範例二)。

可是如果換成是多了兩個換行:
20070903_endofphpfile_2rn
這下就看不到圖檔了(範例三)。

可是如果換成是有三個換行:
20070903_endofphpfile_3rn
一樣看不到圖檔(範例四)。

因此如果把 ?>拿掉呢?
20070903_endofphpfile_0
就能看到原本的圖檔了(範例五)!

其他在下載檔案或直接丟 content 出去的狀況,都會遇到類似的狀況(瀏覽器會先收到額外的換行)。
因此,為了避免引入檔案時衍生的不必要的麻煩,就把 php 檔最後的 ?> 拿掉,避免送出額外的空白或換行。

2007/09/03

PHP 的 session 有效時間

session 的有效時間由 php.ini 裡的 session.gc_maxlifetime 決定,預設值時 1440 秒。
一般網站就用預設值就可以了,但是企業內部系統就可以設定長一點,免得離開位置喝個咖啡回來,session 就被清掉了。

如果只要針對特定 VirtualHost 設定,可以在 VirtualHost 裡設定

php_admin_value session.gc_maxlifetime 3600

ionCube PHP Encode 6.5.13

2007.08.01. 釋出 6.5.13 版,這次修正中比較令我注意的是這點:

* The newline at the end of ASCII encoded files is no
longer present.
This keeps a particular forum plugin manager happy
that incorrectly considered a newline at the end of
encoded files to be a problem.

之前加密的 PHP 在產生圖檔時總是會發生錯誤,就是因為上面這個問題導致圖檔送出前多送出了一個換行,因此圖檔無法正常顯示。
另外用 PHP 送出文字檔時,最前面也會多出一個空行來。
等了近半年,總算是修正這個問題了。