odbc php无法使用
PHP是用于动态网站开发的最常用编程语言之一。 它相当强大和高效。 它也很简单,并且由于它的灵活性而成为初学者的好语言。
PHP本身就是一种很好的语言(尤其是与XHTML结合使用时)。 但是,大多数应用程序都需要一种方便的数据存储方法,通常由数据库(例如MySQL或PostgreSQL)来实现。 为了使PHP连接到数据存储系统,需要一个连接器,该连接器允许使用mysql_query()
和pg_query()
。 在大多数情况下,这是可行的,但有时,业务需求要求将数据存储在电子表格之类的文件中,以便于个人操作。 在这些情况下,需要使用其他类型的连接器来与数据对话。
如果您希望不将SQL发送到特定的数据库系统,并且希望SQL与您配置的任何数据存储一起使用怎么办? 这就是创建开放数据库连接(ODBC)的原因,并且在安装了正确的连接器后,您甚至可以访问Microsoft®Excel®,CSV和其他数据文件类型。 ODBC是使PHP开发“与数据库连接器无关”的连接器。 它对诸如MySQL,PostgreSQL,SQLite,Microsoft SQLServer®,IBM®DB2®,Sybase,OpenLink Virtuoso,FileMaker和MicrosoftOffice®Access®等数据库使用odbc_query()
类的功能。 根据正确的ODBC驱动程序设置,它也可以用于CSV和Excel电子表格。
ODBC是用于将编程语言与数据存储连接的软件驱动程序系统。 它是一个免费的开源系统,于1992年出现,它试图通过编程语言和数据库查询访问(SQL标准化)来标准化连接方法,例如功能和配置。
ODBC通过充当双重接口或连接器设计来工作:首先,作为ODBC系统的编程语言系统,其次,作为数据存储系统的ODBC系统。 因此,ODBC需要一个编程语言到ODBC驱动程序(例如,PHP-ODBC库)和一个ODBC到数据存储系统驱动程序(例如MySQL-ODBC库)。 这是ODBC系统本身的补充,ODBC系统本身处理数据源的配置,并允许数据源和编程语言的歧义。
PHP是一种编程语言,通常用作驱动动态网站的服务器端语言。 它是一种动态且弱类型的语言,因此非常灵活。 许多开发人员都奇怪地熟悉它,因为它受C编程语言的影响。 这是1995年出现的一种免费开放源代码编程语言,您可以通过连接器将PHP与数据库一起使用,以生成XHTML和HTML以便在Web浏览器中呈现。
SQL是一种用于查询数据存储的跨平台语言。 它主要用于关系数据库,但确实具有过程,面向对象和对象关系的扩展。 SQL的现代实现可以在MySQL,PostgreSQL,SQLite,DB2(商业版和Express-C版),Microsoft SQL Server,OpenLink Virtuoso,FileMaker和Microsoft Access中找到,所有这些都可以使用诸如PHP之类的编程语言进行连接。通过连接系统(ODBC)。
让我们看一下如何将典型的Linux-Apache-PHP-MySQL(LAMP)环境转换为这种灵活的Linux-Apache-PHP-ODBC(LAPO)环境。 Linux®上的ODBC驱动程序有两个常规选项:iODBC和unixODBC。 两组驱动程序都有各自的优缺点,并且都可以使用PHP,但是它们可以使用不同的数据库集。 我之所以选择iODBC,是因为它与PHP和Ruby等Web编程语言有着传统的牢固连接,并且在与ODBC友好的数据库(如MySQL和OpenLink Virtuoso)一起使用时具有稳定性。 但是,这只是选择问题,您可能需要研究效率要求。 除了细微的内部差异之外,iODBC和unixODBC在连接编程语言方面(PHP函数是相同的)和数据库(例如,MySQL不会受到影响)以相同的方式工作。
Linux软件包管理器中提供了iODBC和unixODBC。 例如,在Debian,Ubuntu或Linux Mint命令行上,您将运行sudo apt-get install iodbc
。
如果尚未安装,请安装数据库系统,例如MySQL或PostgreSQL。 然后安装ODBC到数据库连接器。 该连接器因数据库而异,但是以MySQL为例,通过从MySQL网站安装与操作系统相关的驱动程序来安装连接器。
在支持apt
Linux发行版中,可以从控制台运行以下命令: sudo apt-get install libmyodbc
。
您将必须通过运行iodbcadm-gtk等程序,将ODBC客户端配置为与已安装的数据库一起使用。 您也可以手动编辑iODBC文件。 (在Linux中,此文件通常位于/etc/iodbc.ini中。)
接下来,您必须安装PHP ODBC驱动程序。 您可以通过将iODBC或unixODBC添加到PHP编译脚本(非常复杂)或安装PHP-ODBC库来实现。 在基于apt的发行版中,您可以使用以下命令: sudo apt-get install php5-odbc
。
通过以交互方式( php -a
)运行PHP来测试流程。 这将打开PHP交互式控制台,您可以在其中以类似于清单1中的示例的方式进行交互。
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;
让我们分析清单1中的代码:
odbc_connect()
函数建立连接。 此函数将ODBC连接器字符串,用户名和密码作为参数。 连接器字符串将与您的odbc.ini文件匹配,因此请确保事先匹配。 odbc_exec
执行SQL,该SQL将odbc_exec
连接和SQL字符串并返回结果集。 odbc_fetch_row()
从该结果集中仅获取一行,该odbc_fetch_row()
结果集作为参数。 这是一个迭代函数,这意味着如果再次调用它,您将在集合中获得下一个结果(依此类推,直到结果集中没有结果,在这种情况下,它将返回false)。 odbc_result()
,该函数odbc_result()
结果集和列名(作为字符串),并返回行迭代器指向的行内的单元格值。 odbc_close
关闭ODBC连接,该连接本身会进行连接。 exit
命令退出PHP交互模式。 这很好,但是在Web应用程序规模上并没有太多用处。 为了在客户端/服务器风格的Web浏览模式下进行测试,需要安装Web服务器,例如Apache或Lighttpd。 (如果您运行的是Linux,请确保获取适用于Web服务PHP模块;否则,PHP将不会运行。)
清单2显示了与通过Web服务器执行的技术相同的技术。 PHP代码类似于清单1 ,但是通过XHTML而不是在命令行上导出结果。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>PHP and ODBC: XHTML Example 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<?php
$conn = odbc_connect(
"DRIVER={MySQL ODBC 3.51 Driver};Server=localhost;Database=phpodbcdb",
"username", "password");
if (!($conn)) {
echo "<p>Connection to DB via ODBC failed: ";
echo odbc_errormsg ($conn );
echo "</p>\n";
}
$sql = "SELECT 1 as test";
$rs = odbc_exec($conn,$sql);
echo "<table><tr>";
echo "<th>Test</th></tr>";
while (odbc_fetch_row($rs))
{
$result = odbc_result($rs,"test");
echo "<tr><td>$result</td></tr>";
}
odbc_close($conn);
echo "</table>";
?>
</body>
</html>
此清单中没有清单1中的新增内容:现在,您可以将odbc_fetch_row()
作为迭代函数,通过将其放置在while
循环中来充分利用它。 这意味着,如果您SQL稍微复杂一点并查询一个表以获取多个结果,它将在呈现的XHTML表中创建新行。
XHTML和HTML有很多类型,具有各种浏览器支持和易用性。 清单2生成标准化的XHTML 1.0 Strict,这是用于开发以数据为中心和强大的跨浏览器文档的XHTML的最佳形式之一。
ODBC函数有四种主要类型:用于连接,查询,获取数据和错误报告的函数。 查询功能能够处理用于创建,读取,更新和删除数据的标准数据库事务(称为CRUD操作)。
每个已经开始的过程都必须有一个结局。 否则,您将遇到内存和处理器问题。 因此,请确保关闭数据库连接。
您已经看到odbc_connect()
接受了ODBC友好的连接字符串,数据库用户名和相关的密码。 它返回一个连接对象,您可以在整个PHP程序中使用它。 以下代码显示了一个示例:
$connection = odbc_connect($connection_string, $username, $password);
在前面的示例中,您还已经看到odbc_close()
接受连接对象并终止与ODBC和数据库的通信。 我不能承受太大的压力,您必须关闭连接。 否则,您与数据库的连接将过多,并且必须重新启动数据库管理系统-甚至更糟的是整个计算机。 它是这样工作的: odbc_close($connection);
。
您已经使用过odbc_exec()
; 它接受一个连接对象和一个SQL字符串,将其全部触发,然后返回结果集对象。 结果集对象是一个复杂的野兽,因为它通常驻留在数据库管理系统的内存中,并且只能由与其交互的功能来解密。 odbc_exec()
行看起来像这样: $resultset = odbc_exec($connection, $sql);
。
odbc_prepare()
和odbc_execute
函数对于将未知变量注入SQL非常有用。 odbc_prepare()
函数使用数据库管理系统准备一条SQL语句,然后odbc_execute()
发送变量。 这意味着它比简单地在PHP中构建串联SQL字符串并通过odbc_exec()
发送它更强大,更安全,更高效。 在一起,它们看起来像这样:
$resultset = odbc_prepare($connection, $sql);
$success = odbc_execute($resultset, $variables);
清单3是我创建的一个不错的示例,用于根据位置和出生日期变量在用户表中搜索人员。 请注意,SQL字符串中的问号( ?
)表示在odbc_execute()
函数的串行数组中定义的变量。
$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));
odbc_fetch_row()
从查询中获取结果集,并将迭代器指针从一行移到另一行。 此函数通常与odbc_result()
函数结合使用以获取各种单元格:
odbc_fetch_row($resultset);
在较早的示例中, odbc_result()
接受$resultset
和列名字符串,并返回单元格的值。 这与odbc_fetch_row()
函数结合使用以指向结果集中的特定行:
$value = odbc_result($resultset,"columnname");
odbc_fetch_array()
函数有点类似,因为它是一个迭代器函数,用于从查询的结果集中获取数据。 但是,这一次,它返回一个数组,该数组代表以列名作为键而单元格作为值的行:
$rowarray = odbc_fetch_array($resultset);
与odbc_fetch_array()
相似, odbc_fetch_object()
取而代之的是表示该行的面向对象的结构。 它将列名作为对象属性,将单元格值作为属性值:
$rowobject = odbc_fetch_object($resultset);
此功能对于以HTML打印一组结果很有用。 这是结果的简单呈现,但在进行原型设计或调试时可能很有用:
odbc_result_all($resultset);
odbc_num_fields()
函数是一个非常不错的函数,它仅接收结果集并告诉您其中的行数:
$numberofrows = odbc_num_rows($resultset);
可以结合使用两个方便PHP ODBC函数— odbc_error()
如果发生错误则返回错误代码;如果未发生错误则返回false odbc_errormsg()
; odbc_errormsg()
(返回用户友好的消息),可以组合成简单的错误消息序列:
if (odbc_error()) {
echo "I've found a problem: " . odbc_errormsg($conn);
}
如果您在开发过程中遇到错误,另一条提示是,不要害怕在导致问题的行附近添加打印语句-当然,只要在显示其他行时删除这些“调试行”即可。 请注意以下PHP函数,该函数通常是救生程序:
print_r($variable);
这个简单的函数接受任何变量并将其显示在屏幕上。 该变量可以像整数或字符串一样简单,也可以像多维数组或对象一样复杂。
考虑构建可以部署在任何地方的Web应用程序(此类示例包括Drupal,WordPress或Joomla)。 这些通常是使用一个数据库(例如MySQL)及其特定于数据库的功能(例如mysql_connect()
)构建的,然后通过更改功能(针对实例pg_connect()
)。 使用ODBC时,这是多余的做法,因为配置纯粹是在应用程序的初始化中进行的,而ODBC函数与数据库系统是雌雄同体的。
但是,需要注意的一件事是,尽管所有数据库管理系统都共享一个标准化SQL,但有时它们还包括自己的扩展。 这就是为什么将现有PHP-MySQL,PHP-PostgreSQL或PHP-MS-SQL应用程序转换为PHP-ODBC应用程序比较棘手的原因。 因此,从头开始构建应用程序时,必须小心使用严格标准化SQL(或者最多是非常常见SQL扩展)。
如前所述,可以使用ODBC连接到电子表格。 与数据库一样,您必须使用连接器执行此操作。 那里有很多-有些是开源的,但很多是专有的。 一个示例是Windows的Microsoft Office,它带有用于Excel电子表格的ODBC连接器。 通过ODBC处理电子表格可能很尴尬,如果将一个简单的电子表格转换为数据库表,可能会解决很多麻烦。 但是,一旦建立了电子表格ODBC连接,您就可以将它或多或少地像数据库连接一样对待—相同的ODBC PHP函数,但使用类似SQL的语言,并且在Excel中,使用标准电子表格公式。
链接的数据移动着眼于通过网络连接数据。 这样做有很多好处-主要是为了让机器了解数据的特定元素,也让用户受益,例如使他们能够更轻松地查找信息。 链接的数据移动使用语义网中预先存在的标准(例如资源描述框架和Web本体语言)和Internet / Web标准化(例如HTTP和OpenID)。 已经开始理解,链接数据连接方法有点类似于ODBC,因为URI有点类似于连接字符串,而语义Web查询语言(SPARQL)通过建立的连接有点类似于SQL。
扩展链接数据在某种程度上类似于ODBC的理论,就有可能建立到链接数据存储(例如“三重存储”)的ODBC连接,并通过ODBC连接发送SPARQL查询。 OpenLink Virtuoso就是这种情况,它允许您通过标准ODBC连接进行连接。
iODBC具有GNU通用公共许可证(GPL)和伯克利软件开发开源许可证的双重许可。 UnixODBC也根据GPL开源许可证获得许可。 这意味着您用这两个库开发的任何东西都不必是开源的,而可以是专有的。 Microsoft的ODBC驱动程序也可以是专有软件的一部分,但受Microsoft Office软件(对于Access数据库和Excel电子表格)和SQL Server(对于SQL Server数据库)的许可协议的约束。
ODBC是使通用连接最大化的一种很棒的技术。 它提高了效率,并允许您扩展应用程序以使用新形式的数据,例如基于Web的链接数据。 但是,它确实具有缺点:为了实现通用连接,您必须仔细选择构建SQL查询的方式,因为在所有数据库管理系统中只能使用所有可用SQL命令的一部分。 希望本文提供了使用PHP编程语言通过ODBC开始使用数据库所需的内容。
翻译自: https://www.ibm.com/developerworks/opensource/library/os-php-odbc/index.html
odbc php无法使用