Connect PDO with Oracle database

穿精又带淫゛_ 提交于 2021-02-07 03:42:46

问题


I am new to Oracle, installed the Oracle today the 11g Express Edition. Then I installed Java SDK, and then the free Oracle SQL Developer. I connected with system account and created a username and table as defined below. I don't exactly know how Oracle works, I think instead of database name, usernames are used. So below are details.

Username/Connection/Database = CustomSearch
Table = Reservation_General_2

There are some columns inside that table and some data. but the point is I cant connect to Oracle Server.

Here is how I tried to connect to database server.

<?php
/**
 * Created by PhpStorm.
 * User: HaiderHassan
 * Date: 9/3/14
 * Time: 9:52 PM
 */
header('Access-Control-Allow-Origin: *');
$tns = "
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
       ";
try {
    $conn = new PDO("oci:dbname=".$tns, 'customsearch', 'babaji');
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

Problem is when I try to open that page, I get this error.

ERROR: could not find driver

These are my connection settings when I connect from Oracle Sql Developer.

enter image description here

What am I doing wrong, what steps should I take to fix this issue?

Update

I added the driver by removing semicolon from the php.ini file

extension=php_pdo_oci.dll 

But I started getting this error.

The program can't start because OCI.dll is missing from your computer. Try reinstalling the program to fix this problem.

I have to click 4 time OK for different alert boxes that shows up. I also downloaded oci.dll and copied it to the windows/system32, but still getting this error. What to do?

Update

I uninstalled XAMPP and followed this guide to install Apache and PHP separately,

http://www.oracle.com/technetwork/articles/dsl/technote-php-instant-12c-2088811.html

and then I tried my luck. That driver Problem went away but there is new problem

ERROR: SQLSTATE[HY000]: pdo_oci_handle_factory: ORA-12521: TNS:listener does not currently know of instance requested in connect descriptor (ext\pdo_oci\oci_driver.c:635)

Here below is my new connection String.

try {
    $conn = new PDO('oci:dbname=//localhost:1521/xe/ORCL', 'customsearch', 'babaji');
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

I tried to follow this answer on Stack Overflow for making a connection string.

http://stackoverflow.com/questions/11970261/connect-oracle-with-pdo-with-sid-and-instance-name

Update 2

Also tried to check if drivers installed. I used this code

foreach(PDO::getAvailableDrivers() as $driver)
    echo $driver, '\n';

Got this code from this below link

http://stackoverflow.com/questions/23239433/could-not-connect-to-oracle-using-pdo

it echoes this below line

oci\n

So this means that it is installed or this means some drivers are missing?

Update 3

Again rolled back to old connection just changed some stuff in that connection and seems like connection to oracle worked.

try {
    $conn = new PDO("oci:dbname=".$tns, 'customsearch', 'babaji');
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Connected to database';
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

with this I get the message 'Connected to database', means echo works because there is no error given by PDO.

But problem is now my query is not working? What happened to my query? Or will I have to change the syntax of the query also as I connected to Oracle? Or is the connection still not working?


回答1:


Check PDO and OCI drivers installed properly or not

Try with following code

class PDOConnection {

    private $dbh;

    function __construct() {
        try {

            $server         = "127.0.0.1";
            $db_username    = "SYSTEM";
            $db_password    = "Oracle_1";
            $service_name   = "ORCL";
            $sid            = "ORCL";
            $port           = 1521;
            $dbtns          = "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = $server)(PORT = $port)) (CONNECT_DATA = (SERVICE_NAME = $service_name) (SID = $sid)))";

            //$this->dbh = new PDO("mysql:host=".$server.";dbname=".dbname, $db_username, $db_password);

            $this->dbh = new PDO("oci:dbname=" . $dbtns . ";charset=utf8", $db_username, $db_password, array(
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_EMULATE_PREPARES => false,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));

        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

    public function select($sql) {
        $sql_stmt = $this->dbh->prepare($sql);
        $sql_stmt->execute();
        $result = $sql_stmt->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }

    public function insert($sql) {
        $sql_stmt = $this->dbh->prepare($sql);
        try {
            $result = $sql_stmt->execute();
        } catch (PDOException $e) {
            trigger_error('Error occured while trying to insert into the DB:' . $e->getMessage(), E_USER_ERROR);
        }
        if ($result) {
            return $sql_stmt->rowCount();
        }
    }

    function __destruct() {
        $this->dbh = NULL;
    }

}

$dbh = new PDOConnection();

$dbh->select($select_sql);
$dbh->insert($insert_sql);



回答2:


Have you installed the PDO driver? Look at the output of phpinfo() to see what's installed and/or enabled in your environment.

PDO Installation

If you're running PHP on linux, you can see what PDO drivers are available for your distribution by running yum list php-pdo. You can install the driver by running yum install php-pdo. You may also need to install a database specific driver for your database. Running a yum list php* will show you all the PHP extensions available for installation.

Database Specific Drivers




回答3:


You need to install instant client on Windows, I used it and it work, see this video, the only that change is in the video when he execute install, you don't have to because in the new zip, doesn't have the execution file. I only have a problem when I make a SELECT query but the connection works just fine.

https://www.youtube.com/watch?v=cZDDI9HFBIU

Contact me if you have any question




回答4:


I think your problem is with oracle listener configuration, your driver is ok, the error "listener does not currently know of inst.." means there is oracle configuration issue. You must ensure that the parameters in the listener file is exactly the same as in the connection string.

Also your connection string oci:dbname=//localhost:1521/xe/ORCL is incorrect, it should be oci:dbname=//localhost:1521/orcl (host:port/service_name) as indicated in listener.ora file. Ensure the correctness of your connection string using SQL developer.

you may check the below link, this link illustrates the matching of listener.ora and connection string parameters and there is php pdo code snippet at the end with the correct usage of the connection string.

https://www.youtube.com/watch?v=pMQXVihgrrE

https://adhoctuts.com/fix-oracle-io-error-the-network-adapter-could-not-establish-the-connection-error/




回答5:


Wrong, Wrong & Wrong.

PHPinfo() will NOT enable the PDO driver nor will it show up.

You do NOT need to download a PDO driver separately the one packaged with your PHP installation will work fine.

You do NOT need to install the instant client as your PHP for windows will have the instant client built-in.

Solution: Updating IIS7 with PHP manager or updating the PHP ini file within your installation to Enable the DLL.

extension=php_pdo_mysql.dll
extension=php_pdo_sqlite.dll
extension=php_pdo_sqlsrv.dll
[PHP_PDO_OCI]
extension=php_pdo_oci.dll

Its all about the DLL's folks!

@Shailesh Sonare thanks for that great PDO connection class

ALSO PLEASE NOTE: PDO will soon be DEPRECATED Oracle recommends OCI8 so you shouldn't be using PDO anyway! ** edit outdated manual but answer is still correct!



来源:https://stackoverflow.com/questions/25712045/connect-pdo-with-oracle-database

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!