PHP + Oracle Cn = new COM( "ADODB.Connection" ); $this->Cn->CursorLocation = 3; // クライアント側 カーソル $this->Rs = new COM( "ADODB.Recordset" ); $ConnectionString = "Provider=MSDASQL;"; $ConnectionString .= "DSN=$Server;"; $ConnectionString .= "UID=$User;"; $ConnectionString .= "PWD=$Password;"; $this->Cn->Open( $ConnectionString ); if ( $GLOBALS['conf_db_connect_action'] != '' ) { $this->Cn->Execute( $GLOBALS['conf_db_connect_action'] ); } $this->Debug = FALSE; } # ********************************************************** # 接続解除 # ********************************************************** function Close( ) { @$this->Cn->Close(); } # ********************************************************** # select の実行 # ********************************************************** function Query( $SqlQuery ) { // DB に引き渡す SQL のキャラクタセット変換 // ( ※ 通常は使用しません ) if ( $GLOBALS['conf_db_charset'] != '' ) { $SqlQuery = mb_convert_encoding( $SqlQuery, $GLOBALS['conf_db_charset'], $GLOBALS['conf_client_charset'] ); } // レコードセットが開いたまの場合は閉じる if ( $this->Rs->State >= 1 ) { $this->Rs->Close(); } // 接続オブジェクトでレコードセットを開く $this->Rs->Open( $SqlQuery, $this->Cn ); // データが無い場合は false を返す $ret = !$this->Rs->EOF; return $ret; } # ********************************************************** # データの読み出し # PHP で使う一般的な仕様に合わせて、連想配列化 # ********************************************************** function Fetch( $Result ) { // 配列へ、インデックスと名前でデータをセット $ret = array(); for( $i = 0; $i < $this->Rs->Fields->count; $i++ ) { // 日付型( adDate ) if ( $this->Rs->Fields[$i]->type == 7 ) { // PHP4 のみ if ( substr(phpversion(),0,1) == '4' ) { $test = date( "H:i:s", $this->Rs->Fields[$i]->value ); if ( $test == "00:00:00" ) { // 時分秒が無い場合は文字列として省く $ret[$i] = date( "Y/m/d", $this->Rs->Fields[$i]->value ); $ret[$this->Rs->Fields[$i]->name] = date( "Y/m/d", $this->Rs->Fields[$i]->value ); } else { $ret[$i] = date( "Y/m/d H:i:s", $this->Rs->Fields[$i]->value ); $ret[$this->Rs->Fields[$i]->name] = date( "Y/m/d H:i:s", $this->Rs->Fields[$i]->value ); } } // PHP5 以降 else { $ret[$i] = $this->Rs->Fields[$i]->value; $ret[$this->Rs->Fields[$i]->name] = $this->Rs->Fields[$i]->value; } } else { $ret[$i] = $this->Rs->Fields[$i]->value; $ret[$this->Rs->Fields[$i]->name] = $this->Rs->Fields[$i]->value; } } // 変数にセットされたキャラクタセット変換 // ( ※ 通常は使用しません ) if ( $GLOBALS['conf_db_charset'] != '' ) { if ( $ret ) { $ret2 = array(); while (list($Key, $Value) = @each($ret)) { $ret2[$Key] = mb_convert_encoding( $Value, $GLOBALS['conf_client_charset'], $GLOBALS['conf_db_charset'] ); $Key2 = mb_convert_encoding( $Key, $GLOBALS['conf_client_charset'], $GLOBALS['conf_db_charset'] ); $ret2[$Key2] = mb_convert_encoding( $Value, $GLOBALS['conf_client_charset'], $GLOBALS['conf_db_charset'] ); } } } else { $ret2 = $ret; } return $ret2; } # ********************************************************** # フィールド名を取得 # ********************************************************** function FieldName( $idx ) { $ret = $this->Rs->Fields[$idx]->name; if ( $GLOBALS['conf_db_charset'] != '' ) { $ret = mb_convert_encoding( $ret, $GLOBALS['conf_client_charset'], $GLOBALS['conf_db_charset'] ); } return $ret; } # ********************************************************** # 外部から使うループを想定した SQL 実行 # ********************************************************** function QueryEx( $SqlQuery='' ) { // 初回 ( SQL を実行 ) if ( $SqlQuery != '' ) { if ( $this->Debug ) { print ""; print "
" . 
					$this->Arrange($SqlQuery) . "
"; print "
"; } // フィールド一覧を取得するこのクラスのコマンド if ( substr( $SqlQuery, 0, 7 ) == "COLUMNS" ) { $table_name = Explode( " ", $SqlQuery ); $this->Rs = $this->Cn->OpenSchema( 4 ); if ( $GLOBALS['conf_db_charset'] != '' ) { $tbl = mb_convert_encoding( $table_name[1], $GLOBALS['conf_db_charset'], $GLOBALS['conf_client_charset'] ); } else { $tbl = $table_name[1]; } $this->Rs->Filter = "TABLE_NAME = '" . $tbl . "'"; $this->Rs->Sort = "ORDINAL_POSITION"; } // 通常り処理 else { $this->Result = $this->Query( $SqlQuery ); if ( !$this->Result ) { return FALSE; } } // フィールド数と行数をプロパティにセット $this->nField = $this->Rs->Fields->count; $this->nRow = $this->Rs->RecordCount; return $this->Fetch ( $this->Result ); } // 2回目以降 else { $this->Rs->MoveNext(); if ( $this->Rs->EOF ) { return FALSE; } return $this->Fetch ( $this->Result ); } } # ********************************************************** # レコードセットを返さない SQL の実行 # ********************************************************** function Execute( $SqlExec ) { if ( $this->Debug ) { print ""; print "
" . 
				$this->Arrange($SqlExec) . "
"; print "
"; } // 変数にセットされたキャラクタセット変換 // ( ※ 通常は使用しません ) if ( $GLOBALS['conf_db_charset'] != '' ) { $SqlExec = mb_convert_encoding( $SqlExec, $GLOBALS['conf_db_charset'], $GLOBALS['conf_client_charset'] ); } $this->Cn->Execute( $SqlExec ); // 必ず true を返す $ret = TRUE; return $ret; } # ********************************************************** # 内部関数 # ********************************************************** function Arrange( $target ) { $ret = str_replace( ',', "\n\t,", $target ); $ret = str_replace( 'set ', "set\n\t", $ret ); $ret = str_replace( 'where ', "\nwhere ", $ret ); return "\n$ret"; } } ?>