|
użytkowników online: 45
|
OPINIE UŻYTKOWNIKÓW
|
Porady zamieszczone tutaj przez Darka są pomocne w wielu chwilach. Wielokrotnie tworząc jakiś złożony serwis korzystam z tych porad. Można by tworzyć samemu te skrypty, ale tak naprawdę czy nie lepiej jest wziąć skrypt z tej strony i zmodyfikowac go dla swoich potrzeb? Wprawdzie możemy taki skrypt napisać sami, ale po co, skoro stracimy czas na coś, co ktoś juz napisał, przetestował i może zagwarantować, że działa poprawnie. Któryś raz z rzędu opłacam abonament i nie raz jeszcze opłacę. Kawał dobrej roboty i ogrom wiedzy w jednym miejscu.
Piotr Karamański Design Studio
|
|
PODRĘCZNIK PHP 5.x, 4.x, 3.x - częściowo spolszczony / źródło: www.php.net
[Spis]
[A]
[B]
[C]
[D]
[E]
[F]
[G]
[H]
[I]
[J]
[K]
[L]
[M]
[N]
[O]
[P]
[Q]
[R]
[S]
[T]
[U]
[V]
[X]
[W]
[Z]
LXXXVII. Oracle 8 functions
These functions allow you to access Oracle9, Oracle8 and Oracle7 databases.
It uses the Oracle Call Interface (OCI).
This extension is more flexible than the
old Oracle
extension. It supports binding of global and local PHP variables
to Oracle placeholders, has full LOB, FILE and ROWID support
and allows you to use user-supplied define variables.
You are recommended to use this extension instead of
old Oracle extension where
possible.
You will need the Oracle client libraries to use this extension.
Windows users will need at least Oracle version 8.1 to use the
php_oci8.dll dll.
Before using this extension, make sure that you have set up your
Oracle environment variables properly for the Oracle user, as well
as your web daemon user. The variables you might need to set are as
follows:
ORACLE_HOME
ORACLE_SID
LD_PRELOAD
LD_LIBRARY_PATH
NLS_LANG
ORA_NLS33
After setting up the environment variables for your webserver user,
be sure to also add the webserver user (nobody, www) to the oracle
group.
If your webserver doesn't start or crashes at startup:
Check that Apache is linked with the pthread library:
If the libpthread is not listed you have to reinstall Apache:
Please note that on some systems like UnixWare it is libthread
instead of libpthread. PHP and Apache have to be configured
with EXTRA_LIBS=-lthread.
You have to compile PHP with the option
--with-oci8[=DIR], where DIR defaults to
your environment variable ORACLE_HOME.
If you're using Oracle Instant Client, you need to build PHP with the option
--with-oci8-instant-client[=DIR]. Note
that Oracle Instant Client support first appeared in versions 4.3.11 and
5.0.4.
To rozszerzenie nie definiuje posiada żadnych
dyrektyw konfiguracyjnych w pliku php.ini.
Poniższe stałe są zdefiniowane w tym rozszerzeniu i stają się dostępne, gdy
rozszerzenie jest dokompilowane do PHP, lub załadowane dynamicznie przy starcie.
Przykład 1. OCI Hints |
<?php
OCIExecute($stmt, OCI_DEFAULT);
$result = OCIResult($stmt, $n);
if (is_object($result)) $result = $result->load();
$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);
?>
|
|
You can easily access stored procedures in the same way as you
would from the commands line.
Przykład 2. Using Stored Procedures |
<?php
$sth = OCIParse($dbh, "begin sp_newaddress( :address_id, '$firstname',
'$lastname', '$company', '$address1', '$address2', '$city', '$state',
'$postalcode', '$country', :error_code );end;");
OCIBindByName($sth, ":address_id", $addr_id, 10);
OCIBindByName($sth, ":error_code", $errorcode, 10);
OCIExecute($sth);
?>
|
|
User Contributed Notescjbj at hotmail dot com
20-Jan-2006 05:09
PHP 5.1.2 was the first PHP release to ship the "re-factored" OCI8 1.1 driver.
The configuration options for the re-factored driver have changed, particularly for building with Oracle Instant Client. Some older articles and documentation are now obsolete. Run ./configure --help to see the new syntax.
User's of PHP prior to 5.1.2 can install the re-factored driver from http://pecl.php.net/package/oci8 or http://pecl4win.php.net/ext.php/php_oci8.dll
wes9999 at myfastmail dot com
18-Jan-2006 06:19
If you're compiling php 5.1.2, and using the oracle instant client, the appropriate configure option is:
--with-oci8=instantclient,/path/to/instantclient/libs
which is a change from the configure option for php 5.1.1, which was:
--with-oci8-instant-client=/path/to/instantclient/libs
If you use the old one with php 5.1.2, it just silently ignores this option and the resulting php build doesn't have oracle support.
scoop at subindie dot com
26-Oct-2005 10:27
Regarding compiling with the recently updated OCI8 Extension (http://pecl.php.net/package/oci8).
I ran into problems when statically compiling, such as numerous "undefined reference to `zif_oci_***'" errors. Since I likely won't be the only one to run into this problem, here's some helpful hints:
If you've previously compiled your php installation, first: make clean
Then replace the existing php-x.x.x/ext/oci8 directory with the latest package from: http://pecl.php.net/package/oci8
./buildconf --force
./config ..
make
jistanidiot at gmail dot com
16-Sep-2005 05:07
On RHEL for PHP4 or 5...
For Oracle 9i before you compile PHP but after you install Oracle, you need to make the following symlinks:
ln -s $ORACLE_HOME/rdbms/public/nzerror.h $ORACLE_HOME/rdbms/demo/nzerror.h
ln -s $ORACLE_HOME/rdbms/public/nzt.h $ORACLE_HOME/rdbms/demo/nzt.h
ln -s $ORACLE_HOME/rdbms/public/ociextp.h $ORACLE_HOME/rdbms/demo/ociextp.h
ln -s $ORACLE_HOME/lib/libclntsh.so.9.0 $ORACLE_HOME/lib/libclntsh.so.8.0
ln -s $ORACLE_HOME/oui/bin/linux/libcdlntsh.so.9.0
$ORACLE_HOME/oui/bin/linux/libcdlntsh.so.8.0
With 10g you need to make the first three and then this one:
ln -s $ORACLE_HOME/lib/libclntsh.so.10.0 $ORACLE_HOME/lib/libclntsh.so.8.0
denis dot delamarre at chu-rennes dot fr
10-Jun-2005 07:00
php5 + Apache 2 + solaris 2.10 + oracle9i (64bits)
'./configure' '--with-oracle=/prod/dba/oraeve/ora9i' '--with-apxs2=/usr/local/apache2/bin/apxs' '--with-zlib' '--with-gd' '--without-mysql' '--with-oci8=/prod/dba/oraeve/ora9i'
fail with :
ld: fatal : fichier libclntsh.so : wrong elf class : ELFCLASS64
the solution is between ./configure and make command to edit Makefile and replace /ora9i/lib with /ora9i/lib32
all it's ok
MSapp
07-Jun-2005 03:48
Problems compiling 5.0.4 with Oracle Instant Client 10? (i.e. cannot find -lirc)
Remove the "-lirc" from sdk/demo/sysliblist and rerun configure.
darkstar_ae at hotmail dot com
26-Apr-2005 07: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'];
kucerar at hhmi dot org
23-Feb-2005 05:29
Great Solaris patch! Finally built. Here's some tips on connecting:
Just made this on solaris8 32bit, actually works.
1) put everything in one directory
2) unsetenv ORACLE_HOME
3) set the env vars LD_LIBRARY_PATH and SQLPATH and TNS_ADMIN(if you have it) to that directory.
4) use one of the other easy connection notations here
http://www.oracle.com/technology/
docs/tech/sql_plus/10102/readme_ic.htm
These env vars worked when put at the top of apachectl script as well.
To build you may have to fake it out with an ORACLE_HOME var, but unset it later. You may also have to fake out the build by putting header files where it is looking for them, e.g. in the rdbms/demo directory or some such other place.
When running though, make sure you have only the files required in only one directory.
Oracle has not put up a link to the 32bit solaris sqlplus--you have to guess it--it's there though:
http://download.oracle.com/otn/solaris/instantclient/
instantclient-sqlplus-solaris32-10.1.0.3.zip
...and don't forget to add ".world" on to the end of your SID. It's very common to have to specify DBNAME.WORLD to connect.
buswash at gmail dot com
02-Feb-2005 03:51
PHP 5.0.3 + Solaris 9 (UltraSPARC) + Apache 2.0.51 + Oracle 10g Instant Client 10.1.0.3
Thanks to Jakob's patch I got this combination working. Here are some things that helped me:
1. After getting this:
ld: fatal: file /opt/oracle/instantclient/libclntsh.so: wrong ELF class: ELFCLASS64
I realized that PHP is a 32-bit application and that all 3rd-party libraries need to be 32-bit as well. You need to download the 32-bit version of Instant Client (basic + sdk), even if you are running the 64-bit Solaris OS.
2. My patch command syntax was a little different:
patch -p0 -i php5_ociclient.patch config.m4
Thanks again to Jakob for porting the patch over to PHP 5.
Marc
jakob dot jellbauer at interhyp dot de
19-Jan-2005 09:00
Yes, i`ve made it !
Installing PHP 5.0.3 and the Oracle 10g Instant Client on Linux .
There is no need to have a full Oracle Installation on the Webserver, you only need the client.
http://www.oracle.com/technology/pub/notes/technote_php_instant.html
The patches provided from Oracle are for PHP Versions 4.3.9 or 4.3.10.
Here is the handmade patch for PHP 5.0.3 :
...
patch -u php-5.0.3/ext/oci8/config.m4 php5_ociclient.patch
cd php-5.0.3
rm -rf autom4te.cache config.cache
./buildconf --force
...
Download the Patch here:
http://www.pubanz.de/jakob/php5_ociclient.zip
Have fun,
Feel free to ask me if there are any questions
mark at magpies dot net
06-Jan-2005 10:05
Hello once again.
This time I present details on how to get Oracle Instant Client 10g ( 10.1.0.3 ), PHP 5.0.3 and Apache 2.0.52 running together on Linux (I've used fedora core 1 but I can't see why this will not work for any other distro )
*Note* This is not a guide on compiling php and httpd there are plenty of guides around to do that. This just covers compiling and using the oci8 module with php.
1. Set-up and install apache-2.0.52 as per normal
2. Unpack the Oracle 10g Instant Client ( 10.1.0.3 SDK + Basic, I also use the sqlplus pack to test the connection outside of apache / php )
rpm -ivh oracle-instantclient-basic-10.1.0.3-1.i386.rpm oracle-instantclient-devel-10.1.0.3-1.i386.rpm oracle-instantclient-sqlplus-10.1.0.3-1.i386.rpm
3. Set env ORACLE_HOME to the clients path in the current shell your shell command may vary (this is bash )
export ORACLE_HOME=/usr/lib/oracle/10.1.0.3/client; export LD_LIBRARY_PATH=/usr/lib/oracle/10.1.0.3/client/lib;
(if you want to test if you can now get a connection to oracle using sqlplus see item 10 below.)
4. Unpack php-5.0.3 as per normal add in --with-oci8 to the configure options. If the ORACLE_HOME is set previously then adding the directory as per "--with-oci8=$ORACLE_HOME" should not be necessary. Do this to be safe though.
5. Run the ./configure program in php source directory. Don't make it just yet though.
6. The compiler needs to find the includes oci.h + others so, from the default client install dirs, I needed to edit the php Makefile after it was configured. Open it up and look for "EXTRA_INCLUDES" and add to end of line
-I/usr/include/oracle/10.1.0.3/client (thats a capital i ) save the Makefile, then finish off compiling and installing php. Please note im sure this will be changed in php's configure so it finds these by default in the not too distant future.
7. Create a directory /etc/oracle and place your tnsnames.ora file in there, (VERY IMPORTANT make sure you chmod your tnsnames.ora to ensure that whatever username your httpd server runs under can read the file (1.5 hours of frustration later i figured this out). I just did "chmod 0644 tnsnames.ora" it doesn't matter where you put this as long as you set the env TNS_ADMIN to it. (IMPORTANT TNS_ADMIN points to a directory not the actual tnsnames.ora file )
8. My system uses a /etc/init.d/httpd script to start up httpd so in that file I exported the ORACLE_HOME & TNS_ADMIN env vars before the httpd is run, oh you will need to set LD_LIBRARY_PATH as well if you not added the path to ld.so.conf
export ORACLE_HOME=/usr/lib/oracle/10.1.0.3/client; export TNS_ADMIN=/etc/oracle
9. start httpd and bobs your uncle....
10. You can test connection once the instant client rpm's are installed by using sqlplus. set ORACLE_HOME as above, TNS_ADMIN as above, LD_LIBRARY_PATH as above and if necessary. Then sqlplus <username>/<password>@<sid or service_name as per tns_admin file> use sqlplus here as you would normally
Mark
PS: Thanks Oracle for the SDK, about time !
Mark at catalyst dot net dot nzed
10-Aug-2004 05:28
ReCompiling PHP4 to have oracle 8 support (oci8) on Debian Linux, using the Oracle 10g client libraries. Log in as root.
PACKAGES REQUIRED:
php4-dev
php4 (source files)
php4 module (might not be required, but it's what i had installed at the time)
OTHER PACKAGE REQUIREMENTS:
Oracle Client Libraries (i used Oracle 10g Server, but you should be able to use, as has been previously said, any set of the oracle client libraries from 8i onwards).
* make sure this is installed before recompiling php4.
ENVIRONMENT REQUIREMENTS:
- export ORACLE_HOME=[where u installed the oracle client]
- export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
- export LD_PRELOAD=libclntsh.so.10.1 (the version number at the end will correspond to the oracle version you previously installed. in my case, 10g is 10.1).
- vi /etc/ld.so.conf and add $ORACLE_HOME/lib to the list of paths.
then * run ldconfig to reload those changes to the system * (p.s. make sure it's the full path, and not using any environment variables. e.g. /u01/app/oracle/product/10gRDBMS is my ORACLE_HOME).
STEPS:
- cd /usr/src/[PHP4 Version]
in my case, [PHP4 Version] = php4-4.3.8, so path was
/usr/src/php4-4.3.8
- vi debian/rules
these are the default compilation rules for php4. Find section labeled COMMON_CONFIG = [...] and add --with-oci8 (it should be near the top of the file).
- debchange -i (allows you to edit the change log for the versions of php. btw - you should be in the php4 source code directory). give the version id something obviously unique. don't forget to add a comment.
when all is in readyness, then you should be able to go debian/rules binary to build the debian packages required.
the deb packages are built into the /usr/src directory. and depending on the default compilation options u choose, there should be a few. find the deb package that corresponds to the main php4 module (php4_4.3.8-4.mark.1_i386.deb for me), and run dpkg -i [package name] to install it.
- vi /etc/init.d/apache and add exports for $ORACLE_HOME, $LD_PRELOAD and $LD_LIBRARY_PATH
* don't forget to restart apache /etc/init.d/apache to reload the php4 module. *
IF YOU GET... :
if you get an error saying something about apache cannot load libclntsh.so.10.1, file not found, check the environment variables, for both the user, and in /etc/init.d/apache and also check ld.so.conf to make sure the $ORACLE_HOME/lib path is in there, and has been reloaded (with ldconfig).
editing ld.so.conf was the part that finally got it working for me.
as you should be able to tell, the steps are pretty much the same as for all oracle versions 8i onwards, and all linux OS's. but with a few debian specific paths and commands thrown in.
mark at magpies dot net
05-Jul-2004 06:07
For those trying to use the Oracle Instant Client 10g in a win32 environment, heres a nice easy howto. If you fully read the docs properly and understand what your reading you will be able to set it up, but if like me you want a quick easy fix, heres how I did it.
1. Download and install the Oracle Instant Client to where ever (lets say c:\ora\client )
2. Add your connect info, copy a previously created or provided tnsnames.ora file to the above directory.
3. Change Path in the Environment Variables area to add this directory to the path. ie. c:\ora\client;%SystemRoot%;<and so on>
4. Open regedit and add a Key called ORACLE to HKEY_LOCAL_MACHINE\SOFTWARE
5. To the ORACLE key add a string value called TNS_ADMIN and assign it the directory above (ie. c:\ora\client ) So you end up with KEY_LOCAL_MACHINE\SOFTWARE\ORACLE\TNS_ADMIN = c:\ora\client
6. Set php to use Oci8 extension and bobs your uncle
7. Reboot.
Option 7 was required as the oci8 extension or php wouldn't pick up the path change. Also my problem was how to use other programs like sqlplus without creating extra Environment Variables etc the TNS_ADMIN / tnsnames.ora part makes that simpler and allows you to call things the same as you would before.
PS: This should apply to all the Instant Clients. I haven't tried it with any others but 10g though.
Hope this helps.
beckman at purplecow dot com
15-Jun-2004 01:20
For those of you running Oracle on Linux, and running a remote box also on Linux, here's an easy way to get OCI8 working without having to install the whole Oracle DB just to get your client working.
[PS -- For the life of me, installing client libraries for Oracle really shouldn't be this hard, but it really truly is.]
Step 1. Copy the following directories from your ORACLE_HOME directory where Oracle is installed (the database server) to your remote client server/machine:
lib, network, ocommon, plsql, rdbms, oracore
These contain all of the files/folders/libraries you'll need to compile OCI8 into PHP. I put this in /home/beckman/oracle and set ORACLE_HOME as that dir.
Step 2. Compile PHP with --with-oci8=/home/beckman/oracle (obviously using your directory, not mine). Install, (re)start apache.
Step 3. Remove plsql and rdbms directories from ORACLE_HOME on your remote server, leaving you with lib, network, ocommon and oracore.
Step 4. Read: http://otn.oracle.com/tech/opensource/php/php_troubleshooting_faq.html
NOTE: This will only help you if you (a) have Oracle successfully running on Linux (was RH Enterprise 3 for me) and your client box is running the same OS. I'm not sure it will work on earlier versions, but it may. Your results should be posted here methinks!
cyrill@_malevanov_dot_spb_dot_ru
10-May-2004 10:05
Passing CLOB to stored procedure and retrieve CLOB too (function lobinout(a in clob) return clob)
<?
error_reporting(1+2+4+8);
$conn = OCILogon('batdtd', 'batdtd', 'batxml');
$lobin = OCINewDescriptor($conn, OCI_D_LOB);
$lobout = OCINewDescriptor($conn, OCI_D_LOB);
$stmt = OCIParse($conn, "declare rs clob; begin :rs := lobinout(:par); end;");
$lob_data = 'abcdefgh';
echo "binding lobin...";
OCIBindByName($stmt, ':par', $lobin, -1, OCI_B_CLOB);
echo "done<br>binding rs...";
OCIBindByName($stmt, ':rs', $lobout, -1, OCI_B_CLOB);
echo "done<br>writing temp lob...";
$lobin -> WriteTemporary($lob_data);
echo "done<br>executing...";
OCIExecute($stmt, OCI_DEFAULT);
echo "done<br>rs = ".$lobout->load();
OCICommit($conn);
$lobin -> free();
$lobout -> free();
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
dadarden_nospamoladude at iti2 dot net
13-Mar-2004 02:27
PHP Oracle -- Compiling Oracle Support into PHP, Apache 2
Apache 2.0.48, Php 4.3.4, Red Hat Linux 9.0, Debian 3.0, Oracle 9i R2
Dave Darden
|