ODBC 和 DB2 函数 (PDO_ODBC)

简介

PDO_ODBC 是一个驱动程序,它实现了 PHP 数据对象 (PDO) 接口,以使 PHP 通过 ODBC 驱动程序或通过 IBM DB2 调用级接口 (DB2 CLI) 库访问数据库。PDO_ODBC 目前支持三种不同类型的数据库驱动程序

ibm-db2

支持通过免费的 DB2 express-C 客户端访问 IBM DB2 通用数据库、Cloudscape 和 Apache Derby 服务器。

unixODBC

支持通过 unixODBC 驱动程序管理器和数据库自己的 ODBC 驱动程序访问数据库服务器。

通用

为 PDO_ODBC 未明确支持的 ODBC 驱动程序管理器提供编译选项。

在 Windows 上,php_pdo_odbc.dll 必须在 php.ini 中启用为扩展。它与 Windows ODBC 驱动程序管理器链接,以便 PHP 可以连接到作为系统 DSN 编目的任何数据库。

安装

UNIX 系统上的 PDO_ODBC
  1. PDO_ODBC 包含在 PHP 源代码中。可以使用以下 configure 命令将 PDO_ODBC 扩展编译为静态或共享模块。

    ibm_db2

    ./configure --with-pdo-odbc=ibm-db2,/opt/IBM/db2/V8.1/
    
    要使用 ibm-db2 风格构建 PDO_ODBC,您必须先在编译 PDO_ODBC 的同一台机器上安装 DB2 应用程序开发头文件。DB2 应用程序开发头文件是 DB2 服务器中可安装的选项,也可以作为 DB2 应用程序开发客户端的一部分,可从 IBM developerWorks » 网站 免费下载。

    如果您没有为 configure 命令提供 DB2 库和头文件的路径,PDO_ODBC 默认使用 /home/db2inst1/sqllib

    unixODBC

    ./configure --with-pdo-odbc=unixODBC,/usr/local
    
    如果您没有为 configure 命令提供 unixODBC 库和头文件的路径,PDO_ODBC 默认使用 /usr/local

    通用
    ./configure --with-pdo-odbc=generic,/usr/local,libname,ldflags,cflags
    

预定义常量

以下常量由此驱动程序定义,并且仅在扩展编译到 PHP 中或在运行时动态加载后才可用。此外,这些特定于驱动程序的常量仅应在使用此驱动程序时使用。在另一个驱动程序中使用特定于驱动程序的属性可能会导致意外行为。 PDO::getAttribute() 可用于获取 PDO::ATTR_DRIVER_NAME 属性以检查驱动程序,如果您的代码可以针对多个驱动程序运行。

PDO_ODBC_TYPE (string)

PDO::ODBC_ATTR_USE_CURSOR_LIBRARY (int)

此选项控制是否使用 ODBC 游标库。ODBC 游标库支持一些高级 ODBC 功能(例如块可滚动游标),这些功能可能未由驱动程序实现。支持以下值

  • PDO::ODBC_SQL_USE_IF_NEEDED(默认):在需要时使用 ODBC 游标库。

  • PDO::ODBC_SQL_USE_DRIVER:从不使用 ODBC 游标库。

  • PDO::ODBC_SQL_USE_ODBC:始终使用 ODBC 游标库。

PDO::ODBC_ATTR_ASSUME_UTF8 (bool)

仅限 Windows。如果为 true,则在从数据库读取或写入数据时,将 UTF-16 编码字符数据 (CHARVARCHARLONGVARCHAR) 转换为 UTF-8。如果为 false(默认),则驱动程序可能会进行字符编码转换。

运行时配置

这些函数的行为受 php.ini 中设置的影响。

PDO_ODBC 配置选项
名称 默认 可变 变更日志
pdo_odbc.connection_pooling "严格" INI_ALL  
pdo_odbc.db2_instance_name NULL INI_SYSTEM 此已弃用的功能将在将来删除
有关 INI_* 模式的更多详细信息和定义,请参阅 配置设置的设置位置

以下是配置指令的简要说明。

pdo_odbc.connection_pooling string

是否池化 ODBC 连接。可以是 "strict""relaxed""off"(等于 "")之一。此参数描述连接管理器在将连接参数与现有的池化连接匹配时应该有多严格。strict 是推荐的默认设置,并且仅在所有连接参数完全匹配时才会使用缓存的连接。relaxed 将导致在使用类似连接参数时使用缓存的连接。这可能会导致更多使用缓存,但存在将连接信息泄漏到(例如)虚拟主机之间的风险。

此设置只能从 php.ini 文件中更改,并且会影响整个进程;加载到进程中的任何其他使用相同 ODBC 库的模块也会受到影响,包括 统一 ODBC 扩展

警告

出于安全原因,在共享服务器上不应该使用relaxed匹配。

提示

除非有充分理由更改此设置,否则请将其保留为默认的strict设置。

pdo_odbc.db2_instance_name string

如果您使用 db2 风格编译 PDO_ODBC,此设置将在 Linux 和 UNIX 操作系统上将 DB2INSTANCE 环境变量的值设置为指定 DB2 实例的名称。这使 PDO_ODBC 能够解析 DB2 库的位置并建立到 DB2 数据库的编目连接。

此设置只能从 php.ini 文件中更改,并且会影响整个进程;加载到进程中的任何其他使用相同 ODBC 库的模块也会受到影响,包括 统一 ODBC 扩展

此设置对 Windows 无效。

目录

添加注释

用户贡献的注释 5 个注释

5
tuomas
14 年前
如果您想避免安装 DB2 Connect 和/或 PECL 模块 ibm_db2 和 PDO_IBM,您也可以通过 unixODBC 使用 IBM DB2 数据库。

如果您在 i 服务器上拥有 DB2 数据库,则需要安装 IBM iAccess (http://www.ibm.com/systems/i/software/access/linux/index.html) 和 unixODBC。只需安装库(rpm)并在 /etc/odbcinst.ini(/opt/ibm/iSeriesAccess/unixodbcregistration 中的示例配置)和 /etc/odbc.ini 中修改配置。

根据我的经验,这比安装 DB2 Connect 要容易得多。
8
ChristianF
8 年前
我刚花了几小时试图追踪“找不到驱动程序”异常。尽管安装了 ODBC 和 PDO_ODBC,并且所有配置似乎都是正确的。

事实证明问题是我在 dsn 中使用了大写的 ODBC。当我将 dns 更改为“odbc:database”后,它就正常工作了。

由于这段代码在几个月前还能正常工作,这种突然出现的区分大小写问题让我很困惑。所以,如果您遇到此错误,请首先检查大小写。
5
ethan dot nelson at ltd dot org
16 年前
使用 SQL 2005、PDO_ODBC 和 datetime 字段非常麻烦。MSDN 文档中关于 CAST CONVERT 的说明表明应该在字符类型和 datetime 类型之间进行隐式转换。这是真的......直到您将其放入存储过程中并使用变量声明。

例如,这将失败

declare @date varchar;
SET @date = '20080101';
SELECT cast(@date AS datetime) AS poo

虽然这成功了
declare @date varchar(19);
SET @date = '20080101';
SELECT cast(@date AS datetime) AS poo

PDO 驱动似乎尝试隐式转换,因此每当您尝试将数据插入 datetime 列类型时,它都会失败。

因此,为了解决 SQL 中的这种细微差别,请声明具有显式宽度的字符列类型。然后您的隐式类型转换将起作用。
1
Ariz Jacinto
12 年前
在 Linux 上使用 SQL Server Native Client 11.0 作为 PDO_ODBC 驱动程序

下载 Linux 上的 SQL Server Native Client 11.0 ODBC 驱动程序
http://www.microsoft.com/download/en/details.aspx?id=28160

配置 ODBC

/usr/local/etc/odbcsys.ini
--
[SQL Server Native Client 11.0]
Description = Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver = /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1720.0
UsageCount = 1

/usr/local/etc/odbc.ini
--
[MSSQLServer]
Driver = SQL Server Native Client 11.0
Description = Sample Database
Trace = Yes
Server =
Port = 1433
Database =

测试连接
mssqltest.php
--
<?php
putenv
('ODBCSYSINI=/usr/local/etc');
putenv('ODBCINI=/usr/local/etc/odbc.ini');
$username = "";
$password = "";
try {
$dbh = new PDO("odbc:MSSQLServer",
"$username",
"$password"
);
} catch (
PDOException $exception) {
echo
$exception->getMessage();
exit;
}
echo
var_dump($dbh);
unset(
$dbh);
?>
-1
harry dot forum at p-boss dot com
14 年前
MSSQL - PHP on Apache - Linux Redhat

使用 php 5.2.10 时,请注意此错误

http://bugs.php.net/bug.php?id=42068

标准 odbc_connect 将不起作用,您必须使用 pdo_odbc

使用 pdo odbc 连接到 MSSQL - 演练..

1. 下载并配置 FreeTDS with-unixodbc

./configure --prefix=/opt/SYSfreetds --with-unixodbc

make;make test; make install

2. 安装 php-odbc 和 unixODBC

php-odbc-5.2.10-1.x86_64.rpm
unixODBC.x86_64.x86x64

3. 设置 ODBC 链接

a)
使用以下内容创建一个 tds.driver 文件

[FreeTDS]
Description = v0.63 with protocol v8.0
Driver = /opt/SYSfreetds/lib/libtdsodbc.so

注册 ODBC 驱动程序 - tds.driver 文件

odbcinst -i -d -f tds.driver

b)
创建 tds.datasource 文件 - ODBC 数据源,内容如下

[SOURCENAME]
Driver=FreeTDS
Description=Test MS SQL Database with FreeTDS
Trace=No
Server=BobTheServer
Port=1433
TDS Version=8.0
Database=youDBname

注册 ODBC 数据源

odbcinst -i -s -f tds.datasource

注意,odbc.ini 文件将安装在当前用户的 home 目录中。如果您使用的是 Web 服务器,则可能需要使用它,因为 Apache 的 home 目录可能不同。

确保 .odbc.ini 位于 Apache 的 home 目录中,可能是“/var/www”

4. 在命令行上测试 ODBC 链接

isql -v SOURCENAME 'username' 'password'

+---------------------------------------+
| 已连接! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>

5. 编辑 /etc/php.ini

确保设置以下内容
mssql.secure_connection = On


6. 优雅地重启 Apache

7. 运行 PHP

<?
$dbh= new PDO('odbc:SOURCENAME', 'username', 'password');
$stmt = $dbh->prepare("$query");
$stmt->execute();
while ($row = $stmt->fetch()) {
print_r($row);
}
unset($dbh); unset($stmt);
?>

故障排除

如果您遇到问题,请尝试 strace/truss。可能是您在某个地方引用了错误的库。

确保在 odbc 文件就位后重新启动 Apache
To Top