目錄
- 概念
- 基本步驟
- 詳細操作
- 問題排除
- 參考
概念
- 要連接Oracle數據庫,必須有兩個東西,一個PHP官方寫的擴展,一個Oracle官方寫的客戶端
- PHP是通過擴展去操作oralce客戶端連接的服務端數據庫,所以兩個都不能少,而且版本必須一致
- PHP官方寫的Oracle擴展:oci8,有很多版本,還有32位和64位,每個版本官網有寫對于的oracle版本
- Ocracle官方寫的客戶端:Instant Client,也分為32位和64位,需要根據PHP匹配,下面會講
基本步驟
- 下載并配置
oci8
擴展 - 下載并配置
oracle客戶端
- 配置
thinkphp
詳細操作
- 下載并配置oci8擴展
- 下載地址:http://pecl.php.net/package/oci8
- 如何選擇版本:
- 打開phpstudy環境,打開首頁phpinfo.php,查看PHP版本
- 這里7.0.12選擇32位的oci8擴展+32位的Instant Client
- 下載對于版本
- 7.3以上的PHP要選擇2.2.0以上版本,這里選擇7.0對于的版本,因為使用的
phpstudy2016
,使用的PHP版本是php-7.0.12-nts
- 注意對應版本的位數,32和64不能兼容
- 解壓后把這些全部拷貝到PHP的ext目錄下
D:\phpStudy\php\php-7.0.12-nts\ext
- 打開php.ini,找到extension所在,填寫以下內容
extension=php_pdo_oci.dll
extension=php_oci8.dll
;;extension=php_oci8_11g.dll
extension=php_oci8_12c.dll
- 說明:
php_pdo_oci.dll
:這個是phpstudy自帶的,使用pdo方法去連接oci8,這個必須打開
php_oci8.dll
:這個是拷貝進入的oci8基本擴展,必須打開
php_oci8_11g.dll / php_oci8_12c.dll
:這個是擴展版本,實測任意打開一個,都可以連接oracle 11g和oracle 19c,后面一個感覺速度更快 - 重啟phpstudy
- 出現oci8擴展,說明安裝成功
- 新安裝的Oracle Run-time Client Library Version可能出現0.0.0.0,等配置Instant Client后再刷新會出現版本信息
- 下載并配置oracle客戶端
- 下載地址:https://www.oracle.com/database/technologies/instant-client/downloads.html
- 這里也有版本選擇,不管phpinfo是32還是64,這里都下載32位,實測32位可以匹配64和32的PHP(phpstudy_pro中PHP7.3.4版本測試)
- 下載需登錄,注冊一個賬號即可
- 這里選擇phpinfo中提示的instantclient_12_1
- 解壓到任意沒有中文路徑的地方,如D:/instantclient_12_1
- 配置環境變量,這個和JAVA類似,就是可以在任何地方執行instantclient_12_1中功能
- 這個必須要配置,最終連接Oracle數據庫的是
instant client
客戶端,這個和oracle不匹配直接導致無法連接,實測32位可以匹配PHP64或者32(instant client版本還和oracle服務端版本有關,32位不行就換一個試試)
- 配置thinkphp
- common->config中配置
<?php
return array(//連接oracle 11g r2'DB_TYPE' => 'oracle', // 數據庫類型'DB_HOST' => '127.0.0.1', // 服務器地址'DB_NAME' => 'orcl', // 數據庫名'DB_USER' => 'usr', // 用戶名'DB_PWD' => 'pwd', // 密碼'DB_PORT' => '1521', // 端口//連接oracle 19c CBD模式// 'DB_TYPE' => 'oracle', // 數據庫類型// 'DB_HOST' => '127.0.0.1', // 服務器地址// 'DB_NAME' => 'orcl', // 數據庫名// 'DB_USER' => 'C##usr', // 用戶名// 'DB_PWD' => 'pwd', // 密碼// 'DB_PORT' => '1521', // 端口
);
- 書寫測試連接方法
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {public function index(){$sql = " select * from tablea where rownum <10 ";$rs = M()->query($sql);var_dump($rs);}
}
- 經實測,11G和19C都可以連接
問題排除
oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that PATH includes the directory with Oracle Instant Client libraries
- 解決方案:Instant Client沒有配置在環境變量中,配置一下即可
SQLSTATE[HY000]: OCIEnvNlsCreate: Check the character set is valid and that PHP has access to Oracle libraries and NLS data (ext\pdo_oci\oci_driver.c:688)
- 解決方案:Instant Client版本不匹配,如果是64位的,換成32位的試一試
參考
- https://blog.csdn.net/qq_35372797/article/details/120791792 按照這篇文章配置出現編碼錯誤,實際上是Instant Client版本不匹配,換成32位的就可以了