PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<deaggregateocibindbyname>
view the version of this page
Last updated: Sat, 19 Apr 2003

LXXI. Oracle 8 Funktionen

Diese Funktionen gestatten den Zugriff auf Oracle7 und Oracle8 Datenbanken. Es wird hierbei das Oracle8 Call-Interface (OCI8) verwendet, welches installierte Oracle8 Client Bibliotheken (Libraries) ben�tigt.

Diese Schnittstelle ist flexibler als die Standard Oracle Funktionen. Es unterst�tzt Binding von localen und globalen PHP Variablen an Oracle Platzhalter und hat volle LOB,FILE und ROWID Unterst�tzung und gestattet dem Benutzer die Verwendung von Variablendefines.

Vor der Benutzung dieser Erweiterung sollten Sie sicherstellen die folgenden Umgebungsvariablen f�r den Webserveruser VOR dem Start des Webservers gesetzt zu haben.

  • ORACLE_HOME

  • ORACLE_SID

  • LD_PRELOAD

  • LD_LIBRARY_PATH

  • NLS_LANG

  • ORA_NLS33

Nachdem Sie die Umgebungsvariablen festgelegt haben, stellen Sie sicher, das die Dateien im ORACLE_HOME/network/admin f�r den Webserver lesbar sind.

Wenn der Webserver abst�rzt nach dem Start, oder nicht startet: �berpr�fen Sie, ob der Apache gegen -lpthread gelink ist:

# 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)

Wenn libpthread hier nicht gelistet ist, dann muss der Webserver neu �bersetzt werden:

# cd /usr/src/apache_1.3.xx
# make clean
# LIBS=-lpthread ./config.status
# make
# make install

Beispiel 1. OCI Hinweise

<?php
// by [email protected]

// Die Option OCI_DEFAULT f�hrt die Anweisung in einer Transaktion aus 
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);

?>

Man kann auf Stored Procedures auf einfache Weise zugreifen.

Beispiel 2. Stored Procedures benutzen

<?php
// by [email protected]
$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 );

?>

Inhaltsverzeichnis
ocibindbyname -- Bindet eine PHP-Variable an einen Oracle Platzhalter
ocicancel -- bricht das lesen von einem cursor ab
ocicollappend -- Coming soon
ocicollassign -- Kommt noch.
ocicollassignelem -- Kommt noch.
ocicollgetelem -- Kommt noch.
ocicollmax -- Kommt noch.
ocicollsize -- Kommt noch.
ocicolltrim -- Kommt noch.
ocicolumnisnull -- Testet eine Spalte ob deren Inhalt NULL ist
ocicolumnname -- Liefert den Namen der Spalte zur�ck.
ocicolumnprecision -- Kommt noch.
ocicolumnscale -- Kommt noch.
ocicolumnsize -- Gibt die Gr�sse einer Spalte zur�ck
ocicolumntype -- Liefert den Datentyp einer Spalte zur�ck.
ocicolumntyperaw -- Kommt noch.
ocicommit -- Committet eine ausstehende Transaktion.
ocidefinebyname -- Definiert eine PHP Variable als Platzhalter f�r die Werte eines SELECTs
ocierror -- Gibt den letzten Fehler von stmt|conn|global zur�ck oder FALSE, wenn kein Fehler aufgetreten ist.
ociexecute -- f�hrt ein Statement aus.
ocifetch -- Fetcht die n�chste Ergebniszeile in den Ergebnispuffer
ocifetchinto -- Fetcht die n�chste Zeile eines Ergebnisses in ein Array
ocifetchstatement -- Fetcht die Ergebnisse in ein Array
ocifreecollection -- Kommt noch.
ocifreecursor -- Gibt alle mit dem cursor verbundenen Ressourcen frei.
ocifreedesc -- Deletes a large object descriptor
ocifreestatement -- Gibt alle mit dem Statement verbundenen Ressourcen frei.
ociinternaldebug -- Aktiviert oder deaktiviert die interne Debugausgabe. Die Voreinstellung ist deaktiviert.
ociloadlob -- Kommt noch.
ocilogoff -- Schliesst eine Datenbankverbindung zu Oracle
ocilogon -- Baut eine OCI-Verbindung auf
ocinewcollection -- Kommt noch.
ocinewcursor -- return a new cursor (Statement-Handle) - use this to bind ref-cursors!
ocinewdescriptor -- Initialize a new empty descriptor LOB/FILE (LOB is default)
ocinlogon -- Logt sich in die Oracle Datenbank ein und erzeugt dabei eine neue Oracle Session.
ocinumcols -- Gibt die Anzahl der Spalten in einem Statement zur�ck
ociparse -- Analysiert eine Abfrage und gibt eine Anweisung zur�ck.
ociplogon -- Logt sich persistent in die Oracle Datenbank ein und erzeugt eine neue Oracle Session.
ociresult -- Gibt einen Spaltenwert f�r das gefetchte Statement zur�ck
ocirollback -- Macht ausstehende Transaktionen r�ckg�ngig
ocirowcount -- Gibt die Anzahl der betroffenen Zeilen zur�ck
ocisavelob -- Kommt noch.
ocisavelobfile -- Kommt noch.
ociserverversion -- Return a string containing server version information.
ocisetprefetch -- setzt die Anzahl der Zeilen die vorab gefetcht werden sollen
ocistatementtype -- Gibt den Typ eine Statements zur�ck
ociwritelobtofile -- Kommt noch.


User Contributed Notes
Oracle 8 Funktionen
add a note
ojones at dotclick dot com
19-May-2000 02:14

If you're using OCI calls from apache/mod_php, and getting ORA-12514 errors, it's important to make sure your ORACLE_HOME environment variable is defined when you start apache.  If you use /etc/rc.d/init.d/httpd to start apache, simply put the environment variable definition in there.

This ORA-12514 error is baffling, because there isn't any such error code.  It actually should be ORA-12154 (but there's an error-code transposition somewhere in Oracle 8.1.5.0.2, on Linux).

ojones at dotclick dot com
19-May-2000 02:19

To suppress the verbose Oracle error messages, put an @ sign before the PHP function call.  For a practical example:

if (@OCIFetch($stmt)) {
  /* found a row, do something */
} else {
  /* found no row, handle it */
}

cullin at cometsystems dot com
03-Aug-2000 10:47

I also posted the following note to the Unix installation page, but I thought I should add it here as well since it only happened once I included OCI8 into the build.


-------------------------------------
When compiling and installing on Solaris, you might encounter a but that occurs only when you try and start apache - in otherwords, the module compiles fine but it won't run!

The specific error is that it can't find a symbol called "__muldi3". From what I can tell, this is an internal symbol created by gcc and the problem happens when you compile the code with gcc and then use a different linker.

To fix the problem, make sure that there is only one 'ld' program in your $PATH and that you also specify '--with-gnu-ld' in your configuration.

seandrews at pa dot net
04-Aug-2000 12:14

If you would like to make oracle8 sql calls simple for your developers...erm...or for yourself...
Check out:
dbconn.php class object
Oracle8 made easy.

shmengie_2000 at yahoo dot com
03-Oct-2000 10:43

couple of notes about startup/shutdown on linux:  (redhat, maybe others)

export LD_PRELOAD=/usr/lib/libpthread.so

Caused the start/stop script to fail to stop the httpd process.  
The LD_PRELOAD environment var caused the 'ps' command to core dump.  I went bald figuring that out.

Easiest fix I could think of was to move all the oracle/php varialble exports so they are only set in the start section of the httpd script.

Never thought setting those vars globally in the script would cause problems.  That's what I get for thinking...

One other note:  Make sure the httpd process is shutdown before Oracle.

eg:
/etc/rc.d/rc0.d/K15httpd
/etc/rc.d/rc0.d/K25Oracle

Lingering connections to oracle may cause shutdown to take forever.

gl & hf

-Joe

jmoore at php dot net
06-Oct-2000 10:19

*cough* Deleted this note that could actaully be useful..

[email protected] writes
=======================
<i>Call me dumb, but I can't get OCI8 working with PHP4rc2 and Apache 1.3.9. I configured PHP --with-oracle</i>

I had a similar problem

Try --with-oci8 instead

I should likely wait until I have it the whole thing working before posting, but I think I am at least accessing the functions now because they are returning ORA errors.

My phpinfo() page appears to be right. It gives me information on oci8.

dave dot mink at usa dot net
17-Oct-2000 01:12

In order to get the OCI8 support to work in Apache1.3.12/PHP 4.0.3pl1 on Redhat 6.2, I needed to set the environment variable "LD_PRELOAD=libclntsh.so.8.0" in Apache's startup file. Without it the httpd daemon would not start. Setting the normal Oracle enivironment (including LD_LIBRARY_PATH) was not enough.
junk at netburp dot com
19-Oct-2000 09: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.

tobias dot fritz at gmx dot net
28-Nov-2000 11:22

After I finally managed to compile PHP 4.0.3pl1 (./configure --with-mysql --with-oci8 -with-apxs=/usr/local/apache/bin/apxs --enable-trans-sid) for accessing Oracle on another machine (I first had to install the Oracle client on the webserver and copy some files (that PHP was missing during make) from the Oracle Server to $ORACLE_HOME/rdbms/demo on the webserver) I got the very annoying message: "Warning: _oci_open_server: Error while trying to retrieve text for error ORA-12154".
I was looking here and on the web and finally found the problem: when I installed the Oracle Client it didn't allow me to install it as root, so I installed it with my user and everything went into my homedirectory (:-|). On the other hand apache is running with user and group nobody (httpd.conf). Since I replaced user and group in httpd.conf with the user and group with which I installed the oracle client everthing works smooth. Hope this helps to prevent some headache.

fhamonno at club-internet dot fr
04-Dec-2000 03:06

In my case, using OCI8 under Unix (Solaris2.7), the global variable TNS_ADMIN must be set to the directory containing 'tnsnames.ora' prior to connecting to the base:
   putenv('ORACLE_HOME=/.../oracle');
  putenv('TNS_ADMIN=/.../oracle/network/admin');
   $idDB = OCILogon( $User,$Psw,$SIDalias );

Otherwise, an error ORA-12154 is generated.

phil dot whittaker at phoenixtelecom dot co dot uk
06-Dec-2000 05:38

If you are using several selects and updates, ignore_user_abort, is essential for preventing partially completed records and bad data.

Took me a while to find this function.

siegel at siegel dot in-berlin dot de
16-Jan-2001 03:28

When trying to compile PHP 4 with Oracle 8.1.6 support on a SuSE 7.0 system, make sure that you have added the following line to your /sbin/init.d/apache Skript, or you will get many many segmentation faults:
LD_PRELOAD=libclntsh.so.8.0
EXPORT LD_PRELOAD

Someone posted here a note that this is also required for RedHat 6.2. I can confirm this, both for RedHat and Suse (7.0).

elf at messer dot de
23-Apr-2001 12:04

Add a link to "
fsegtrop at estiem dot org
22-May-2001 02:14

When using PHP4 in CGI-mode with Windows NT or Windows 2000 with IIS or Apache, make sure that the TNSNAMES.ORA and the SQLNET.ORA do not contain DOS/Windows CR/LF line endings.
Instead, they must have UNIX (only LF) endings. Otherwise, you will get an ORA-12154 error (TNS cannot resolve service name) when connecting to a remote database.

This all does not matter if you use the ISAPI mode.

Frank

jasendorf at lcounty dot com
23-May-2001 10: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.
php at fireball88 dot de
29-May-2001 03:59

<?PHP
 // In diesem Beispiel wird beschrieben wie man eine StoredProcedure aufruft,
 // einen Integer �bergibt und diesen wieder ausgibt.

 // Oracle Client mu� installiert sein und die extension php_oci8 mu� installiert sein!
 // Bei dem Beispiel: ps
 // Host-Name: rechner
 // Port-Nummer: 1521
 
 // Variablen
 $usr = "Dein User";
 $pwd = "Dein Passwort";
 $sid = "Dienstname";
 
 // Verbindung zum Oracle-Server herstellen
 $conn = OCILogon ($usr, $pwd, $sid);
 
 // SoredProcedure t_phpsaveproc(integer) aufrufen
 $stmt = OCIParse($conn, "begin :result := t_phpsaveproc(1); end;");
 
 // OCIBindByName bindet die Variable result an den Platzhalter $result
 OCIBindByName($stmt, "result", &$result);
 
 // Commit, hier werden die "Jobs" ausgef�hrt.
 OCIExecute($stmt);
 
 // Mit OCIResult wird der R�ckgabewert der StoredProcedure aus der Menge in die PHP-Variable $result geschrieben
 OCIResult($stmt,$result);

 // Ausgabe des R�ckgabewertes
 echo $result;
 
 // Verbindung zum Oracle-Server schlie�en
 ocilogoff($conn);
?>

31-May-2001 07:25
At last I successfully compile the php 4.0.3pl1 --with-oci8 support. This is my configuration

Platform - Redhat 7.0
Webserver - Apache 1.3.14
Remote Oracle ver - 8.1.6 (Redhat 7.0 platform)


The steps

i. Copy these directory from oracle server to my own server (opt/oci8)
- ../rdbms/demo
- ../lib
- ../network/public
- ../plsql/public

ii. Add this to /etc/profile file
ORACLE_HOME=/opt/oci8
LD_LIBRARY_PATH=/opt/oci8/lib

export ORACLE_HOME LD_LIBRARY_PATH

iii. relogin

iv. Compile the php with
./configure --with-mysql --with-oci8
--with-apxs=/usr/local/apachedev/bin/apxs --enable-trans-sid --enable-sigchild

make
make install

v. When I run apachectl start, I got this error
syntax error on line 207 of /usr/local/apache/conf/httpd.conf
cannot load /usr/local/apache/libexec/libphp4.so into server:
libclntsh.so.8.0:
cannot open object file: No Such file or directory.

then I did this;

vi /etc/ld.so.conf and add this path
/opt/oci8/lib

then I run /sbin/ldconfig

vi. run apachectl start

YES, ... its running very well.

vii. Then I try this oracle.php code test (Please change the parameter according to yours)

<?php

$db = " (DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.12.1)(PORT = 1521))
(CONNECT_DATA = (SID = ORCL))
)";

$c1 = ocilogon("test","test",$db);

if ($c1 == false){
echo OCIError($connection)."";
exit;
}
else
{
echo "success";
}

?>

YES, no error but success.

Good luck to you all.


Tips: If your webserver is on redhat linux, get the redhat linux oracle server library. Same apply to, solaris and so on.



*My mistake (1 whole day) - trying to compile php using solaris oracle server library and got nothing but errors.

flegrand at bigfoot dot com dot nospam
20-Jun-2001 06:25

Oracle 8 and iPlanet Webserver with CGI version of PHP on solaris 2.6/8

you have to set the environnements variable for oracle in the obj.conf, setting then inside the php code do not works for NLS_LANG (may be some others)

like:
Init fn="init-cgi" LateInit="yes" ORACLE_HOME="/usr2/oracle8" NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1"

see netscape info:

alexis at castanares dot com
11-Jul-2001 08:15

If you are getting the nasty ORA-12154 errors, try adding your http daemon user (listed in you httpd.conf file as "User" & "Group") to the same group as the Oracle Owner user, then be sure that the ORACLE_HOME environment variable is set to the Oracle Home Path, when you start apache.
doug at redhive dot com
19-Jul-2001 09: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;
}

jlim at natsoft dot com dot my
23-Aug-2001 09:15

Tom Tsongas has a hint on compiling oci8 with Oracle 9i.
--------------------------------

I built PHP with oracle and oci8 extensions.
I built it as a static module for Apache 1.3.20.
If you are getting errors from running 'configure' (something like it can't
locate the Oracle libraries) its because the Oracle 8 library searched for is
hard coded as libclntsh.so.8.0 corresponding to the older oracle library.
If you create a symbolic link to the oracle 9 library as follows:

ln libclntsh.so.9.0 libclntsh.so.8.0

it will compile and build.

Tom

ned at wgtech dot com
07-Sep-2001 07:48

Using OCI8 it seems putenv() doesn't seem to work for oracle environment (at least with Linux/Apache) variables, but once you get connected try issuing the sql stament:
ALTER SESSION SET NLS_whatever = value;
Seems to overide any default NLS parameters.

ruudb at stress dot utwente dot nl
26-Oct-2001 11:28

I had big problems to get an Oracle 7 server working with the OCI8 client and PHP under Linux, while connection to an Oracle 8 server worked great (In fact I got an ORA-01005 when connecting to Oracle 7). I see that more people have this problem, so here is the solution:

1. Make sure the NLS files are in your ORACLE_HOME subtree under $ORACLE_HOME/ocommon/nls/admin/data.

2. Make sure the ORA_NLS33 parameter is unset or alternatively pointing to the above directory ($ORACLE_HOME/ocommon/nls/admin/data).

3. Add "export ORACLE_HOME=/usr/local/oracle" (for example) to your apache startup script. This is important!! Adding this variabele in the httpd.conf OR in your PHP script will _NOT_ solve the problem: the directory has to be known before the Oracle library is loaded.

Thanks to Ron Reidy for helping to tackle this problem.

85276 at gmx dot net
08-Nov-2001 06:16

<?
// offset and limit feature for oracle 8 database selects

$conn = OCILogon("user","pw","server.world");

$sql="
declare
type c_type is ref cursor;
 c_data c_type;
 c_null tab.row_id%type;
begin
 open :c_data for
   select row_id from tab order by row_id;
 while :c_data%rowcount < :c_init loop
   fetch :c_data into c_null;
 end loop;
end;
";

$stmt=OCIParse($conn, $sql);
$curs=OCINewCursor($conn);

$offset=100; // dont fetch the first 100 rows
$limit=10; // we want exactly 10 rows

OCIBindByName($stmt,":c_init",$offset,32);
OCIBindByName($stmt,":c_data",$curs,-1,OCI_B_CURSOR);

OCIExecute($stmt);
OCIExecute($curs);

for ($i=0;$i<$limit&&OCIFetchinto($curs,$cols,OCI_ASSOC);$i++)
print $cols[ROW_ID]."\n";

OCIFreeStatement($stmt);
OCIFreeCursor($curs);
OCILogoff($conn);

?>

edahnke at consultant dot com
08-Jan-2002 07: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);

daniel at itiden dot se
26-Mar-2002 12:53

A little help on recompiling apache debianpackage (potato) with pthreads.
1. Get the apache-source: apt-get source apache.
2. Edit debian/rules, add export LDFLAGS=-lpthread.
3. Run "debian/rules binary" to compile new packages with pthreads.

morales at tj dot rs dot gov dot br
25-Apr-2002 12:33

Debian / Apache / PHP oci8 / Oracle

I just wanna tell my experience compiling the oci8 support from php debian sources. It gave me a lot of headache and I think it might be useful for others who use debian.

This is for debian woody (3.0), php 4.1.2, apache 1.3.24, oracle 8.1.7
(of course, it might be useful for other versions)

The Debian packages have not oci8 compiled in, so you must get the sources. Then I edited the debian/rules file and added the following:

on top:

ORACLE_HOME=my_ora_home_here
export ORACLE_HOME
LD_LIBRARY_PATH=/lib:/usr/lib:/$ORACLE_HOME/lib
export LD_LIBRARY_PATH

to the COMMON_CONFIG variable:
--with-oci8=shared,${ORACLE_HOME}

to the modules variable, just bellow the above:
oci8
(like ... mhash, mysql, oci8, odbc ...)

The "shared" keyword was the key for me. Before using it I was getting "ld: cannot find -lclntsh" on the compile time.

This way the compiling with dpkg-buildpackage went fine. If oci8.so does not show up in the modules directory after install, look php-source-path/apache-build/ext/oci8/.libs - it's there.

If this still fails, look also to the oracle-stubs problem. Oracle is compiled against glibc 2.1 and woody comes with 2.2. But oracle gives some stubs libs for work-around the problem. I don't know if this is necessary for the client libs, but I suggest trying. Look at Oracle docs.

Now things goes terribly fine here.
[]'s

Diego Morales,
Porto Alegre - Brazil.

ddc at portalframework.com
14-May-2002 06:30

Sometimes Oracle doesn't cleanup shadow processes when accessed from PHP. To avoid that, check your
$ORACLE_HOME/network/admin/tnsnames.ora file in your Oracle Client directory and remove the (SERVER=DEDICATED) token if is set.

To let Oracle delete shadow process on timeouts, add the following line in your $ORACLE_HOME/network/admin/sqlnet.ora
found in your ORACLE Server directory:

SQLNET.EXPIRE_TIME=n

Where 'n' is the number of minutes to let connection idle befor shutting them out.

devolver at iastate dot edu
30-May-2002 11:32

I spent several hours tracking down error ORA 24374, which would result from only *SOME* of my select statements.  This error would be caused if I made a query that would return any non-numerical value.  I am running an Apache 1.3.x webserver and PHP 4.2.1.

The fix is to add entries in your httpd.conf file that would export your environment settings.  I added these three lines and everything worked like a charm!
SetEnv ORACLE_HOME  /path/to/oracle/home
SetEnv ORA_NLS33 /path/to/oracle/home/ocommon/nls/admin/data
SetEnv NLS_LANG AMERICAN

Obviously, if your NLS_LANG is different, you should set it to whatever your NLS_LANG actually is.  Ask your friendly DB admin for this information.

Hope this helps someone who treads down the path that I just followed!

Trent

eak075 at yahoo dot com
05-Jul-2002 04:12

Can php4 support with iPlanet Webserver 6 and Windows 2000 Server and OCI with ORACLE Client 8.05 to connect ORACLE server 8.15
robert at ing dot hb dot se
08-Jul-2002 12:19

I had a problem installing PHP with OCI and Orcale support.
The webserver: RedHat 7, Apache, PHP 4.2.1
The dbserver: Solaris 9, Oracle9i
First I had to install the Oracle Client on the webserver, then copy the example src (dbserver:"opt/Oracle9i/app/oracle/product/9.0.1/rdbms" to webserver "ORACLE_HOME/rdbms")
Then compile the PHP src, it will generate a lot of errors. If your errors involve faults in the header files (.h) (oci.h, and more) try to replace the relative path with the absolute path to the requested headerfile.
(you will probably get more errors then when you started, esp with the oci.h file) after you have suceeded take a look at tnsnames.ora (needed for taking contact with the dbserver)

jirnbergATfh-sbgDOTacDOTat
06-Aug-2002 05:52

I installed Oracle 8.1.7 client, mod_php (4.2.2, as DSO) on a RedHat 7.1 (Seawolf) and among others encountered the "cannot find -lclntsh" problem during making. But the already suggested "shared,{$ORACLE_HOME}" solution didnt work for me.
I finally found a solution:

Usually, the linker (ld) complains, that it can't find the clntsh .so / .a files, but they were present (check in the lib dir of $ORACLE_HOME if present, if not execute ../bin/relink as user Oracle and check what the error message says).

As I backtraced the incident, I found in the configure.log file the following lines:

configure: 2842 gcc -o conftest -g -O2    conftest.c -R /usr/lib 1>&5
gcc: unrecognized option '-R'
/usr/lib: file not recognized: Is a directory
collect2: ld returned 1 exit status

It turned out, that in the ./configure script it is checked, wether the compiler supports the -R option.
However, after I commented the lines responsible for this check and told the script, that my compiler wont support "-R" and as well doesnt need to check, after a make clean and ./configure it actually could be compiled.

You can find the lines I commented by searching for the regexp check.*-R. Comment from there till the next "else" and a "fi" a few lines below. Good Luck!

Josef Irnberger

erabbott at NOSPAMterra dot com dot br
21-Aug-2002 11:20

After days of head banging, here is the correct way to install php as an apache module with oracle support:

1) su - oracle_user
   su root

//This way you assure that php will find oracle libs

2) On Apache's source directory:

./configure --prefix=/usr/local/apache

3) On PHP's source directory:

./configure --with-oci8 --with-oracle --with-apache=../apache_src_dir --enable-track-vars --enable-sigchild

make
make install

cp libs/libphp4.a ../apache_src_dir/src/modules/php4

4) On Apache's src dir:

./configure --prefix=/usr/local/apache --activate-module=src/modules/php4/libphp4.a

LIBS=-lpthread ./config.status

make
make install

5) On PHP's src dir:

cp php.ini-dist /usr/local/lib/php.ini

6) Edit httpd.conf on /usr/local/apache/conf and add the following line (if doesn't exists):

AddType application/x-httpd-php .php

This will make everything works, without two-task errors and stuff.

Regards.

aivarannamaa at hot dot ee
23-Aug-2002 04:46

About PHP with win2000 and Oracle 8.

If you try to include oci8 extension and php hangs at that (without error messages), check your Oracle client version.

I had client for 8.0.5 but server was 8.1.7. This worked well with other apps but not with php4.2.2. Updating oracle client to 8.1.7 cured the problem.

Maybe oci8 extension doesn't work with oracle 8.0.5 libs at all?

s917725 at mail dot yzu dot edu dot tw
18-Sep-2002 02:11

If you still have ORA-12154 failed with Apache PHP on oracle8i
check
1.edit httpd.conf the apache starter user should the same user(and group) who install oracle(oracle:oinstall)

2.make apache starter .bash_profile the same with user who install oracle
3.and restart apache and php
4.make sure
$c2 = ocilogon("scott","tiger",$db);

the $db should the same with /etc/oratab  SID

taht's all

bradburn at kiwi dot de
24-Sep-2002 12:23

keywords: NLS_LANG, NLS_CHARACTERSET,SetEnv,putenv()

If you have tried setting the environment variables -- especially NLS_LANG -- in PHP with putenv(), and perhaps also in Apache with SetEnv, and you are still having trouble with PHP+Oracle and foriegn character sets (you get e.g. 'd' for '�'), try setting the environment variables in your PROFILE (e.g. under bash) BEFORE starting the Apache server once more. This finally stopped the problems we were having. For reference, set the following variables:

ORACLE_HOME
ORA_NLS33
TNS_ADMIN
TWO_TASK
CLASSPATH
LD_LIBRARY_PATH
NLS_LANG

An example would be:

NLS_LANG=GERMAN_GERMANY.WE8ISO8859P15; export NLS_LANG

Then restart Apache (see below for important note).

Our system was Sun SPARC 5.8, running Apache 1.3.26 with PHP 4.2.2, and the OCI8 API for Oracle.

One further note: restart Apache with:

 apachectl stop
 apachectl start

rather than

 apachectl restart

otherwise your environment may not be reset.

Hope this helps someone!

Ed

Alberto.Grajeda.at.Bolivia
26-Sep-2002 03:42

Oracle 9i and php 4.2.x in Linux
=================================
I want to share some experience in the instalation of php-oracle in linux.

My problem was the error: "Undefined ora_logon()" or "Undefined ocilogon()". And I had configured the php with-oracle and with-oci8.

* When you compile php, the php.ini create some extensions which are dll's, but we are in linux :=|, so we have to search the modules for our plataform, by instance: php_oci8.dll for windows, in linux oci8.so (php 4.2).
* Don't forget specify the ubication of php modules in php.ini. If you specify something shared in ./configure, this must be loaded as a module.
* Restart your http server, and enjoy with php.

poulman at uponorhsdna dot com
10-Oct-2002 06:51

Re: ora-12154 errors with PHP 4.2.3, Apache 1.3.27, and Oracle 9i (client only) I had two identical set ups, one on SuSE 8.0 and one on RedHat 8.0, the SuSE worked and RedHat errored with ora-12154! For some reason, having the apache user in the oracle group worked for SuSE but did not for RedHat, I had to run the Apache service as oracle user (the one used to install oracle client). Just wanted to share this little tidbit with anyone who might be pulling their hair out like me :-). Other key things were setting the ORACLE_HOME env variable before starting Apache (I did this in the profile file).
09-Dec-2002 08:53
Configuring/Compiling PHP as a DSO with Oracle support from source on a Sun Solaris 8 box.  We had already installed Oracle 9.2.0 client tools.

1. Make sure the following tools are installed

autoconf
automake
bison
flex
gcc
make
gzip

They can be downloaded from .

2. Make sure Apache is installed with DSO support.  We ran the Apache configure/compile like so:

LIBS=-lpthread ./configure \
--prefix=/usr/local/apache \
--enable-module=most \
--enable-shared=max


make
make install

3. If you haven't already, install the Oracle client tools.
4.  Make sure the following environment variables are set correctly and are accessible by all users.  We set them in /etc/profile.

ORACLE_HOME
ORACLE_BASE
NLS_LANG
ORA_NLS33
ORACLE_TERM
LD_LIBRARY_PATH

(technically, only $ORACLE_HOME is required, but you'll want to set the rest in order to make sure things run smoothly afterward)

5.  Make sure '/usr/ccs/bin' is in your path.  If not, add it.
6.  Unpack PHP source (php-4.2.3):

gunzip php-4.2.3.tar.gz
tar xvf php-4.2.3.tar
cd php-4.2.3


7.  Run PHP configure like so :

CC=gcc ./configure --with-apxs=/usr/local/apache/bin/apxs \
--with-config-file-path=/etc \
--with-mysql \
--enable-ftp \
--with-oci8=/path/to/ORACLE_HOME \
--with-oracle=/path/to/ORACLE_HOME \
--enable-sigchild

8.  Run make:  make
9.  Run this as root:  make install
10.  Change the LoadModule line in httpd.conf to include the fully qualified path.  For us:

LoadModule php4_module      /usr/local/apache/libexec/libphp4.so

11.  Make sure the PHP files types are recognized in your httpd.conf file:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

12.  Test the configuration:

/usr/local/apache/bin/apachectl configtest

It should return "Syntax OK"

13. Bounce Apache:

/usr/local/apache/bin/apachectl restart


14.  Here's a simple PHP script to test the setup. If you don't have access to the default tables Oracle provides, change the connections/tablenames/fields to match your setup:

<?php

$db_conn = ocilogon("scott", "tiger");

$cmdstr = "select ename, sal from emp";
$parsed = ociparse($db_conn, $cmdstr);
ociexecute($parsed);
$nrows = ocifetchstatement($parsed, $results);
echo "Found: $nrows results

\n";

echo "<table border=1 cellspacing='0' width='50%'>\n";
echo "<tr>\n";
echo "<td><b>Name</b></td>\n";
echo "<td><b>Salary</b></td>\n";
echo "</tr>\n";

for ($i = 0; $i < $nrows; $i++ ) {
  echo "<tr>\n";
  echo "<td>" . $results["ENAME"][$i] . "</td>";
  echo "<td>$ " . number_format($results["SAL"][$i], 2). "</td>";
  echo "</tr>\n";
}

echo "</table>\n";

?>

gnitesh at yahoo dot com
08-Feb-2003 12:52

Addendum to "junk at netburp dot com"'s note, rowidtochar doesn't always work fine if you are using Oracle 9i. Use

cast(rowid as varchar2(xx))

instead

claus at netmedia dot de
14-Feb-2003 02:41

I had problems with german Umlaute '������'. The solution was NOT to set the NLS_LANG var. When I removed it from the apachectl script all worked perfect :). The only env-Var in the script is now ORA_HOME!

Oracle8.1.7
Apache 1.3.26
PHP4.3.0

HTH

ben-at--onshop__dot_co___uk
17-Feb-2003 06:22

Beware the 'PHP Warning:  OCI8 Recursive call!' bug in OCI8 on Linux running PHP 4.2.3.

I was bashing my head for ages trying to do an update that just causes the browser to hang. When I looked in the PHP log I saw:

PHP Warning:  OCI8 Recursive call!

There appears to be no fix at the time of writing so I am recompiling to use --with-oracle instead.

For more information on this problem:


ben-at--onshop__dot_co___uk
18-Feb-2003 05:22

Further to the previous comment regarding the browser page hanging when PHP scripts perform transactions on Oracle and the 'PHP Warning:  OCI8 Recursive call!' problem:

On further investigation I discovered with the help of our Oracle DBA that I had created a lock on the table.

In order to test the effect of different values with my PHP scripts, I was doing UPDATE SQL statements in SQLPLUS from a telnet session on the webserver on the same record that the PHP script was trying to update. The SQLPLUS session had locked out the PHP script so it was unable to perform the transaction. Remedying the problem was simply a case of closing my SQLPLUS session and running the PHP script again.

add a note

<deaggregateocibindbyname>
 Last updated: Sat, 19 Apr 2003
show source | credits | mirror sites 
Copyright © 2001-2003 The PHP Group
All rights reserved.
This mirror generously provided by: /
Last updated: Wed May 14 01:12:44 2003 CEST