示例:使用 ODBC 连接 PHP
接下来,您必须安装 PHP ODBC 驱动程序。通过将 iODBC 或 unixODBC 添加到 PHP 编译脚本中(非常复杂),或者通过安装 PHP-ODBC 库,都可以实现 PHP ODBC 驱动程序的安装。在基于 apt 的发行版中,可以使用以下命令:
[shell]sudo apt-get install php5-odbc[/shell]
可通过在交互模式下运行 PHP (php -a) 来测试流量。这将打开 PHP 交互控制台,在那里您可以使用与清单 1 中的示例类似的方式进行交互。
清单 1. 命令行 ODBC 连接
[shell]
php > $conn = odbc_connect(
“DRIVER={MySQL ODBC 3.51 Driver};Server=localhost;Database=phpodbcdb”,
“username”, “password”);
php > $sql = “SELECT 1 as test”;
php > $rs = odbc_exec($conn,$sql);
php > odbc_fetch_row($rs);
php > echo “\nTest\n—–\n” . odbc_result($rs,”test”) . “\n”;
Test
—-
1
php > odbc_close($conn);
php > exit;
[/shell]
让我们来分析一下清单 1 中的代码:
- 使用 PHP 中的 odbc_connect() 函数建立一个连接。该函数将 ODBC 连接器字符串、用户名称和密码作为参数。连接器字符串应与 odbc.ini 文件匹配,以确保它与预先安排的相符。
- 将一个变量实例化为字符串,该字符串代表了您的 SQL 语句。
- 使用 odbc_exec 函数执行该 SQL 语句,此函数将接受您的连接和您的 SQL 字符串,并返回一个结果集。
- 使用 odbc_fetch_row() 仅从结果集中提取一行结果,该函数接受作为参数的结果集。这是一个迭代函数,这意味着如果您再次调用它,会得到结果集中的下一个结果(依此类推,直到结果集中没有结果,如果没有结果,则返回 false)。
- 使用函数 odbc_result(),该函数接受结果集和列名称(字符串形式),并返回行迭代程序所指向的行中的单元值。
- 使用 odbc_close 函数关闭 ODBC 连接,该函数接受连接本身。
- 通过发送 exit 命令退出 PHP 交互模式。
这方法很有用,但在 Web 应用程序级别上不常使用。如果您想在客户端/服务器样式的 Web 浏览模式下测试流量,则需要安装一台 Web 服务器,比如 Apache 或 Lighttpd。(如果运行的是 Linux 系统,则必须确保提供了用于 Web 服务的 PHP 模块,否则,PHP 将无法运行。)
清单 2 展示了通过 Web 服务器执行此操作时使用的相同技术。PHP 代码类似于清单1中使用的代码,但它通过 XHTML 而不是命令行导出结果。
清单 2. 基于 XHTML 的 ODBC 连接的示例
[php]
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
< ?php $conn = odbc_connect( "DRIVER={MySQL ODBC 3.51 Driver};Server=localhost;Database=phpodbcdb", "username", "password"); if (!($conn)) { echo "
Connection to DB via ODBC failed: “;
echo odbc_errormsg ($conn );
echo “\n”;
}
$sql = “SELECT 1 as test”;
$rs = odbc_exec($conn,$sql);
echo “
Test |
---|
$result |
“;
?>
[/php]
该清单在清单1的基础上添加了一些内容:现在可以完全将 odbc_fetch_row() 函数用作迭代函数,只需将它放在 while 循环中即可。这意味着,如果 SQL 稍微有点复杂,并且要查询一个表来查找多个结果,那么该函数会在所呈现的 XHTML 表中创建一个新行。
有许多类型的 XHTML 和 HTML,它们配备有各种数量的浏览器支持,且易于使用。清单2生成了标准化的 XHTML 1.0 Strict,它是 XHTML 用来开发以数据为中心的、强大的、跨浏览器的文档的最佳形式之一。
PHP-ODBC 编程
ODBC 函数有 4 种主要类型:用于连接、查询、提取数据和错误报告的函数。查询函数能够处理标准化数据库事务,以便创建、读取、更新和删除数据(通称 CRUD 操作)。
连接函数
每个已开始的进程都必须有一个完结;否则,就会导致内存和处理器问题。所以,您要确保已经关闭了数据库连接。
如您已经看到的,odbc_connect() 函数接受 ODBC 友好的链接字符串、数据库用户名称和相关密码。它返回一个您可以在整个 PHP 程序中使用的连接对象。以下代码显示了一个示例:
[php]
$connection = odbc_connect($connection_string, $username, $password);
[/php]
在前面的示例中还可以看见,odbc_close() 函数接受了一个连接对象,并终止了与 ODBC 和数据库的通信。我要强调的是,您必须关闭您的链接,否则会有过多的连接到您的数据库的连接,此外,您还必须重启您的数据库管理系统,在更糟糕的情况下,您甚至需要重启机器。以下是该函数的运行方式:odbc_close($connection);。
查询函数
前面曾使用过 odbc_exec() 函数,它接受了一个连接对象和一个 SQL 字符串,执行该函数后,会返回一个结果集对象。该结果集对象是一个复杂对象,它通常位于数据库管理系统的存储器中,并且只能通过与之交互的函数辨认。odbc_exec() 行与以下代码类似:[php]$resultset = odbc_exec($connection, $sql);[/php]
在将未知变量注入 SQL 中时,odbc_prepare() 和 odbc_execute 函数非常有用。odbc_prepare() 函数为数据库管理系统准备了一个 SQL 语句,然后 odbc_execute() 函数会在变量中发送该语句。这意味着它比使用 PHP 建立一串 SQL 字符串并通过 odbc_exec() 发送 SQL 语句更强大、更安全、更有效。将这些函数放在一起时,它们看起来如下所示:
[php]
$resultset = odbc_prepare($connection, $sql);
$success = odbc_execute($resultset, $variables);
[/php]
清单 3 是一个很好的示例,创建它是为了根据位置和出生日期变量来搜索用户表中的用户。请注意 SQL 字符串中的问号 (?),它表示odbc_execute() 函数的串行数组中定义的变量。
清单 3. 使用 prepare 和 execute 命令实现 SQL 变量注入
[php]
$location = “London”;
$mindateofbirth = time() – 567648000; /* i.e. 18 years ago from now */
$resultset = odbc_prepare(
$connection,
“SELECT * FROM user WHERE location = ? AND dateofbirth < = ?"
);
$success = odbc_execute($resultset, array($location, $mindateofbirth));
[/php]
提取函数
odbc_fetch_row() 函数接受来自某个查询的结果集,并将迭代器指针从一行转向下一行。此函数常常与 odbc_result() 函数结合使用,以提取各种单元格的值:
[php]
odbc_fetch_row($resultset);
[/php]
在前面的示例中,odbc_result() 函数接受了一个 $resultset 和一个列名称字符串,并返回某个单元格的值。此函数可以与odbc_fetch_row() 函数结合使用,以指向结果集中的特定行:
[php]
$value = odbc_result($resultset,"columnname");
[/php]
odbc_fetch_array() 函数在某些地方类似于用来从查询结果集中提取数据的迭代函数。但是,在这里,它返回了一个代表行的数组, 并使用列名称作为键,使用单元格值作为值:
[php]
$rowarray = odbc_fetch_array($resultset);
[/php]
与 odbc_fetch_array() 函数类似,odbc_fetch_object() 提取代表行的面向对象的结构。它将列名称作为对象属性,并将单元格值作为属性值:
[php]
$rowobject = odbc_fetch_object($resultset);
[/php]
此函数在打印 HTML 形式的结果集时非常有用。它只是简单地呈现结果,但在原型制作或调试时很有用:
[php]
odbc_result_all($resultset);
[/php]
odbc_num_fields() 函数是一个相当不错的函数,它只接受结果集,并会告诉您结果集中的行数:
[php]
$numberofrows = odbc_num_rows($resultset);
[/php]
问题解决和调试
PHP ODBC 有两个得心应手的函数,其中一个是 odbc_error(),如果发生错误,它会返回错误代码,如果没有发生错误,则返回 false;另一个函数是 odbc_errormsg(),它返回用户友好的消息。您可以组合使用这两个函数,从而形成一个简单的错误消息序列:
[php]
if (odbc_error()) {
echo "I've found a problem: " . odbc_errormsg($conn);
}
[/php]
如果在开发的时候出错,您会获得另一个提示,不要害怕向导致问题的行附近添加打印语句,当然,在显示其他行时,系统会为您提供删除这些 “调试行” 的权利。请注意下面的 PHP 函数,它通常会在关键时候为您伸出援手:
[php]
print_r($variable);
[/php]
这个简单的函数接受任何变量,并将它显示在屏幕上。变量可以像一个整数或字符串那样简单,也可以像多维数组或对象那样复杂。
本文引用自http://www.ibm.com/developerworks/cn/opensource/os-php-odbc/