教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> Oracle >> 开发技术 >> Oracle PHP 故障诊断常见问题以及解答 RSS订阅
Oracle PHP 故障诊断常见问题以及解答
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   

  主题
  Oracle 没有安装或没有找到
  在启动 Apache 之前,在 shell 或环境中设置所有的 Oracle 环境变量
  与数据库连接
  回显 SQL 语句,以检查它们是否得到正确设计
  始终测试来自数据库函数调用的返回代码
  插入包含引号的字符串
  在 PHP 中使用 Oracle 赋值变量
  上载 LOBS
  PHP 中的数组获取
  PEAR DB 中的 Oracle 错误消息
  OCI 线程安全
  使用 AS SYSDBA 或 AS SYSOPER 进行连接
  PHP 中的 NCHAR 和 NCLOB 支持
  
  --------------------------------------------------------------------------------
  
  Oracle 没有安装或没有找到
  
  如果在 PHP 中启用了 Oracle 支持,但未能找到 Oracle 客户端资料库,那么当您试图启动 Apache 时,将得到一个错误。例如,在 Windows 上,如果 php.ini 有 "extension=php_oci8.dll",但未能找到 Oracle 主页,则一条警告 "The dynamic link library OCI.dll could not be found in the specified path ...." 将被显示出来。
  
  在启动 Apache 之前,确保 Oracle 环境变量被正确设置(参见下一主题)。此外,请参考由 Rob Clevenger 提供的 OTN 文章 在 Windows 2000/XP 上安装 Oracle、PHP 和 Apache。
  
  Linux 用户可能看到一个关于不能加载 libclntsh.so 的 Apache 错误,但更可能在之前编译 PHP 时注意到这个问题。编译器将以一个错误 'Cannot find file "ocidfn.h"' 或 'Cannot find file "oci.h"' 而失败。
  
  确保 Oracle 目录对编译 PHP 的 OS 用户是可读的。如果您安装了 Oracle,但丢失了 Oracle 头文件,请执行一次 Oracle 的 "Client" 安装。"Client" 安装指的是 Oracle9i Database Release 安装器中那个名称的选项。(给出的其它三个选项是 Database、Management and Integration、和 Cluster Management)。此外,还请参考 OTN 文章在 Linux 上安装 Oracle、PHP 和 Apache。
  
  --------------------------------------------------------------------------------
  
  在启动 Apache 之前,在 shell 或环境中设置所有的 Oracle 环境变量。
  
  在 Apache 启动之前设置所有的 Oracle 环境变量是使 PHP 能够与 Oracle 通信的一种安全的方法。在 PHP 脚本或 httpd.conf 文件中设置变量通常不起作用。由于通常对环境的混淆,存在许多邮件列表和论坛帖子。在 Windows 和 Linux 上的行为也不同。
  
  OTN 文章 在 Linux 上安装 Oracle、PHP 和 Apache 给出了一个名为 "start_apache" 的、用来设置环境和启动 Apache 的例子:
  
     #!/bin/sh
     ORACLE_HOME=/u01/app/oracle/product/9.2
  
     ORACLE_SID=orcl
     export ORACLE_HOME ORACLE_SID
     echo "Oracle Home: $ORACLE_HOME"
     echo "Oracle SID: $ORACLE_SID"
     echo Starting Apache
     ./apachectl start
  
  我做了一些测试来查看该环境对 PHP 调用有什么影响:
  
     $mycon = OCILogon("myusername", "mypassword", "MYDB");
  
  我用了 RedHat Linux AS 2.1、Apache 1.3 和 PHP 4.3.3。
  
  在 "apachectl start" 之前没有设置 ORACLE_HOME 并且在 PHP 脚本中没有 "putenv('ORACLE_HOME=/usr/oracle/MYDB')" 的情况下,我得到:
  
  Warning:ocilogon():_oci_open_server:
  Error while trying to retrieve text for error ORA-12154
  
  这显示连接失败,未能找到消息文件(这些文件位于 Oracle 主目录下)。
  
  在 PHP 脚本中有 "putenv('ORACLE_HOME=/usr/oracle/MYDB')",但没有设置 ORACLE_HOME 的情况下,我得到:
  
  Warning:ocilogon():_oci_open_server:
  ORA-12154:TNS:could not resolve service name
  
  连接仍然没有成功,但在错误出现之后能够从消息文件中读出消息正文。
  
  在 "apachectl start" 之前设置了 ORACLE_HOME 但没有 "putenv()" 的情况下,连接成功了。这是推荐的配置。
  
  在 "apachectl start" 之前正确设置 ORACLE_HOME 同时 "putenv()" 使用一个无效 ORACLE_HOME 目录的情况下,连接成功。我也在 Windows 上试验了这种情况。这次,连接失败了,出现和我上面的第一次测试同样的消息。
  
  当我用一条 Apache httpd.conf 指令 "setenv ORACLE_HOME /usr/oracle/MYDB" 来替换 PHP putenv() 调用时,得到了一组类似的结果。
  
  一些变量可以在 PHP 脚本中设置。在启动 Apache 之前正确设置 ORACLE_HOME 之后,以下操作改变了我的默认连接,并连接到 MYDB:
  
  putenv("TWO_TASK=MYDB");
  $mycon = OCILogon("myusername", "mypassword");
  
  环境变量 TNS_ADMIN、NLS_DATE_FORMAT(可能还有其它变量)也可以用这种方式来设置。
  
  --------------------------------------------------------------------------------
  
  与数据库连接
  
  用户选择的网络服务名称常常用来识别要与哪个数据库连接。它被默认从环境变量 ORACLE_SID 中读出,或者它可以在连接调用中显式地给出。网络服务名称 MYDB 可以用在 Oracle 的命令行 SQL*Plus 实用程序中,如:
  
  sqlplus myusername/mypassword@MYDB
  
  
  或用在 PHP 中,如:
  
  $mycon = OCILogon("myusername", "mypassword", "MYDB");
  
  网络服务名称通常通过 tnsnames.ora 文件中的一个项目映射到一个实际的数据库上:
  
     MYDB =
      (DESCRIPTION =
       (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = mymachine.mydomain)(PORT = 1535))
       )
       (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = MYDB.mydomain)
       )
      )
  
  $ORACLE_HOME/network/admin/tnsnames.ora 文件被默认使用。在一些操作系统上,如果默认文件不存在,则将检查其它的位置。
  
  如果在 tnsnames.ora 中找不到被用在 OCILogon() 中的网络服务名称,或者 PHP 根本没找到 tnsnames.ora,那么您在登录时可能得到一个错误:
  
  Warning:ocilogon():_oci_open_server:ORA-12154:TNS:could not resolve service name
  
  在启动 Apache web server 之前,检查环境变量 ORACLE_HOME 是否正确设置(参见之前的主题)。
  
  如果您的 tnsnames.ora 在一个非默认的位置,您可以将环境变量 TNS_ADMIN 设置为包含它的目录。例如,如果您在使用 /tmp/tnsnames.ora,将这些行添加到 start_apache 中(同样,参见之前的主题):
  
  TNS_ADMIN=/tmp
  export TNS_ADMIN
  
  另一种解决办法是在 OCILogon() 调用中使用完整的连接字符串:
  
     $db = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)
            (HOST = mymachine.mydomain)(PORT=1535)))
            (CONNECT_DATA=(SERVER=DEDICATED)
            (SERVICE_NAME=MYDB.mydomain)))";
  
     $mycon = OCILogon("myusername", "mypassword", $db);
     ...
  
  如果 $ORACLE_HOME/network/admin/sqlnet.ora 与 tnsnames.ora 不同步且一个域名被隐式地添加到了别名中,那么错误 ORA- 12154 也可能发生。OCILogon() 调用中的不合格网络服务名称将添加 sqlnet.ora 的 NAMES.DEFAULT_DOMAIN 值。例如,如果 sqlnet.ora 有:
  
  NAMES.DEFAULT_DOMAIN = au.oracle.com
  
  那么 'OCILogon("myusername", "mypassword", "mydb")' 将使 Oracle 在 tnsnames.ora 中寻找别名 "MYDB.AU.ORACLE.COM = ..."。一种快速的解决办法是将 tnsnames.ora 项目改变为:
  
      MYDB.AU.ORACLE.COM =
       (DESCRIPTION =
        (ADDRESS_LIST =
         (ADDRESS = (PROTOCOL = TCP)(HOST = mymachine.mydomain)(PORT = 1535))
        )
        (CONNECT_DATA =
         (SERVER = DEDICATED)
         (SERVICE_NAME = MYDB.mydomain)
        )
       )
  
  --------------------------------------------------------------------------------
  
  回显 SQL 语句,检查它们是否得到正确设计
  
  令人意外的是,没有得到结果或者得到错误的结果常常归因于执行了错误的语句。在开发期间,从 PHP 回显每一条完整的 SQL 语句,检查它是否得到正确设计、所有变量是否得到了正确扩展。引用错误或者对字符串中 PHP 的变量语法的错误理解可能导致不正确的语句被执行。
  
  在执行它们之前测试 SQL*Plus 中的 SQL 语句也有助于确认正确性。
  
  当语句被输入到诸如 SQL*Plus 之类的工具中时,通常用一个分号来告诉工具这个语句完成了,现在可以被执行。不过,分号不被认为是语句的一部分,并且不会被发送到数据库中。在 PHP 中,不要向 SQL 语句中添加分号,否则将出现一个 Oracle 错误。这个例子是一次有效的查询:
  
  
  $sql = "

来源:upschool.com.cn
作者:
关键字:Oracle,PHP,故障诊断常见问题以,解答
发表日期:2007-1-6 1:06:43

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:如何用保存数据库连接参数代码及祥解   下一篇:JDBC存取Oralce数据库的注意几点事项


2008-12-2 21:09:19
本文的相类似文章
  • “江民通行证”使用疑难解答
  • Oracle字符转换访问服务器漏洞
  • Oracle和mysql 的一些简单命令对比参照
  • oracle 的共享连接和专用连接方式之初探
  • Oracle的X$表系列介绍之-X$KSLLCLASS
  • Oracle数据导入导出imp/exp命令
  • 利用 Oracle 10g 技能学习 DB2 9.1
  • Oracle10g对回滚操作时间的准确评估
  • Oracle字符集子集与超级的对应关系
  • Oracle数据库密码破解易如反掌?
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com