不要通过PDO连接oracle数据库和PHP

Ric*_*ros 8 php mysql oracle pdo oracle11g

我想默认使用 php 通过 PDO 连接 oracle bd 中的 oracle Schema 数据库,但它向我抛出此错误:

致命错误:未捕获的 PDOException:SQLSTATE[42S02]:pdo_oci_handle_factory:ORA-12154:TNS:无法解析 C:\xampp\htdocs\ORACLE\52conexion3.php 中指定的连接标识符 (ext\pdo_oci\oci_driver.c:640) :9 堆栈跟踪:#0 C:\xampp\htdocs\ORACLE\52conexion3.php(9): PDO->__construct('oci:host=localh...', 'hr', 'hr') #1 { main} 在第 9 行的 C:\xampp\htdocs\ORACLE\52conexion3.php 中抛出

    <!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<?php

    $base = new PDO('oci:host=localhost/XE; dbname= Schema - HR', 'hr','hr');

?>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在连接中的 sql 开发人员中,“shema”的 bd 在哪里,我右键单击以查看属性,并且我输入的数据是正确的,它显示连接名称:架构 - HR,用户:hr,密码:hr,别名网络:XE

其他尝试但仍然无效:

$base = new PDO('oci:host=localhost;dbname=Schema - HR', 'hr','hr');

$base = new PDO("oci:host=localhost;dbname=Schema - HR", "hr","hr");

$base = new PDO("oci:host=localhost/XE;dbname=Schema - HR", "hr","hr");

$base = new PDO("oci:host=XE;dbname=Schema - HR", "hr","hr");

$base = new PDO('oci:host=localhost;dbname="Schema - HR"', 'hr','hr');
Run Code Online (Sandbox Code Playgroud)

我检查了 .ini 文件,它显然是正确的“extension = php_pdo_oci.dll”。

注意:我搜索了 php 手册,当我不使用 pdo 连接但通过程序时,我以这种方式(使用 oci_connect)执行此操作,并且它可以正常工作:

$ connection = oci_connect('hr', 'hr', 'localhost / XE');

// oci_connect: 资源 oci_connect (string $ username, string $ password [, string $ connection_string [, string $ character_set [, int $ session_mode]])

tim*_*ton 6

PHP 手册页所述,并在 mario 的评论中提到, OCI 的 PDO DSN在其定义中使用dbname, not schemaor host

$conn = new PDO('oci:dbname=localhost/XE', $user, $pass);
Run Code Online (Sandbox Code Playgroud)

localhost/XE您使用的格式是“ EZCONNECT ”字符串。第一部分定义主机 (localhost),第二部分定义服务 (XE)。

您还可以使用“常规”连接字符串(通常在tnsnames.ora文件中定义):

$conn_string = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)))';
$conn = new PDO('oci:dbname=' . $conn_string, $user, $pass);
Run Code Online (Sandbox Code Playgroud)