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

Suguru Matsushita php-users@php.gr.jp
Wed, 02 Oct 2002 19:53:48 +0900


こんにちは。松下@世田谷と申します。


はじめて相談させていただきます。初心者の質問で恐縮なのですが、

	・PEAR の DB クラスを使って DB2 との接続は可能なのでしょうか?

現在の状況として、

	・PHP4.2.2 は正しくインストールできている
	・PEAR のインストールはしていない (DB クラスはコアパートなので)
	・DB2 V7.2 のサーバ側とクライアント側の接続も正常にできている
	・ODBC 関数を利用して SQL の投入と結果の取得はできている
	・インストールは全てソースから行っている (RPM は使っていない)

という状況です。つまり、

	”PHP4 を利用して遠隔サーバの DB2 にはアクセスできています。”

このまま、ODBC 関数を使ってスクリプトを組めば話は簡単なのですが、今後の
ことを考えて、なるべくデータベースの種類に依存しない形で開発をしたいので
PEAR の DB クラスを使いたいのですが、うまくいっていません。

現在、以下のサンプルスクリプトを書いて検証しています。

<?php
	require_once ( 'DB.php' ) ;
	$member = $_GET['member'] ; # サンプルなので $_GET を使ってます
	$dsn = "odbc://hogeuser:hogepass@localhost/hogedb" ;
	$db = DB::connect ( $dsn ) ;
	if (DB::isError($db)) {
		die ( $db -> getMessage () ) ;
	}
	$sql = "select name_first from member where user_id = '$member'" ;
	print "$sql<br>\n" ;
	$res = $db -> query ( $sql ) ;
	while ( $row = $res -> fetchRow ( DB_FETCHMODE_ASSOC ) ) {
		echo $row['name'] ;
	}
	echo $member . "<br>\n" ;
?>

この結果、スクリプトに挿入しておいたエラークラスによって、

	"DB Error: connect failed"

というエラーが出力されてしまいます。これは、書式のエラーなのか、それとも
そもそも、仕様上接続できないものを接続しようとしているのか、判断できずに
おります。

# ちなみに、エラークラスを挿入しないと
#	「"query ()" なんて定義されてないよ」
#	[Fatal error: Call to undefined function: query() in ... ]
# と怒られます。

この迷いの根拠として、

http://www-6.ibm.com/jp/software/data/developer/library/techdoc/php4db2install.html

の文中の、

------------------------------------------------------------------------
PHPからDB2を呼び出す時、Unified ODBCという名の関数群(odbc_connect等)を
使用して、アクセスする事が出来ます。また、PHP内では、ODBCライブラリの一
覧内にDB2が登録されていますが、これはPHPがDB2にアクセスする際にODBCを使
用するという意味ではありません。PHPには、各社DB毎に違うアクセス関数が用
意されています(たとえば、ORACLEとINTERBASEのアクセス用関数は別々に用意
されている)が、比較的後期にサポートされたDBの多くはUnified ODBCという
ODBCにAPI仕様を似せて作られた関数群を用いてアクセスする様に作成されてい
るようで、DB2にアクセスする場合もこれに従っています。
------------------------------------------------------------------------

つまり、この文章から、

	・PHP4 での「ODBC」関数は ODBC そのものを表しているわけではない
	・共通性の高い SQL 仕様を持つデータベースを ODBC とまとめただけ

と考えました。すると、疑問として、

	・DB クラスにおける ODBC の扱いは・・・
		- いわゆる本当に ODBC を介した SQL を処理するのか?
		- それとも共有した関数として DB2 も処理できるのか?

という壁に突き当たったというわけです。いくらか文献を当たってみましたが、
該当する内容を発見できませんでしたので相談させていただきます。


なお、以下のように ODBC 関数を使うと正常に結果を取得・表示できます。

<?php

$dbname = "hogedb" ;
$username = "hogeuser" ;
$userpass = "hogepass" ;
$db = odbc_connect ( $dbname , $username , $userpass ) ;

if ( $db ) {

	$sql = "select name_first from member" ;

	$result = odbc_exec ( $db , $sql ) ;
	$rows = odbc_num_rows ( $result ) ;
	$columns = odbc_num_fields ( $result ) ;
	echo "rows=$rows,columns=$columns<br>\n";

	print "<table border>\n";
	$i = 0;
	print "<tr>";
	for ( $i=1 ; $i<=$columns ; $i++ ) {
		$field_name = odbc_field_name ( $result , $i ) ;
		print "<th>$field_name</th>";
	}
	print "</tr>" ;

	while ( odbc_fetch_into ( $result , &$array ) ) {
		print "<tr>" ;
		for ( $i=0 ; $i<$columns ; $i++ ) {
		print "<td>$array[$i]</td>" ;
	}
	print "</tr>\n" ;
}
print "</table>\n";
$ret=odbc_free_result($result);
$ret=odbc_close($db);
}
?>

あまり、どうにもならないようであれば、やむなく、標準の ODBC 関数を使って
開発を進めることになりますが、できるだけ悪あがきしたいと思っております。
(多分、DB クラスで DB2 を接続できるような予感はしているのですが)

どうぞ、よろしくお願い申し上げます。(長文になり失礼いたしました)

-- 
<staff_matsushita@ewoman.co.jp>