PHP Conference Japan 2024

ODBC 和 DB2 函数 (PDO_ODBC)

简介

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

ibm-db2

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

unixODBC

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

通用

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

在 Windows 上,必须在 php.ini 中启用 php_pdo_odbc.dll 作为扩展。它与 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 (字符串)

PDO::ODBC_ATTR_USE_CURSOR_LIBRARY (整数)
Pdo\Odbc::ATTR_USE_CURSOR_LIBRARY 的别名。
PDO::ODBC_SQL_USE_IF_NEEDED (整数)
Pdo\Odbc::SQL_USE_IF_NEEDED 的别名。
PDO::ODBC_SQL_USE_DRIVER (整数)
Pdo\Odbc::SQL_USE_DRIVER 的别名。
PDO::ODBC_SQL_USE_ODBC (整数)
Pdo\Odbc::SQL_USE_ODBC 的别名。
PDO::ODBC_ATTR_ASSUME_UTF8 (布尔值)
Pdo\Odbc::ATTR_ASSUME_UTF8 的别名。

运行时配置

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

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

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

pdo_odbc.connection_pooling 字符串

是否池化 ODBC 连接。可以是 "严格""宽松""关闭"(等于 "")之一。该参数描述了连接管理器在将连接参数与现有池化连接匹配时应遵循的严格程度。严格 是推荐的默认值,并且仅在所有连接参数完全匹配时才会导致使用缓存连接。宽松 将导致在使用类似连接参数时使用缓存连接。这可能导致缓存使用率提高,但存在连接信息在(例如)虚拟主机之间泄漏的风险。

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

警告

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

提示

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

pdo_odbc.db2_instance_name 字符串

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

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

此设置对 Windows 无效。

目录

添加注释

用户贡献的注释 5 条注释

tuomas
15 年前
如果您想避免安装 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 要容易得多。
ChristianF
8 年前
我刚刚花了几小时试图追踪“找不到驱动程序”异常。尽管安装了 ODBC 和 PDO_ODBC,并且所有配置似乎都正确。

事实证明问题在于我在 dsn 中使用了大写的 ODBC。一旦我将 dns 更改为“odbc:database”,它就开始工作了。

由于这段代码在几个月前还可以工作,因此这种突然出现的区分大小写让我陷入困境。因此,如果您遇到此错误,请首先检查大小写。
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 中的这个细微差别,声明一个具有显式宽度的字符列类型。然后您的隐式类型转换将起作用。
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 驱动程序 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 = 示例数据库
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);
?>
harry dot forum at p-boss dot com
14 年前
MSSQL - Apache 上的 PHP - Linux Redhat

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

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

标准 odbc_connect 将无法工作,您必须使用 pdo_odbc

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

1. 下载并配置带有 with-unixodbc 的 FreeTDS

./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 协议 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=使用 FreeTDS 测试 MS SQL 数据库
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 语句 |
| 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