[PHP-users 10503] Re: DBクラスのODBC の意味合いについて

Suguru Matsushita php-users@php.gr.jp
Thu, 03 Oct 2002 15:38:48 +0900


松下@世田谷です。


ぬまじりさん、貴重な助言をありがとうございました。無事に解決しました。

メールを頂いてから、ひたすら
	・DB.php
	・DB/odbc.php
の内容を眺め、変数の変化を追っかけ、分岐チェックを追っかけしているうちに
「odbc.php」のバグらしき部分を発見しました。

-----odbc.php-----
	$conn = @$connect_function ( $dbhost, $user, $pw ) ;
-----

という部分があるのですが、
# ごめんなさい、あろうことかオリジナルに直接手を加えたので、正確な行数は
# 不明です。今のバージョンでは直ってるかも知れません。・・・ああ・・・。

-----
	$conn = @$connect_function ( $dbhost, $user, $pw ) ;
-----・・・ではなく、
↓
-----
	$conn = @$connect_function ( $database, $user, $pw ) ;
-----
が正しいのでした。

しかも、$database 変数を準備していないようですので、
-----
	$database =  $dsninfo['database'] ;
-----
としてあげなくてはなりません。

つまり修正点としては、
----- odbc.php -----
        if ($this->provides('pconnect')) {
            $connect_function = $persistent ? 'odbc_pconnect' : 'odbc_connect';
        } else {
            $connect_function = 'odbc_connect';
        }
        $conn = @$connect_function($dbhost, $user, $pw);
        $conn = @$connect_function( $dbhost, $user, $pw );
        if (!is_resource($conn)) {
            return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null,
                                         null, $this->errorNative());
        }

----- ↓このように変えます -----

        if ($this->provides('pconnect')) {
            $connect_function = $persistent ? 'odbc_pconnect' : 'odbc_connect';
        } else {
            $connect_function = 'odbc_connect';
        }
        $database = $dsninfo['database'] ;
        $conn = @$connect_function($database, $user, $pw);
        if (!is_resource($conn)) {
            return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null,
                                         null, $this->errorNative());
        }
-----
これでちゃんと接続されるようになりました。・・・ひどいよお。

# トレースの途中でエラーメッセージが
#	「接続に失敗しました」
# から
#	「そのようなデータベースはありません」
# と、エラーメッセージもまっとうになっていったのはなぜでしょうか?(^^;

絶対に DB2 が動くはずだと確信させていただいたのは、ぬまじりさんの適切な
助言のお陰です。本当にありがとうございました。

これで少しでも DB クラスで ODBC を利用する方々のお役に立てればと思います。


> ODBC関数を使い慣れているなら、DB.phpにあるDBクラスのconnect()辺りから
> 追っていけば原因が分かるのではないかと。

本当に助かりました。

なぜか、元のソースは間違っている上に
-----
        $conn = @$connect_function($dbhost, $user, $pw);
        $conn = @$connect_function( $dbhost, $user, $pw );
-----
と微妙に違う二行が重複していたりします。
作っている途中で夕飯にでも呼ばれたんでしょうか? (^^;

結論として「DB クラスの ODBC は、関数の ODBC で動くなら利用可能です。」

ご厚意にお応えして、きっちりと結論を出した上での返事を出したかったため、
少し返事が遅れてしまったこと、お詫びいたします。

-- 
<staff_matsushita@ewoman.co.jp>