- ·上一篇文章:通过ADO调用Access数据库和COM程序
- ·下一篇文章:PHP中通过ADO调用Access数据库
PEAR MDB数据库抽象层一次编写—随处运行
(
'type' => 'outputfile',
'result' => $result,
'row' => 0,
'field' => 'b_data',
'binary' => 1,
'filename' => './myfile2.gif'
);
$blob = $mdb->createlob($binary_lob);
现在我们能够使用 mdb::readlob() 从结果集中读取 lob。传递长度 0 给 mdb::readlob() 意味着整个 lob 被读取和储存在我们前面指定的文件中。一旦任务完成了,我们可以把资源释放了。你也可以设置任何大于零的长度并且使用一个 while 循环检查 mdb::endoflob() 来读取 lob。 $mdb->readlob($blob, $data, 0);
注意你不要把这个获取函数和 bulk 获取函数像 mdb::fetchall()搞混了,因为这将在大部分 php 扩展中导致问题。在一些时候,mdb 可能能够使用 bulk 获取函数获得 lob。 如我们在这节所见,mdb 特性本身的原生数据类型集自动映射于中的原生数据类型。这保证了无论我们发送和从接收什么样的数据,它都能与使用的 rdbms 无关的使用相同的格式。如我在本节开篇已经提到的,这明显需要使用的数据类型是 mdb 预期的。这种需要被用于确保映射所耗费的代价很小。下一节将教给我们 mdb 如何辅助在中使用正确的数据类型。
使用 xml schema 文件 利用在上个段落中描述的特性,你能编写真正的独立的程序。但是 mdb 尝试向前更加迈出一步:它允许你用 xml 定义你的 schema。一个管理器把这种 schema 转换为给每种 rdbms 的必要的 sql 语句。这意味着你能对所有支持的 rdbms 使用相同的 schema。本节的例子能够在 xml_schema 目录中找到。 我们现在将从头编写一个 xml schema 文件。首先,我们必须定义一个 xml 文档。定义是包含在一个 database 标签之中的。的名字是使用 name 标签定义的。create 标签告诉管理器是否需要在它不存在的时候被创建。如果你把你的 schema 文件分割成好几个文件你你首先提交给管理器的那个文件中把 create 设置为 1。 <?xml version="1.0" encoding="iso-8859-1" ?>
<database>
<name>auth</name>
<create>1</create>
</database>
可能你已经从名 auth 猜出了这个的目的是用于储存简单的验证程序的用户数据。listing 2 定义了在其中我们能储存用户数据的表。 listing 2 <table>
<name>users</name>
<declaration>
<field>
<name>user_id</name>
<type>integer</type>
<notnull>1</notnull>
<unsigned>1</unsigned>
<default>0</default>
</field>
<field>
<name>handle</name>
<type>text</type>
<length>20</length>
<notnull>1</notnull>
<default></default>
</field>
<field>
<name>is_active</name>
<type>boolean</type>
<notnull>1</notnull>
<default>n</default>
</field>
</declaration>
</table>
如你能看到的,如使用 xml 时可以预期的,东西变得有一些冗长。不用担心:我们有一个基于浏览器的工具称为 mdb_frontend 使得这个过程更加简单。我将在这篇文章的后面谈论这个工程。可能这极其详细地表格描述的优点是非常明显。前面例子中的表格被称为 users 并且我们定义了 3 个域:类型为整数的 user_id,类型为文本的 handle 和类型为逻辑型的 is_active。记住如果你如前一节那样传递了必要的元数据 mdb 为你处理类型抽象。你还不需要 mdb 把这些类型映射为你的 rdbms 中的什么。在每个域声明中还能使用的其他标签是可选的:length,notnull,unsigned 和 default。 下一件我们现在需要做的事情是通过在 user_id 域放置恰当的索引确保 user_id 是唯一的。索引定义就在声明标签之内(listing 3)。 listing 3: <table>
<name>users</name>
<declaration>
<index>
<unique>1</unique>
<name>user_id_index</name>
<field>
<name>user_id</name>
<sorting>ascending</sorting>
</field>
</index>
</declaration>
</table>
在 listing 3 中的定义在域 user_id 中创建一个唯一的上升排序的名为 user_id_index 的索引。当然,我们可以简单地添加另外一个域标签在索引定义中指定多于一个的域。我们现在仍然没有提到的是为我们产生唯一的用户 id 的序列。 <sequence>
<name>users_user_id</name>
<start>1</start>
<on>
<table>users</table>
<field>user_id</field>
</on>
</sequence>
上一个例子非常的绕弯。一行行看过来,我们看到首先打开一个 sequence 标签,跟着一个指定序列名字的 name 标签。这之后跟着一个定义序列初始值的 start 标签。现在,我们打开一个可选的 on标签。这儿我们需要设置一个表中的指定域。这个信息是管理器用来把序列的值设置为 users 表的 user_id 域的最大值。如果 users 表是空的,作为替代使用的是 start 标签中指定的值。请注意在 start 标签中指定的值是我们调用 mdb::nextid() 返回的第一个值。 当然,你也能使用任何值初始化表。例如你可能想要用你总是想要包含在你的程序中的管理用户来初始化前面的表格。为了这么做,我们需要把一个 initialization 标签添加给 table 标签。listing 4 定义了一在另外一用 insert 标签包括的行之后的行。
'type' => 'outputfile',
'result' => $result,
'row' => 0,
'field' => 'b_data',
'binary' => 1,
'filename' => './myfile2.gif'
);
$blob = $mdb->createlob($binary_lob);
现在我们能够使用 mdb::readlob() 从结果集中读取 lob。传递长度 0 给 mdb::readlob() 意味着整个 lob 被读取和储存在我们前面指定的文件中。一旦任务完成了,我们可以把资源释放了。你也可以设置任何大于零的长度并且使用一个 while 循环检查 mdb::endoflob() 来读取 lob。 $mdb->readlob($blob, $data, 0);
注意你不要把这个获取函数和 bulk 获取函数像 mdb::fetchall()搞混了,因为这将在大部分 php 扩展中导致问题。在一些时候,mdb 可能能够使用 bulk 获取函数获得 lob。 如我们在这节所见,mdb 特性本身的原生数据类型集自动映射于中的原生数据类型。这保证了无论我们发送和从接收什么样的数据,它都能与使用的 rdbms 无关的使用相同的格式。如我在本节开篇已经提到的,这明显需要使用的数据类型是 mdb 预期的。这种需要被用于确保映射所耗费的代价很小。下一节将教给我们 mdb 如何辅助在中使用正确的数据类型。
使用 xml schema 文件 利用在上个段落中描述的特性,你能编写真正的独立的程序。但是 mdb 尝试向前更加迈出一步:它允许你用 xml 定义你的 schema。一个管理器把这种 schema 转换为给每种 rdbms 的必要的 sql 语句。这意味着你能对所有支持的 rdbms 使用相同的 schema。本节的例子能够在 xml_schema 目录中找到。 我们现在将从头编写一个 xml schema 文件。首先,我们必须定义一个 xml 文档。定义是包含在一个 database 标签之中的。的名字是使用 name 标签定义的。create 标签告诉管理器是否需要在它不存在的时候被创建。如果你把你的 schema 文件分割成好几个文件你你首先提交给管理器的那个文件中把 create 设置为 1。 <?xml version="1.0" encoding="iso-8859-1" ?>
<database>
<name>auth</name>
<create>1</create>
</database>
可能你已经从名 auth 猜出了这个的目的是用于储存简单的验证程序的用户数据。listing 2 定义了在其中我们能储存用户数据的表。 listing 2 <table>
<name>users</name>
<declaration>
<field>
<name>user_id</name>
<type>integer</type>
<notnull>1</notnull>
<unsigned>1</unsigned>
<default>0</default>
</field>
<field>
<name>handle</name>
<type>text</type>
<length>20</length>
<notnull>1</notnull>
<default></default>
</field>
<field>
<name>is_active</name>
<type>boolean</type>
<notnull>1</notnull>
<default>n</default>
</field>
</declaration>
</table>
如你能看到的,如使用 xml 时可以预期的,东西变得有一些冗长。不用担心:我们有一个基于浏览器的工具称为 mdb_frontend 使得这个过程更加简单。我将在这篇文章的后面谈论这个工程。可能这极其详细地表格描述的优点是非常明显。前面例子中的表格被称为 users 并且我们定义了 3 个域:类型为整数的 user_id,类型为文本的 handle 和类型为逻辑型的 is_active。记住如果你如前一节那样传递了必要的元数据 mdb 为你处理类型抽象。你还不需要 mdb 把这些类型映射为你的 rdbms 中的什么。在每个域声明中还能使用的其他标签是可选的:length,notnull,unsigned 和 default。 下一件我们现在需要做的事情是通过在 user_id 域放置恰当的索引确保 user_id 是唯一的。索引定义就在声明标签之内(listing 3)。 listing 3: <table>
<name>users</name>
<declaration>
<index>
<unique>1</unique>
<name>user_id_index</name>
<field>
<name>user_id</name>
<sorting>ascending</sorting>
</field>
</index>
</declaration>
</table>
在 listing 3 中的定义在域 user_id 中创建一个唯一的上升排序的名为 user_id_index 的索引。当然,我们可以简单地添加另外一个域标签在索引定义中指定多于一个的域。我们现在仍然没有提到的是为我们产生唯一的用户 id 的序列。 <sequence>
<name>users_user_id</name>
<start>1</start>
<on>
<table>users</table>
<field>user_id</field>
</on>
</sequence>
上一个例子非常的绕弯。一行行看过来,我们看到首先打开一个 sequence 标签,跟着一个指定序列名字的 name 标签。这之后跟着一个定义序列初始值的 start 标签。现在,我们打开一个可选的 on标签。这儿我们需要设置一个表中的指定域。这个信息是管理器用来把序列的值设置为 users 表的 user_id 域的最大值。如果 users 表是空的,作为替代使用的是 start 标签中指定的值。请注意在 start 标签中指定的值是我们调用 mdb::nextid() 返回的第一个值。 当然,你也能使用任何值初始化表。例如你可能想要用你总是想要包含在你的程序中的管理用户来初始化前面的表格。为了这么做,我们需要把一个 initialization 标签添加给 table 标签。listing 4 定义了一在另外一用 insert 标签包括的行之后的行。
