我在将Oracle(v 12c)数据库与php(pdo)连接时遇到严重问题。我有IIS,PHP 7.2版(x64)。它运行.php扩展名,在那里没有问题。当我从班级创建实例时,出现“找不到驱动程序”错误。我想我的问题不是我的代码,但是如果您想看看,我的代码将在我的帖子下方。
我知道问题了,我的问题是Instantclient_12_2 ...我下载了几次,我从Environment构建路径,它不起作用。我删除了php 7.2(x64),并安装了PHP 7.2(x86),我下载了Instantclient_12_2(x32),然后再次构建路径...但我从未成功。
是的,我已经将php_oci8.12.dll添加到了我的php.ini文件中,是的,我多次重新启动了IIS,但从未成功!我总是得到同样的错误。
PHP代码
class PDOConnection {
private $dbh;
function __construct() {
try {
$server = "193.255.1.98"; //remote
$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);
答案 0 :(得分:3)
PDO与php_oci8.12.dll
无关。 OCI8是一个完全不同的扩展名。如果要在Oracle上使用PDO,则需要使用community-driven driver。上次我检查它未完成并被遗弃了,尽管情况可能已经发生了变化。请注意,您可能在php.ini
中都拥有这两个名称:
;extension=oci8_12c ; Use with Oracle Database 12c Instant Client
;extension=pdo_oci
摘自The Underground PHP and Oracle Manual(PDF):
Oracle对PDO_OCI没有贡献。
PHP社区让PDO项目陷入困境,Oracle建议使用OCI8 而是因为它具有更好的功能集,性能,可靠性和 稳定性。将PDO_OCI用于通用应用程序是 不 推荐的。但是PDO 由某些框架和更高级别的软件包(例如内容管理)使用 系统,因此您可能需要使用它。
在OCI8之上,还有third-party libraries的PDO兼容驱动程序的纯PHP实现,但是我没有任何亲身经历。