If you've followed the instructions and you can't even connect to the DB server, welcome to the Oracle hell. Most of the information you'll find is deprecated, incomplete, not for your platform, unnecessary or just plain wrong.
Typically, you won't need at all those complicate setups you'll read about and they'll probably make things harder. I suggest you get Systernal's "Filemon" utility (for Windows, in Unix you may do with strace) and find out what exact config files and DLLs are being tried by php.exe (or httpd.exe if PHP runs as Apache module or...). Pretty often, the issue is that (e.g.) TNSNAMES.ORA does not have the correct line ending or Apache is looking for a DLL that does not even exist in your hard disc; learning that prevents you to waste time adding more and more useless environmental variables.
Goog luck.
Oracle 8 functions
Úvod
Tieto funkcie vám umo¾nia prístup k Oracle8 a Oracle7 databázam. Pou¾ívajú Oracle8 Call-Interface (OCI8)
Toto roz¹írenie je flexibilnej¹ie ako ¹tandardné Oracle roz¹írenie. Podporuje previazanie globálnych alebo lokálnych PHP a Oracle premenných, plná podpora LOB, FILE a ROWID a umo¾òuje pou¾íva» u¾ívateµsky definované premenné.
Požiadavky
Na pou¾ívanie tohto roz¹írenia budete potrebova» Oracle8 klientské kni¾nice.
Pred pou¾ívaním týchto funkcií sa uistite, ¾e máte korektne nastavené premenné prostredia Oracle pre Oracle u¾ívateµa, tak isto aj pre u¾ívateµa, pod ktorým be¾í vá¹ webserver. Budete potrebova» nasledujúce premenné:
- ORACLE_HOME
- ORACLE_SID
- LD_PRELOAD
- LD_LIBRARY_PATH
- NLS_LANG
- ORA_NLS33
Po nastavení premenných prostredia pre u¾ívateµa, pod ktorým be¾í webserver sa uistite, ¾e ste tohto u¾ívateµa (nobody, www) pridali aj do oracle skupiny(dba)).
Note: Ak vá¹ webserver nenabehne alebo padne hneï po ¹tarte Skontrolujte, èi je Apache zlinkovaný s pthread kni¾nicami:
# ldd /www/apache/bin/httpd libpthread.so.0 => /lib/libpthread.so.0 (0x4001c000) libm.so.6 => /lib/libm.so.6 (0x4002f000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x4004c000) libdl.so.2 => /lib/libdl.so.2 (0x4007a000) libc.so.6 => /lib/libc.so.6 (0x4007e000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Ak libpthread nie je na výpise, musíte prein¹talova» Apache:
# cd /usr/src/apache_1.3.xx # make clean # LIBS=-lpthread ./config.status # make # make install
Na niektorých UnixWare je kni¾nica libthread namiesto libpthread. V takom prípade musia by» PHP a Apache konfigurované pomocou EXTRA_LIBS=-lthread.
Inštalácia
Musíte ma» PHP skompilované s voµbou --with-oci8[=DIR], kde DIR je ¹tandardne nastavená na premennú prostredia ORACLE_HOME.
Runtime Konfigurácia
Toto rozšírenie nemá žiadne konfiguračné direktívy definované v php.ini.
Typy zdrojov
Preddefinované Konštanty
Konštanty uvedené nižšie sú definované týmto rozšírením a budú dostupné iba keď rozšírenie bolo buď kompilované do PHP alebo dynamicky načítané za behu (runtime).
- OCI_DEFAULT (integer)
- OCI_DESCRIBE_ONLY (integer)
- OCI_COMMIT_ON_SUCCESS (integer)
- OCI_EXACT_FETCH (integer)
- SQLT_BFILEE (integer)
- SQLT_CFILEE (integer)
- SQLT_CLOB (integer)
- SQLT_BLOB (integer)
- SQLT_RDD (integer)
- OCI_B_SQLT_NTY (integer)
- OCI_SYSDATE (integer)
- OCI_B_BFILE (integer)
- OCI_B_CFILEE (integer)
- OCI_B_CLOB (integer)
- OCI_B_BLOB (integer)
- OCI_B_ROWID (integer)
- OCI_B_CURSOR (integer)
- OCI_B_BIN (integer)
- OCI_FETCHSTATEMENT_BY_COLUMN (integer)
- OCI_FETCHSTATEMENT_BY_ROW (integer)
- OCI_ASSOC (integer)
- OCI_NUM (integer)
- OCI_BOTH (integer)
- OCI_RETURN_NULLS (integer)
- OCI_RETURN_LOBS (integer)
- OCI_DTYPE_FILE (integer)
- OCI_DTYPE_LOB (integer)
- OCI_DTYPE_ROWID (integer)
- OCI_D_FILE (integer)
- OCI_D_LOB (integer)
- OCI_D_ROWID (integer)
Príklady
Example#1 OCI Hints
<?php
// by sergo@bacup.ru
// Use option: OCI_DEFAULT for execute command to delay execution
OCIExecute($stmt, OCI_DEFAULT);
// for retrieve data use (after fetch):
$result = OCIResult($stmt, $n);
if (is_object ($result)) $result = $result->load();
// For INSERT or UPDATE statement use:
$sql = "insert into table (field1, field2) values (field1 = 'value',
field2 = empty_clob()) returning field2 into :field2";
OCIParse($conn, $sql);
$clob = OCINewDescriptor($conn, OCI_D_LOB);
OCIBindByName ($stmt, ":field2", &$clob, -1, OCI_B_CLOB);
OCIExecute($stmt, OCI_DEFAULT);
$clob->save ("some text");
OCICommit($conn);
?>
Mô¾ete µahko pristupova» k ulo¾eným procedúram rovnako ako keby ste k nim pristupovali z príkazového riadku.
Example#2 Using Stored Procedures
<?php
// by webmaster@remoterealty.com
$sth = OCIParse ( $dbh, "begin sp_newaddress( :address_id, '$firstname',
'$lastname', '$company', '$address1', '$address2', '$city', '$state',
'$postalcode', '$country', :error_code );end;" );
// This calls stored procedure sp_newaddress, with :address_id being an
// in/out variable and :error_code being an out variable.
// Then you do the binding:
OCIBindByName ( $sth, ":address_id", $addr_id, 10 );
OCIBindByName ( $sth, ":error_code", $errorcode, 10 );
OCIExecute ( $sth );
?>
Table of Contents
- oci_bind_array_by_name — Binds PHP array to Oracle PL/SQL array by name
- oci_bind_by_name — Binds the PHP variable to the Oracle placeholder
- oci_cancel — Cancels reading from cursor
- oci_close — Closes Oracle connection
- OCI-Collection->append — Appends element to the collection
- OCI-Collection->assign — Assigns a value to the collection from another existing collection
- OCI-Collection->assignElem — Assigns a value to the element of the collection
- OCI-Collection->free — Frees the resources associated with the collection object
- OCI-Collection->getElem — Returns value of the element
- OCI-Collection->max — Returns the maximum number of elements in the collection
- OCI-Collection->size — Returns size of the collection
- OCI-Collection->trim — Trims elements from the end of the collection
- oci_commit — Commits outstanding statements
- oci_connect — Establishes a connection to the Oracle server
- oci_define_by_name — Uses a PHP variable for the define-step during a SELECT
- oci_error — Returns the last error found
- oci_execute — Executes a statement
- oci_fetch_all — Fetches all rows of result data into an array
- oci_fetch_array — Returns the next row from the result data as an associative or numeric array, or both
- oci_fetch_assoc — Returns the next row from the result data as an associative array
- oci_fetch_object — Returns the next row from the result data as an object
- oci_fetch_row — Returns the next row from the result data as a numeric array
- oci_fetch — Fetches the next row into result-buffer
- oci_field_is_null — Checks if the field is NULL
- oci_field_name — Returns the name of a field from the statement
- oci_field_precision — Tell the precision of a field
- oci_field_scale — Tell the scale of the field
- oci_field_size — Returns field's size
- oci_field_type_raw — Tell the raw Oracle data type of the field
- oci_field_type — Returns field's data type
- oci_free_statement — Frees all resources associated with statement or cursor
- oci_internal_debug — Enables or disables internal debug output
- OCI-Lob->append — Appends data from the large object to another large object
- OCI-Lob->close — Closes LOB descriptor
- oci_lob_copy — Copies large object
- OCI-Lob->eof — Tests for end-of-file on a large object's descriptor
- OCI-Lob->erase — Erases a specified portion of the internal LOB data
- OCI-Lob->export — Exports LOB's contents to a file
- OCI-Lob->flush — Flushes/writes buffer of the LOB to the server
- OCI-Lob->free — Frees resources associated with the LOB descriptor
- OCI-Lob->getBuffering — Returns current state of buffering for the large object
- OCI-Lob->import — Imports file data to the LOB
- oci_lob_is_equal — Compares two LOB/FILE locators for equality
- OCI-Lob->load — Returns large object's contents
- OCI-Lob->read — Reads part of the large object
- OCI-Lob->rewind — Moves the internal pointer to the beginning of the large object
- OCI-Lob->save — Saves data to the large object
- OCI-Lob->saveFile — Alias pre: oci_lob_import
- OCI-Lob->seek — Sets the internal pointer of the large object
- OCI-Lob->setBuffering — Changes current state of buffering for the large object
- OCI-Lob->size — Returns size of large object
- OCI-Lob->tell — Returns current position of internal pointer of large object
- OCI-Lob->truncate — Truncates large object
- OCI-Lob->write — Writes data to the large object
- OCI-Lob->writeTemporary — Writes temporary large object
- OCI-Lob->writeToFile — Alias pre: oci_lob_export
- oci_new_collection — Allocates new collection object
- oci_new_connect — Establishes a new connection to the Oracle server
- oci_new_cursor — Allocates and returns a new cursor (statement handle)
- oci_new_descriptor — Initializes a new empty LOB or FILE descriptor
- oci_num_fields — Returns the number of result columns in a statement
- oci_num_rows — Returns number of rows affected during statement execution
- oci_parse — Prepares Oracle statement for execution
- oci_password_change — Changes password of Oracle's user
- oci_pconnect — Connect to an Oracle database using a persistent connection
- oci_result — Returns field's value from the fetched row
- oci_rollback — Rolls back outstanding transaction
- oci_server_version — Returns server version
- oci_set_prefetch — Sets number of rows to be prefetched
- oci_statement_type — Returns the type of an OCI statement
- ocibindbyname — Alias pre: oci_bind_by_name
- OCICancel — Ukonèenie naèítavania z kurzoru
- ocicloselob — Alias pre:
- ocicollappend — Alias pre:
- ocicollassign — Alias pre:
- ocicollassignelem — Alias pre:
- ocicollgetelem — Alias pre:
- ocicollmax — Alias pre:
- ocicollsize — Alias pre:
- ocicolltrim — Alias pre:
- ocicolumnisnull — Testuje, či je výsledný stĺpec NULL
- ocicolumnname — Vráti názov ståpca
- ocicolumnprecision — Alias pre: oci_field_precision
- ocicolumnscale — Alias pre: oci_field_scale
- ocicolumnsize — Vráti veµkos» ståpca
- ocicolumntype — Vráti dátový typ ståpca
- ocicolumntyperaw — Alias pre: oci_field_type_raw
- ocicommit — Alias pre: oci_commit
- ocidefinebyname — Alias pre: oci_define_by_name
- ocierror — Alias pre: oci_error
- ociexecute — Alias pre: oci_execute
- ocifetch — Alias pre: oci_fetch
- ocifetchinto — Fetches the next row into an array (deprecated)
- ocifetchstatement — Alias pre: oci_fetch_all
- ocifreecollection — Alias pre:
- ocifreecursor — Alias pre: oci_free_statement
- ocifreedesc — Alias pre:
- ocifreestatement — Alias pre: oci_free_statement
- ociinternaldebug — Alias pre: oci_internal_debug
- ociloadlob — Alias pre:
- ocilogoff — Alias pre: oci_close
- OCILogon — Vytvorí spojenie s Oracle serverom
- ocinewcollection — Alias pre: oci_new_collection
- ocinewcursor — Alias pre: oci_new_cursor
- ocinewdescriptor — Alias pre: oci_new_descriptor
- ocinlogon — Alias pre: oci_new_connect
- ocinumcols — Alias pre: oci_num_fields
- ociparse — Alias pre: oci_parse
- ociplogon — Alias pre: oci_pconnect
- ociresult — Alias pre: oci_result
- ocirollback — Alias pre: oci_rollback
- ocirowcount — Alias pre: oci_num_rows
- ocisavelob — Alias pre:
- ocisavelobfile — Alias pre:
- ociserverversion — Alias pre: oci_server_version
- ocisetprefetch — Alias pre: oci_set_prefetch
- ocistatementtype — Alias pre: oci_statement_type
- ociwritelobtofile — Alias pre:
- ociwritetemporarylob — Alias pre:
OCI8
10-Jun-2008 04:24
17-Jun-2007 09:25
There are several good books on PHP and Oracle available - search your favorite bookstore. There is also a free book from Oracle "The Underground PHP and Oracle Manual" that covers the OCI8 extension: http://otn.oracle.com/tech/php/pdf/underground-php-oracle-manual.pdf
(free registration for OTN required, IIRC). Disclaimer: I'm one of its authors.
28-Feb-2007 10:49
re: Andrei Kubar
I was using Oracle Instant Client on Windows XP, and was getting the
PHP Startup: Unable to load dynamic library 'C:\php\ext\php_oci8.dll' - The specified module could not be found.
error at startup, even though I had done all (most?) of the PHP and Oracle setup routines.
For me it wasn't the lack of mfc*.dll files, but a simple PATH issue: in addition to defining the environment variable TNS_ADMIN, I had to include my instant client directory in my PATH.
25-Apr-2005 10:39
When fetching associative arrays, use uppercase string indices. It appears the PHP OCI Library is less lenient with the field names returned by Oracle.
e.g.
echo $row['field1']; // This won't return anything.
as opposed to:
echo $row['FIELD1'];
08-Jan-2002 12:01
Here's a little snipet that shows how to insert multiple clob fields. Worked for me.
$dbh = OCILogon($dst_user_name, $dst_password, $dst_db_name);
for($i = 0; $i < $src_rec_cnt; $i++) {
$query = "insert into bid (id,time,resume,experience,comments) values ('$id[$i]','$time[$i]',empty_clob(),empty_clob(),empty_clob()) returning resume,experience,comments into :resume,:experience,:comments";
$stmt = OCIParse($dbh, $query);
$clob1 = OCINewDescriptor($dbh, OCI_D_LOB);
$clob2 = OCINewDescriptor($dbh, OCI_D_LOB);
$clob3 = OCINewDescriptor($dbh, OCI_D_LOB);
OCIBindByName ($stmt, ":resume", &$clob1, -1, OCI_B_CLOB);
OCIBindByName ($stmt, ":experience", &$clob2, -1, OCI_B_CLOB);
OCIBindByName ($stmt, ":comments", &$clob3, -1, OCI_B_CLOB);
OCIExecute($stmt, OCI_DEFAULT);
@$clob1->save ($resume[$i]);
@$clob2->save ($experience[$i]);
@$clob3->save ($comments[$i]);
OCICommit($dbh);
19-Jul-2001 02:38
if you feel like you have too many oracle statements clouding up your php, i came up with a function to open a connection (if necessary), parse your sql statement, and return the executed query. after you call the function, you can do whatever needs to be done. makes like so much simpler: (do whatever you want with the errors)
function execute_query($query, &$connected) {
global $ORACLE_USER, $ORACLE_PASS, $ORACLE_SID;
if(!$connected) {
$connected = @OCIPLogon($ORACLE_USER, $ORACLE_PASS, $ORACLE_SID);
if($error = OCIError()) {
die("<font color=red>ERROR!! Couldn't connect to server!</font>");
}
}
$stmt = @OCIParse($connected, $query);
if($error = OCIError($cn)) {
die("<font color=red>ERROR!! Statement syntax error!</font>");
}
@OCIExecute($stmt);
if($error = OCIError($stmt)) {
die("<font color=red>ERROR!! Could not execute statement!</font>");
}
return $stmt;
}
23-May-2001 03:48
VERY IMPORTANT! OCIPLogon only keeps a persistent connection if you are running PHP as a module. This is particularly important to Windows users who are used to running PHP as a CGI.
19-Oct-2000 02:39
Here's a clue about rowid.
Don't forget about the oracle functions:
"rowidtochar" and "chartorowid"
"select rowidtochar(rowid) as FOO from table ...."
When you want to pass the rowid in a form or link, that's
the only way to go.
