(PHP 5, PECL OCI8 >= 1.1.0)
oci_connect — Oracle データベースに接続する
他のほとんどの OCI8 コールで必要な接続 ID を返します。
接続の管理及び接続プーリングについての一般的な情報は 接続のハンドリングをご覧下さい。
PHP 5.1.2 (PECL OCI8 1.1) 以降で、接続を閉じるために oci_close()を使用できます。
同一の引数で oci_connect() を呼び出すと、 2回目以降は最初の呼び出しで返された接続ハンドルを返します。 これは、あるハンドル内のトランザクションが、他のハンドル内にも あることを意味します、なぜなら、それらは同一の 基礎となるデータベース接続を使用するからです。 もし2つのハンドルを互いにトランザクション的に分離する必要があれば、 替わりに oci_new_connect() を使用してください。
Oracle ユーザ名
username に対するパスワード
接続先の Oracle インスタンス。 » Easy Connect 文字列、tnsnames.ora ファイルの接続文字列、あるいはローカルの Oracle インスタンス名を指定します。
省略した場合、PHP は環境変数 TWO_TASK (Linux) あるいは LOCAL (Windows) と ORACLE_SID を用いて接続先の Oracle インスタンス を判断します。
Easy Connect 方式を使うには、PHP を Oracle 10g 以降のクライアントライブラリとリンクさせる必要があります。Oracle 10g の Easy Connect 文字列の形式は [//]host_name[:port][/service_name] です。Oracle 11g の場合は、この構文は [//]host_name[:port][/service_name][:server_type][/instance_name] となります。サービス名を調べるには、Oracle のユーティリティ lsnrctl status をデータベースサーバ上で実行します。
tnsnames.ora ファイルは Oracle Net のサーチパス上にあります。 サーチパスに含まれるのは $ORACLE_HOME/network/admin や /etc です。もうひとつの方法として、 TNS_ADMIN を指定して $TNS_ADMIN/tnsnames.ora を読み込ませることもできます。 ウェブデーモンにそのファイルの読み込み権限を与えておきましょう。
Oracle クライアントライブラリが使う文字セットを指定します。 これは、データベースが用いる文字セットと一致させる必要はありません。 一致していない場合は、Oracle が最善を尽くしてデータベースの文字セットとの間の変換を行います。 文字セットによっては、この変換結果がうまく使えないこともあります。 また、変換にはそれなりの時間を要します。
省略した場合は、 Oracle クライアントライブラリは環境変数 NLS_LANG の値をもとに文字セットを判断します。
このパラメータを渡すことで、 接続に要する時間を短縮できます。
このパラメータは PHP 5 (PECL OCI8 1.1) 以降で使え、 OCI_DEFAULT、 OCI_SYSOPER そして OCI_SYSDBA といった値を指定することができます。OCI_SYSOPER あるいは OCI_SYSDBA を指定した場合は、 この関数は外部の証明書を使った特権接続の確立を試みます。 特権接続は、デフォルトでは無効になっています。有効にするには oci8.privileged_connect を On に設定しなければなりません。
PHP 5.3 (PECL OCI8 1.3.4) 以降、 OCI_CRED_EXT モードを使えるようになりました。 これは、Oracle に外部認証あるいは OS 認証を使うよう指示します。 どちらかをデータベースで設定しておかなければなりません。 OCI_CRED_EXT フラグを使えるのは、ユーザ名が "/" でパスワードが空のときだけです。 oci8.privileged_connect は On あるいは Off のどちらでもかまいません。
OCI_CRED_EXT は、 OCI_SYSOPER あるいは OCI_SYSDBA モードと組み合わせて使います。
OCI_CRED_EXT は、セキュリティ上の理由により Windows ではサポートされていません。
接続 ID、もしくはエラー時は FALSE を返します。
例1 Easy Connect 構文を使った基本的な oci_connect() の使用例
<?php
// "localhost" マシン上の XE サービス(例えばデータベース)に接続します。
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
?>
例2 Network Connect 名を使った基本的な oci_connect() の使用例
<?php
// tnsnames.ora ファイルに記載された MYDB データベースに接続します。
// MYDB 用の tnsnames.ora エントリーの一例です。
// MYDB =
// (DESCRIPTION =
// (ADDRESS = (PROTOCOL = TCP)(HOST = mymachine.oracle.com)(PORT = 1521))
// (CONNECT_DATA =
// (SERVER = DEDICATED)
// (SERVICE_NAME = XE)
// )
// )
$conn = oci_connect('hr', 'welcome', 'MYDB');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
?>
例3 oci_connect() での明示的な文字セットの指定
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/XE', 'AL32UTF8');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
?>
例4 oci_connect() での複数コールの使用
<?php
$c1 = oci_connect("hr", "welcome", 'localhost/XE');
$c2 = oci_connect("hr", "welcome", 'localhost/XE');
// 同一の基礎となるデータベース接続を使用することを意味する、
// 同一の PHP リソース id を $c1 及び $c2 の両方が示します。
echo "c1 is $c1<br>\n";
echo "c2 is $c2<br>\n";
function create_table($conn)
{
$stmt = oci_parse($conn, "create table hallo (test varchar2(64))");
oci_execute($stmt);
echo "Created table<br>\n";
}
function drop_table($conn)
{
$stmt = oci_parse($conn, "drop table hallo");
oci_execute($stmt);
echo "Dropped table<br>\n";
}
function insert_data($connname, $conn)
{
$stmt = oci_parse($conn, "insert into hallo
values(to_char(sysdate,'DD-MON-YY HH24:MI:SS'))");
oci_execute($stmt, OCI_DEFAULT);
echo "$connname inserted row without committing<br>\n";
}
function rollback($connname, $conn)
{
oci_rollback($conn);
echo "$connname rollback<br>\n";
}
function select_data($connname, $conn)
{
$stmt = oci_parse($conn, "select * from hallo");
oci_execute($stmt, OCI_DEFAULT);
echo "$connname ----selecting<br>\n";
while (oci_fetch($stmt)) {
echo " " . oci_result($stmt, "TEST") . "<br>\n";
}
echo "$connname ----done<br>\n";
}
create_table($c1);
insert_data('c1', $c1); // c1 を使用して行を挿入
sleep(2); // 2行目で異なるタイムスタンプを表示するためにスリープします
insert_data('c2', $c2); // c2 を使用して行を挿入
select_data('c1', $c1); // 両方の挿入結果が返されます
select_data('c2', $c2); // 両方の挿入結果が返されます
rollback('c1', $c1); // c1 を使用してロールパック
select_data('c1', $c1); // 両方の挿入行為がロールバックされました
select_data('c2', $c2);
drop_table($c1);
// 接続のうちの一つを閉じると、その PHP 変数が利用できなくなりますが、
// もう一つは使用できます。
oci_close($c1);
echo "c1 is $c1<br>\n";
echo "c2 is $c2<br>\n";
// 出力です。
// c1 is Resource id #5
// c2 is Resource id #5
// Created table
// c1 inserted row without committing
// c2 inserted row without committing
// c1 ----selecting
// 09-DEC-09 12:14:43
// 09-DEC-09 12:14:45
// c1 ----done
// c2 ----selecting
// 09-DEC-09 12:14:43
// 09-DEC-09 12:14:45
// c2 ----done
// c1 rollback
// c1 ----selecting
// c1 ----done
// c2 ----selecting
// c2 ----done
// Dropped table
// c1 is
// c2 is Resource id #5
?>
注意:
OCI8 拡張モジュールのインストールや設定に不備があると、 接続時に問題やエラーが発生します。解決策は インストール/設定 を参照ください。
注意:
PHP 5.0.0 より前のバージョンでは、かわりに ocilogon() を使用します。現在のバージョンでは、古い関数名もまだ使えます。 しかし、これは廃止予定であり非推奨です。