windwos下使用php连接oracle数据库的过程分享

  要使用php连接oracle,基本条件是

  1.需要你安装了php、

  2.安装了oracle、

  3.配置了tnsname.ora。

  本地命令行使用sqlplus能够连接到oracle。

  根据你机器的版本选对64bit或者32bit的php程序,我们使用php的oci8扩展连接oracle

  安装好php后,打开oci8扩展,

  写一段连接oracle的ora.php代码

  

复制代码 代码如下:

  <?php

  $conn = oci_connect('hr', 'welcome', 'MYDB');

  if (!$conn) {

  $e = oci_error();

  trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);

  }

  // Prepare the statement

  $stid = oci_parse($conn, 'SELECT * FROM departments');

  if (!$stid) {

  $e = oci_error($conn);

  trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);

  }

  // Perform the logic of the query

  $r = oci_execute($stid);

  if (!$r) {

  $e = oci_error($stid);

  trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);

  }

  // Fetch the results of the query

  print "<table border='1'>\n";

  while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {

  print "<tr>\n";

  foreach ($row as $item) {

  print "    <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\n";

  }

  print "</tr>\n";

  }

  print "</table>\n";

  oci_free_statement($stid);

  oci_close($conn);

  ?>

  说明:

  oci_connect('hr', 'welcome', 'MYDB')

  第一个参数是oracle的用户名,

  第二个参数是oracle的密码

  第三个参数是tnsnames.ora里的连接串名

  命令行下执行

  

复制代码 代码如下:
php ora.php

  提示如下错误

  

复制代码 代码如下:

  PHP Warning: PHP Startup: Unable to load dynamic library 'C:\php\php_oci8.dll'- %1 不是有效的 Win32 应用程序。 in Unknown on line 0

  PHP Parse error: syntax error, unexpected '"user"' (T_CONSTANT_ENCAPSED_STRING) in C:\Users\nginx\Desktop\oraclephpoci\oci.php on line 3

  开始以为是没有选对版本,我是64位的机器,结果说是win32的程序,一看字面提示,我就重新安装了新的32bit程序还是报错。

  仔细查了查发现在32位像64位迁移的问题,出现如下问题时,我们需要安装Oracle Instant Client。

  

复制代码 代码如下:

  Unable to load dynamic library 'C:\Program Files (x86)\PHP\ext\php_oci8_11g.dll' - %1 is not a valid Win32 application.

  Warning oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that PATH includes the directory with Oracle Instant Client libraries

  Oracle Instant Client,它是一个解压后就能使用的程序,不需要安装。

  如果有oracle账号的可以去oracle下载对应的版本,(注册用户需要一堆信息)

  http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

  嫌麻烦的同学使用这个地址下载

  http://eduunix.ccut.edu.cn/index2/database/Oracle%20Instant%20Client/

  下载后把压缩包解压到c:\oracleinstantclient,并添加路径到环境变量PATH

  重新执行php ora.php,“%1 不是有效的 Win32 应用程序”的错误没有了,但是会提示

  

复制代码 代码如下:
syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

  代码是从php官网直接拷过来的,代码中有不可见的字符,使用notepad++查看所有字符,去掉乱码即可。

  继续执行,这次提示,

  

复制代码 代码如下:

  PHP Fatal error: ORA-12154: TNS:could not resolve the connect identifier specified in C:\Users\nginx\Desktop\airline\oci.php on line 6

  看样子是php没有找到tnsnames.ora的位置,时间比较赶,那我就直接使用ip的形式,具体格式根据你的信息拼写oci_connect的第三个参数

  oracle10格式:[//]host_name[:port][/service_name]

  oracle11格式:[//]host_name[:port][/service_name][:server_type][/instance_name].

  我具体使用的php oci连接串是:

  

复制代码 代码如下:
$conn = oci_connect('hr', 'welcome', '//www.glzy8.com:1523/sycx');

  配好上述信息后,终于能出结果了,但是发现查出来的结果中问乱码,这种问题基本都是编码不匹配。

  php oci8中文乱码解决办法,先查询你的oracle的数据库编码使用,

  

复制代码 代码如下:
select userenv('language') from dual;

  查出来的结果是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,在php的代码里设置环境变量

  

复制代码 代码如下:
putenv("NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK");

  终于php能够正确连接到oracle啦。