2006/12/26

幾個資料庫連線的參考資料

對啦,我是在重新造輪子沒錯,目前正在寫一個類似adodb的東西,開發平台是XP SP2+Apache 2.2+PHP 5.2。
目前只先處理連線的部份,其他的慢慢搞。
有些該紀錄的東西先記下來,這裡有一份資料庫預設的帳號密碼。
目前我裝過的一些資料庫的問題:
  • DB++:網站上找不到可下載的連結。
  • FrontBase:授權要填的表單太麻煩,我頭一次看到要求要填MAC的
  • Informix、Ingres:安裝過程失敗
  • MaxDB:只支援到 PHP 5.1.2
  • mSQL:網站上只提供Source,沒有預編好的Binary可下載。
  • Ovrimos SQL Server:網站掛了,無法下載
  • Sybase:他有很多產品線,我是拿SQL Anywhere 10 來看,只支援到 PHP 5.1.2;而ASE Express只提供Linux版可下載,沒有Windows版的,另外 PHP 內的 php_sybase_ct.dll 我沒辦法把他載入,聽說是缺少Runtime Libs

目前在php的函數中,有關資料庫(我個人的定義是可以吃SQL命令的)的介面函數大概分成四種:
  • 原生函數:DB++, Firebird, FrontBase, DB2, Informix, Ingres, MaxDB, Microsoft SQL Server, mSql, MySQL, Oracle,  Ovrimos SQL Server,  PostgreSQL, SQLite, Sybase
  • dbx:MySQL, ODBC, PostgreSQL, Microsoft SQL Server, FrontBase, Oracle, Sybase, SQLite
  • pdo:Firebird, Infomix, Microsoft SQL Server, MySQL, Oracle, ODBC, PostgreSQL, SQLite
  • odbc
目前我寫的這個確定會支援的:Firebird, DB2, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, SQLite,而MaxDB及SQL Anywhere等有支援PHP 5.2的extension後也會考慮加入支援,另外有空的話也會支援dbx、pdo、odbc,不過要慢慢弄。

2006/12/25

MS SQL Server 連線的作法

我是使用 SQL Server 2005 Express Edition 來作測試,有些地方要手動改。
  1. 下載 http://webzila.com/dll/1/ntwdblib.zip
  2. 解開得到 ntwdblib.dll ,把這個檔複製到 php 的安裝目錄,替換掉 php 內建的。

連線的範例:
mssql_connect ('(local)\SQLEXPRESS', 'sa', 'password');

或者用SQL Server組態管理員,把TCP/IP協定打開,重新啟動SQL Server後,也可以這樣:
mssql_connect ('127.0.0.1', 'sa', 'password');

phpPgAdmin的設定

今天把PgSQL 8.2裝到我的工作電腦(XP)裡面,順便裝上phpPgAdmin這個管理介面。
這個Web式的管理介面有點像是phpMyAdmin跟pgAdmin III的混合體,他完整的呈現了PgSQL比較複雜的一面。

要修改的是phpPgAdmin/conf/config.inc.php這個檔
找到
$conf['extra_login_security'] = true;
改成
$conf['extra_login_security'] = false;

這樣子就可以用在安裝時設定的帳號密碼來連線了。

2006/12/24

暴風影音與MPC

玩過不少Codec Pack,不過我個人目前還是比較喜歡暴風影音以及K-Lite Mega Pack這兩套。
由於目前並沒有轉檔或是製作影音檔的打算,純播放的話,暴風影音就夠了。
而暴風影音還附了一個調整程式,玩爛了很容易調整回來。

不過目前遇到一個奇怪的例子,在播放某個RM檔時會有問題,MPC直接就結束了,而KMPlayer可以很順利的播放。
後來我調整了MPC裡的設定:
View->Options->Player->Formats->File extensions->Real Media files
把他後面的Handle由DirectShow改成RealMedia就可以播放了。

另外,有時候在播放時會出現整片色塊暈開的現象,在我目前這台AP1000的機器上,只要在BIOS裡面把VGA的Share Memory開大一點就行了。(我這台上面可設定的範圍是16M~128M,我把他開到128M問題就解決了)

2006/12/23

再戰nLite

話說上禮拜寫程式時,本來要裝pgSQL來測試的,沒想到上次我用nLite刪的過火了,缺少某個Service沒辦法裝。
還好手邊有未改過的光碟,這次的重點就在「不刪」的前提下製作新的安裝光碟,順便打上Hotfix。
目前我在網路上找到已經有人整理好的Hotfix Pack有三個,詳細的比較請看這裡:
XP Update Packs - Purposes and Differences Explained!


我個人選擇的是:Boooggy's pack
理由是比較完整一些。

這些Hotfix Pack每個月都會更新一次,所以要作光碟時再去下在就行了。
裝完後再把IE7、WMP11、.NET3以及驅動程式裝一裝再設定一下就差不多了。
打了補丁後的好處是有一些修正檔例如:多核的補丁,就不用再更新了~

2006/12/13

PHP 類別內變數的修飾詞

太久沒寫程式了,對於 public, protected, private 這三個修飾詞的範圍有些忘了,除錯了一個下午。
存取範圍可以看下表:
 外部子類別
public
protected
private

2006/12/12

XCache 1.2 Release

其實這東西在2006.12.10就放出來了,不過當時我沒仔細看,直到昨天我才發現。
最近XCache的腳步很快,比EA快很多,尤其是他的Source和Binary是同步放出來的,未來我應該會追XCache來更新。
這一版的特色是對於PHP 5.2作完全的支援,也和suhosin/ZendOptimizer相容。
由於FreeBSD會把suhosin編進去,所以這方面的相容性也蠻有用的。

PHP System Information 介紹

今天在網路上逛街的時候看到的:phpsysinfo
這是一個可以看(監控)系統資源的 PHP 程式,目前我只在 Windows 下試過,可以很順利的跑出來,不過花的時間有點長,大約是5~6秒左右。

2006/12/06

SimpleTest 初探

SImpleTest是一套用來作PHP程式測試的架構,雖然我很早就知道這東西,不過一直沒有用它。
最近開始在做自己用的程式庫,所以就用它來作自動測試。

架構上我希望測試用的程式碼跟程式庫本身分開,所以目錄我是這麼安排的:

├─[lib]
├─test
  ├─simpletest
  └─case

[lib]:程式庫目錄
test:測試用目錄
simpletest:SimpleTest的程式碼
case:測試程式集

在 test 底下有一個 index.php ,用來引入 case 底下所有的 .php 測試用的程式碼,
這裡假設[lib]的名稱叫做losttech,你可以根據你自己設定的目錄名稱更改,修改 define 那一行就對了。
index.php 內容如下:

<?php
mb_internal_encoding('UTF-8');
$目錄 = dirname(__FILE__);
define ('引用', $目錄 . '/../losttech/');
require_once $目錄 . '/simpletest/unit_tester.php';
require_once $目錄 . '/simpletest/collector.php';
require_once $目錄 . '/simpletest/reporter.php';

主程式();

function 主程式(){
    global $目錄;
    $測試 = &new GroupTest('測試報告');
    $測試->collect($目錄 . '/case/', new SimplePatternCollector());
    $測試->run(new HtmlReporter('UTF-8'));
    unset($測試);
}
?>

這裡有一個範例,我寫了一個函式叫做「字元陣列」,用途是把一個一串拆成一個一個的字元陣列。
我把它放到 losttech/string.php ,內容如下:

<?php
function 字元陣列($字串, $長度 = 1) {
    $輸出 = array();
    if ($長度 < 1) {
        return $輸出;
    }
    for ($索引 = 0; $索引 < mb_strlen($字串); $索引 += $長度) {
        $輸出[] = mb_substr($字串, $索引, $長度);
    }
    return $輸出;
}
?>

測試用的程式碼,我把它放到 test/case/string.php,這裡我故意讓它的檔名跟要引用的檔名相同。
內容如下:

<?php
require_once 引用 . 'class/' . basename(__FILE__);

class 測試:字元陣列 extends UnitTestCase {
    function testCreation(){
        $測試陣列 = array(
            '' => array(),
            '1' => array('1'),
            '一' => array('一'),
            '123' => array('1','2','3'),
            '一二三' => array('一','二','三'),
        );
        foreach($測試陣列 as $測試 => $結果) {
            $this->assertEqual($結果, 字元陣列($測試), "測試:$測試");
        }
    }
}
?>

測試結果:

測試報告

1/1 test cases complete: 5 passes, 0 fail

這裡有個重點,就是把要測試的程式碼放到以 test 開頭的成員函數(例如:testEmail, testLogin等等,總之必須是 test 開頭)裡面來,這樣才會進行自動測試。

2006/12/03

FTP 的 UTF8 問題

剛剛在我的機器上做了一些測試:
Server端
  • OS:FreeBSD
  • FileSystem:ufs2
  • FTP Server:ProFTPD / vsFTPd
Client端
  • OS:Windows XP
  • FileSystem:NTFS
  • FTP Client:FileZilla
如果要把含有中文檔名的資料上傳,那麼就必須在FileZilla中把
「Use UTF8 on server if available」這項設定設成「Force」
上述這項設定可以在 Site Manager 中的 Advenced... 找到。

另外一提的是,即便是我在NTFS下用 php 作檔案操作,中文檔名還是無法輕易的處理掉,必須要轉碼,所以我考慮不去處理中文檔名的問題。
會下這個決策的因素是,我看到PHP6似乎有誠意來處理這個問題,而且這個問題不處理也不會天崩地裂。

2006/12/01

安裝 Gentoo

最近開始在摸Gentoo這東西。
之前我一直是用FreeBSD,原因就是他的port系統,可以讓我偷懶。
不過最近我發現FreeBSD在make的時候會自動記憶make的參數,這讓我很感冒,所以趁著整理電腦的時候,拿一台機器來裝Gentoo玩玩看!

不過可惜的是,我對FreeBSD中毒太深,所以上手困難~
再加上Gentoo作一個系統太花時間,所以我玩了半天就放棄了。

可喜的事情是,上面提到的自動記憶,我可以先把 /var/db/ports 底下的檔案砍光,再用 portupgrade 來維護,所以算是解決一半的問題。

2006/11/20

安裝IE7跟WMP11的重點

當然啦,你知道的,微軟在這兩個安裝檔上都加入了驗證程序,一定得驗證過才給裝。
為了這個驗證程序(好像是叫WGA),這幾天在想方設法要繞過去,剛剛問了朋友,得到幾個重點:
  1. 序號要沒被微軟鎖住(可用KeyFinder之類的程式改序號)
  2. 刪除WGA(裝上Unlocker手動刪,或是用RemoveWGA這隻程式刪)
  3. 要Reboot
剛剛已經試驗成功,裝上WMP11了。
別問我序號或是那些程式去哪找,我可不想被人找麻煩~
話說下個月就要去上班了,上班後應該會去繳一下微軟稅,省的被人檢舉。
你知道的,最近爆料文化盛行...

2006/11/18

Drupal 4.7.X 在 PHP 5.2 下的一個修正

這個修正主要是解決登入後無法取得權限的問題。

修改檔案: includes/session.inc

尋找:

function sess_read($key) {
  global $user;

  // retrieve data for a $user object

修改:

function sess_read($key) {
  global $user;

  register_shutdown_function('session_write_close');
  // retrieve data for a $user object

2006/11/16

我所使用的程式編輯器

基本上有兩個,一個是PSPad,另一個是EmEditor。
我最早是用EmEditor來寫程式,這也是我預設的文字編輯器,原因無他,就是因為對於各種編碼的支援。
而PSPad,則是我最近愛用的,主要原因有兩個:
  • UTF8 w/o BOM的支援。
  • Code Explorer的方便。

當然啦,如果有自動的Code Hint那就更好了!
不過最近看PSPad的論壇,這幾天有些使用者在給作者建議一些Bug Tracker的系統,不過作者似乎興趣缺缺~

這裡的第一篇

其實是這樣的,我常發表的東西有許多是程式碼,所以要找個比較容易操作的部落格不太容易。
今天又多了一項比較基準,就是不會強制設定字型的,這邊可以自己改CSS。
字型的議題是因為我看了這篇:
將網頁的字型換成「微軟正黑體」
然後把IE跟FF都改過來了,結果發現有些網站還是醜醜的,當然包括我之前在 Live.com 上面的部落格~

目前用的佈景主題是redBird2再加上自行修改的CSS,用這個主題是因為:
  • 蠻乾淨的,而且是兩欄式的配置。
  • 最上方的Banner不會太高。
  • 對於Firefox的支援。

2006/11/11

字串解析物件

這是我參考 PEAR:DB 裡面的 prepare 部份寫出來的一個字串解析與取代的物件。
它可以載入一張函數表,根據這張函數表來對字串中的一些字元作轉換的動作,有點類似 sprintf 函數,不過每個字元的轉換可以自訂(這也就是函數表的功用)

class 字串解析 {
    private $快取 = array();
    private $解析表 = array();
    private $例外字元 = '';
    function 載入(&$解析表 = array(), $例外字元 = '', $取代 = true) {
        if (mb_strlen($例外字元) < 2) {
            $this->例外字元 = $例外字元;
        }
        if ($取代) {
            $this->解析表 = array();
        }
        foreach ($解析表 as $字元 => $函數) {
            if (mb_strlen($字元) == 1 && is_callable($函數)) {
                $this->解析表[$字元] = $函數;
            }
        }
        unset($this->解析表[$this->例外字元]);
        $this->快取 = array();
    }

    function &解析($樣板, $快取 = true) {
        $堆疊 = array();
        $輸出 = array();
        $前字 = '  ';
        $長度 = mb_strlen($樣板);
        for ($索引 = 0; $索引 < $長度; $索引++) {
            $字元 = mb_substr($樣板, $索引, 1);
            if (array_key_exists($字元, $this->解析表)) {
                if ($前字 == $this->例外字元) {
                    array_pop($堆疊);
                    $堆疊[] = $字元;
                } else {
                    $輸出[] = implode('', $堆疊);
                    $輸出[] = $字元;
                    $堆疊 = array();
                }
            } else {
                $堆疊[] = $字元;
            }
            $前字 = $字元;
        }
        $輸出[] = implode('', $堆疊);
        if ($快取) {
            $this->快取[] = &$輸出;
            end($this->快取);
            $索引 = key($this->快取);
            return $索引;
        } else {
            return $輸出;
        }
    }

    function 代換($樣板, &$參數 = array()){
        $堆疊 = array();
        if (isset($this->快取[$樣板])) {
            $解析 = &$this->快取[$樣板];
        } else {
               $解析 = $this->解析($樣板, false);
        }
        $索引 = 0;
        foreach ($解析 as $字串) {
            if (array_key_exists($字串, $this->解析表) && isset($參數[$索引])) {
                $堆疊[] = call_user_func($this->解析表[$字串], $參數[$索引]);
                $索引++;
            } else {
                $堆疊[] = $字串;
            }
        }
        return implode('', $堆疊);
    }
}

2006/06/13

滑鼠移過圖形做兩張圖切換的方法

要做到這件事情,需要前後端程式互相配合。

前端程式(JavaScript):

<script>
function 切換圖形(編號, 顯示, 隱藏) {
    顯示 = document.getElementById(編號 + "_" + 顯示).style;
    隱藏 = document.getElementById(編號 + "_" + 隱藏).style;
    if ("none" != 隱藏.display) {
        隱藏.display = "none";
    }
    if ("inline" != 顯示.display) {
        顯示.display = "inline";
    }
    return;
}
</script>

後端程式(PHP):

function &顯示導覽($絕對路徑, $絕對網址, $編號, $主圖檔, $副圖檔 = '') {
    if (false == file_exists(路徑修正("$絕對路徑/$主圖檔", false, true))) {
        return '';
    } else if ('' == $副圖檔 || false == file_exists(路徑修正("$絕對路徑/$副圖檔", false, true))){
        return '<img border="0" src="' . 路徑修正("$絕對網址/$主圖檔") .'" />';
    } else {
        $主圖檔 = '<img border="0" style="display:inline;" id="' . $編號 . '_0" onmouseover="切換圖形(' . "$編號, 1, 0);" . '" src="' . 路徑修正("$絕對網址/$主圖檔") .'" />';
        $副圖檔 = '<img border="0" style="display:none;" id="' . $編號 . '_1" onmouseout="切換圖形(' . "$編號, 0, 1);" . '" src="' . 路徑修正("$絕對網址/$副圖檔") .'" />';
        return $主圖檔 . $副圖檔;
    }
}