oci_connect
(PHP 5, PHP 7, PECL OCI8 >= 1.1.0)
oci_connect — Oracle データベースに接続する
説明
oci_connect
( string $username
, string $password
[, string $connection_string
[, string $character_set
[, int $session_mode
]]] ) : resource
他のほとんどの OCI8 コールで必要な接続 ID を返します。
パフォーマンスを向上させるため、 ほとんどのアプリケーションは oci_connect() ではなく、 oci_pconnect() 経由で持続的接続を使うべきです。 接続の管理及び接続プーリングについての一般的な情報は 接続のハンドリングをご覧下さい。
PHP 5.1.2 (PECL OCI8 1.1) 以降で、接続を閉じるために oci_close()を使用できます。
同一の引数で oci_connect() を呼び出すと、 2回目以降は最初の呼び出しで返された接続ハンドルを返します。 これは、あるハンドル内のトランザクションが、他のハンドル内にも あることを意味します、なぜなら、それらは同一の 基礎となるデータベース接続を使用するからです。 もし2つのハンドルを互いにトランザクション的に分離する必要があれば、 替わりに oci_new_connect() を使用してください。
パラメータ
username
Oracle ユーザー名
password
username
に対するパスワードconnection_string
接続先の
Oracle インスタンス
。 [https://www.oracle.com/pls/topic/lookup?ctx=dblatest&id=GUID-E5358DEA-D619-4B7B-A799-3D2F802500F1 » 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 19c では、さらにオプションが追加されています。 タイムアウトや keep-alive の設定を含みます。詳細は Oracle のドキュメントを参照して下さい。 サービス名を調べるには、Oracle のユーティリティ
lsnrctl status
をデータベースサーバー上で実行します。tnsnames.ora
ファイルは Oracle Net のサーチパス上にあります。 サーチパスに含まれるのは/your/path/to/instantclient/network/admin
,$ORACLE_HOME/network/admin
,/etc
です。 もうひとつの方法として、TNS_ADMIN
を指定して$TNS_ADMIN/tnsnames.ora
を読み込ませることもできます。 ウェブデーモンにそのファイルの読み込み権限を与えておきましょう。character_set
Oracle クライアントライブラリが使う文字セットを指定します。 これは、データベースが用いる文字セットと一致させる必要はありません。 一致していない場合は、Oracle が最善を尽くしてデータベースの文字セットとの間の変換を行います。 文字セットによっては、この変換結果がうまく使えないこともあります。 また、変換にはそれなりの時間を要します。
省略した場合は、 Oracle クライアントライブラリは環境変数
NLS_LANG
の値をもとに文字セットを判断します。このパラメータを渡すことで、 接続に要する時間を短縮できます。
session_mode
このパラメータは 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 拡張モジュールのインストールや設定に不備があると、 接続時に問題やエラーが発生します。解決策は インストール/設定 を参照ください。
参考
- oci_pconnect() - 持続的接続を使用してOracle データベースに接続する
- oci_new_connect() - 一意な接続を使って Oracle サーバーへ接続する
- oci_close() - Oracleとの接続を閉じる