[ PHP ] oci8:Oracle に接続中か判定する ( get_resource_type )

Pocket

ここでは、PHP ( OCI8 ) から Oracle データベースに接続しているか判定するサンプルコードを掲載しています。なお、本サンプルは ZendFramework-1.11 のソースコードを一部変更して掲載しています。

ライブラリ等の実装はとても参考になりますので、どんどん良い部分は取り入れていくようにしたいものです。

スポンサーリンク

Oracle に接続中か判定する ( oci8 )

Oracle に接続中か判定するサンプルです。接続中か判定する以外にも拡張ライブラリがロードされているかの判定なども参考になります。

class Oracle_Adapter
{
    protected $_connection = null;

    // Oracle に接続する
    public function connect($persistent = false, $charset = 'AL32UTF8')
    {
        if (!extension_loaded('oci8')) {
            throw new Exception('OCI8 がロードされていません');
        }
        /*
         * すでに接続中の場合は何もしない
         */
        if($this->isConnected()) {
            return;
        }

        $funcName = ($persistent == true) ? 'oci_pconnect' : 'oci_connect';

        // 一部手抜き(本来はパラメータで設定する)
        $this->_connection = @$funcName(
                                  'ユーザー名',
                                  'パスワード',
                                  'DB名',
                                  $charset);

        // 接続に成功したか確認する
        if (!$this->_connection) {
            $error = oci_error();
            $message = $error['code'] . ' ' . $error['message']
            throw new Exception($message);
        }
    }

    /*
     * DBに接続中か確認する
     */
    public function isConnected()
    {
        return ((bool) (is_resource($this->_connection)
                    && (get_resource_type($this->_connection) == 'oci8 connection'
                     || get_resource_type($this->_connection) == 'oci8 persistent connection')));
    }
    
    /*
     * 接続している場合はDB切断
     */
    public function close()
    {
        if ($this->isConnected()) {
            oci_close($this->_connection);
        }
        $this->_connection = null;
    }
}

接続関数の戻り値がリソース型であるかと、リソースタイプの文字列を確認して、現在 Oracle へ接続中であるかを判定しています。また、一般的かどうかはわかりませんが、データベースへの接続時に extension_loaded 関数によって拡張ライブラリがロードされているも確認しています。開発環境が一旦構築されてしまうと拡張ライブラリロードエラーは出ませんので、必要ないと思われれば外しても良いかもしれません。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *