ugrás a tartalomhoz

oci8 - oracle elérés php-ből

docker · 2007. Aug. 22. (Sze), 09.19
A problémáva küzdök jóideje, utánaolvastam sok helyen de megakadtam. Habár van több megoldás is sajnos nálam nem működött.

A dott egy Linuxos szerver (Ubuntu Feisty) 5-ös php-val. Telepítettem az oci8 (oracle instantclient-el) kiterjesztést ami szépen megjelenik a phpinfo()-ban.

A Linuxon lévő php az oracle szerverhez kapcsolodik. Az oracle szerveren be lett állítva, hogy az adott ip-röl lehessen vele dolgozni.

Létrehoztam egy network/admin könyvtárat, valamint elkészítettem egy tnsnames.ora fájlt, abba a megfelelő dolgokat.

neptunora =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST=host.hu)(PORT = 1521))
     )
     (CONNECT_DATA =
        (SID=NEPTUN)
     )
   )


Akörnyezeti változók beállításának hiánya miatt, a kódban heyleztem el a szükséges adatokat, és a biztonság kedvéért, a kódban is próbaltam buherálni velük.


<?php
putenv("ORACLE_SID=NEPTUN");
putenv("ORACLE_HOME=/opt/oracle/instantclient");
putenv("TNS_ADMIN=/opt/oracle/network/admin");

$db="(DESCRIPTION=
        (ADDRESS_LIST=
                (ADDRESS=(PROTOCOL=TCP)(HOST=host.hu)(PORT=1521))
        )
        (CONNECT_DATA=(SID=NEPTUN))
        )";

if ($c=OCILogon("user", "password", $db)) {
  echo "Kapcsolodas sikeres.\n";
  ocilogoff($c);
} else {
  $err = ocierror();
  echo "Oracle kapcsolodasi hiba" . $err[text];
}
?>

A környezeti változók beállításával lehet a gond szerintem, de sehogy nem tudok megküzdeni a problémával.

Warning: ocilogon() [function.ocilogon]: ORA-12560: TNS:protocol adapter error


Érzem, hogy itt már valamit nagyon összegányoltam, ugyhogy kérem aki tud segíteni az mentsen meg.

Előre is köszönöm!
 
1

nálam

zila · 2007. Aug. 22. (Sze), 10.01
én az apache virtualhost configba tettem ezt:

    SetEnv ORACLE_HOME /home/oracle/product/10.2.0/db_1
    SetEnv ORACLE_SID orasid
    SetEnv NLS_LANG HUNGARIAN_HUNGARY.EE8ISO8859P2
persze ehhez kell az apache setenv modul:
LoadModule setenvif_module /usr/lib/apache2/modules/mod_setenvif.so

ja és én a Zend Core 2.0-t használom php engine-nek...

Azt is megpróbálnám, hogy a $db-nek a neptunora-t adod meg:

$db="neptunora";
2

A SID-et kell megadni

tolmi · 2007. Aug. 22. (Sze), 10.21
Jaja, a SID kell neki, nem a connect string. Lásd <a href="http://hu2.php.net/manual/en/function.oci-connect.php">oci_connect</a> dokumentációja, $db paraméter leírása.
3

Oracle környezeti változók

Hodicska Gergely · 2007. Aug. 22. (Sze), 13.01
Elvileg az Oracle környezeti változókat még a webszerver elindítása előtt kell beállítani a doksi szerint, bár ha megy, akkor így is jó.


Üdv,
Felhő
4

más hibakód

docker · 2007. Aug. 22. (Sze), 13.31
A környezeti változókat betettem az apache confjába (az apache2.conf végére)
A szkripten belül getenv()-el kiírja szépen a megadott értékeket. Mivel távoli elérés van szükségem van a tnsnames.ora fájlra, aminek az elérését szintén beállítottam (tnsnames.ora végződés nélkül /opt/oracle/network/admin).
Kipróbáltam a $db változót üresen hagyni, megadni benne a SID-et valamint megadni benne a tnsnames.ora fájlban megadott neptunora-t is. Sajnos egyikkel sem működött.

Jelenlegi állapot:

$db = "neptunora";                                                                                                 

if ($c=ocilogon("user", "password", $db)) {                                                                            
  echo "Sikeres kapcsolodas.\n";                                                                      
  ocilogoff($c);                                                                                                   
} else {                                                                                                           
  $err = ocierror();                                                                                               
  echo "Oracle kapcsolodasi hiba" . $err[text];                                                                      
}
apache2.conf
SetEnv ORACLE_HOME /opt/oracle/instantclient                                                                      
SetEnv ORACLE_SID NEPTUN                                                                                          
SetEnv NLS_LANG HUNGARIAN_HUNGARY.EE8ISO8859P2                                                                    
SetEnv TNS_ADMIN /opt/oracle/network/admin


tnsnames.ora
neptunora =                                                                                                        
   (DESCRIPTION =                                                                                                  
     (ADDRESS_LIST =                                                                                              
       (ADDRESS = (PROTOCOL = TCP)(HOST=host.hu)(PORT = 1521))                                          
     )                                                                                                            
     (CONNECT_DATA =                                                                                              
        (SID=NEPTUN)                                                                                              
     )                                                                                                            
   )


hiba változott:
Warning: ocilogon() [function.ocilogon]: ORA-12154: TNS:could not resolve the connect identifier specified


melyiket használjam az ocilogon()-t vagy az oci_connect()-et? (egyikkel sem működött)
5

így próbáltad már?

zila · 2007. Aug. 22. (Sze), 13.56
http://hu2.php.net/manual/en/function.oci-connect.php
Note: If you're using PHP with Oracle Instant Client, you can use easy connect naming method described here: » http://download-west.oracle.com/docs/cd/B12037_01/network.101/b10775/naming.htm#i498306. Basically this means you can specify "//db_host[:port]/database_name" as database name. But if you want to use the old way of naming you must set either ORACLE_HOME or TNS_ADMIN.
6

database_name

docker · 2007. Aug. 22. (Sze), 14.39
The database name is the same as your ORACLE_SID

Elnézést tárgytalan....
7

megoldás

docker · 2007. Aug. 22. (Sze), 14.58
Mindenki segítségét nagyon köszönöm, a probléma megoldódott!

A gond az volt, hogy a host nem ip címmel lett megadva.... nem hiszem el, nem is mondom, hogy mennyit szívtam vele.

if ($c=oci_connect("user", "password", "10.0.0.x:1521/sid")){                                                
  echo "Successfully connected to Oracle.\n";                                                                
  ocilogoff($c);                                                                                             
} else {                                                                                                     
  $err = ocierror();                                                                                         
  echo "Oracle Connect Error: " . $err[text];                                                                
}