- ·上一篇文章:通过ADO调用Access数据库和COM程序
- ·下一篇文章:PHP中通过ADO调用Access数据库
PEAR MDB数据库抽象层一次编写—随处运行
listing 4 <table>
<name>users</name>
<initialization>
<insert>
<field>
<name>user_id</name>
<value>1</value>
</field>
<field>
<name>handle</name>
<value>default</value>
</field>
<field>
<name>is_active</name>
<value>y</value>
</field>
</insert>
</initialization>
</table>
如你从上个例子中能看到的那样,所有我们需要做的就是给表的每个域设定值。我们现在已经知道了必要的基础知识来创建一个 mdb 的 xml schema。下一步是把这个 schema 文件传递给 mdb 管理器。 $manager = new mdb_manager;
$input_file = 'auth.schema';
// we do not have to connect to a specify a specific database at this time
$dsn = "mysql://$user:$pass@$host";
$manager->connect($dsn);
$manager->updatedatabase($input_file, $input_file. '.before');
我们现在有了一个新的名字叫 auth 的,它有一个表叫 users。在域 user_id 有一个索引。而且在表中还有一行。我们还有一个序列称为 users_user_id,它将被初始化为 1。因此序列中的下一个值就是 2。最后,schema 的一个拷贝以名字auth.schema.before 被创建。这是因为我们给 mdb_manger::updatedatabase() 传递了可选的第二个参数。在下一节我们将看到为什么要创建这个拷贝。 所有这些都非常令人惊奇但是它变得更好。许多情况下程序需要在某些地方作出改变。例如我们可能决定需要把表的名字从 users 变成 people。我们可能还需要增加一个域 pwd 来储存密码域(请检查 textbox 的保留字)。
保留字 我们没有称那个域为 password 的原因是那是 interbase 中一个域名的保留字。因为我们需要 rdbms 独立,mdb 管理器要么给出一个警告要么在 fail_on_invalid_names 选项被设置为真的时候(这是缺省值)失败。 在过去的时候,你可能现在正处于把你所有已经有的东西变成这种新的 schema 的痛苦之中。但是由于 mdb 这些工作能够自动完成。在 listing 5 中是我们对我们的表格定义进行的修改: listing 5 <table>
<name>people</name>
<was>users</was>
<declaration>
<field>
<name>pwd</name>
<type>text</type>
<length>32</length>
<notnull>1</notnull>
<default></default>
</field>
</declaration>
</table>
现在我们想要管理器来作出必要的改变,但是在此之前我像提一下可能的陷阱。因为我们把表从 users 更名为 people,我们还需要把所有对原来名字的引用进行更改,比如我们建立的序列。在 on 标签中的索引需要更改为指向 people 表。为了达到这个目的,我们把 shcema 的新旧版本传递给管理器。这酒是为什么我们在第一次调用 mdb_manager::updatedatabase() 时我们创建一个 .before 文件的原因。这确保了我们有一个旧版本的 shcema 来与新的版本进行比照。 $input_file = 'auth.schema';
$manager->updatedatabase($input_file, $input_file.'.before');
所有的就是这样!users 表现在称为 people 并且我们也有了一个 pwd 域。 我现在要看看 xml schema 格式的最后一个特性。如果你想要编程性的使用管理器,这个特性尤其重要。假设你有好几个有相同验证程序运行在你的服务器的客户。 每个客户有一个服务器运行在这个服务器有相同的 schema 只有微小的区别:的名字。可能为每个客户单独保存 schema 文件是可行的因为更新周期可能不是一样的,这不是我们例子验证程序的情况。这儿所有的客户同时更新。xml schema 文件允许我们为此可以使用变量。 <?xml version="1.0" encoding="iso-8859-1" ?>
<database>
<name><variable>name</variable></name>
</database>
我们现在在运行时设置变量为任意我们需要的东西。 foreach($clients as $name) {
$variables = array('name' => $name)
$manager->updatedatabase($input_file, $input_file.'.before', $variables);
}
xml schema 管理是 mdb 提供的抽象概念的另外一个非常重要的部分。它使得我们保持我们的 schema 定义与特定的 rdbms 无关。但是使用这个格式还确保了使用正确的原生数据类型因而 mdb 能够正确地映射它的原生数据类型。最后,因为数据是基于 xml 的,编写产生或者读取 xml schema 文件的工具要容易一些。
听起来不错但是我的应用程序已经使用了…… 大部分读者可能发现它们处于这样的境地——他们已经有了大量运行于其他抽象层的程序。由于 mdb 的出身,大部分 pear db 的用户应当发现 mdb 感觉上非常类似,因为 mdb 的 api 是基于 pear db 的。metabase 用户应当发现他们所有偏爱的功能都在 mdb 中有对应的东西。xml schema 格式和 metabase 中的是一摸一样的。一个完全的指导来引导你把已经写好的程序移植到 mdb 中超出了本文的范围,但是我将利用这个机会给一些提示。如果你有任何具体的问题,放心的发信来询问我。 为了把你的 pear db 程序移植到 mdb,最好的起点是 pear wrapper。你能使用 pear wrapper 来运行你的程序。wrapper 当然增加了一些额外负担,因而你可能有些想要移植到原生的
<name>users</name>
<initialization>
<insert>
<field>
<name>user_id</name>
<value>1</value>
</field>
<field>
<name>handle</name>
<value>default</value>
</field>
<field>
<name>is_active</name>
<value>y</value>
</field>
</insert>
</initialization>
</table>
如你从上个例子中能看到的那样,所有我们需要做的就是给表的每个域设定值。我们现在已经知道了必要的基础知识来创建一个 mdb 的 xml schema。下一步是把这个 schema 文件传递给 mdb 管理器。 $manager = new mdb_manager;
$input_file = 'auth.schema';
// we do not have to connect to a specify a specific database at this time
$dsn = "mysql://$user:$pass@$host";
$manager->connect($dsn);
$manager->updatedatabase($input_file, $input_file. '.before');
我们现在有了一个新的名字叫 auth 的,它有一个表叫 users。在域 user_id 有一个索引。而且在表中还有一行。我们还有一个序列称为 users_user_id,它将被初始化为 1。因此序列中的下一个值就是 2。最后,schema 的一个拷贝以名字auth.schema.before 被创建。这是因为我们给 mdb_manger::updatedatabase() 传递了可选的第二个参数。在下一节我们将看到为什么要创建这个拷贝。 所有这些都非常令人惊奇但是它变得更好。许多情况下程序需要在某些地方作出改变。例如我们可能决定需要把表的名字从 users 变成 people。我们可能还需要增加一个域 pwd 来储存密码域(请检查 textbox 的保留字)。
保留字 我们没有称那个域为 password 的原因是那是 interbase 中一个域名的保留字。因为我们需要 rdbms 独立,mdb 管理器要么给出一个警告要么在 fail_on_invalid_names 选项被设置为真的时候(这是缺省值)失败。 在过去的时候,你可能现在正处于把你所有已经有的东西变成这种新的 schema 的痛苦之中。但是由于 mdb 这些工作能够自动完成。在 listing 5 中是我们对我们的表格定义进行的修改: listing 5 <table>
<name>people</name>
<was>users</was>
<declaration>
<field>
<name>pwd</name>
<type>text</type>
<length>32</length>
<notnull>1</notnull>
<default></default>
</field>
</declaration>
</table>
现在我们想要管理器来作出必要的改变,但是在此之前我像提一下可能的陷阱。因为我们把表从 users 更名为 people,我们还需要把所有对原来名字的引用进行更改,比如我们建立的序列。在 on 标签中的索引需要更改为指向 people 表。为了达到这个目的,我们把 shcema 的新旧版本传递给管理器。这酒是为什么我们在第一次调用 mdb_manager::updatedatabase() 时我们创建一个 .before 文件的原因。这确保了我们有一个旧版本的 shcema 来与新的版本进行比照。 $input_file = 'auth.schema';
$manager->updatedatabase($input_file, $input_file.'.before');
所有的就是这样!users 表现在称为 people 并且我们也有了一个 pwd 域。 我现在要看看 xml schema 格式的最后一个特性。如果你想要编程性的使用管理器,这个特性尤其重要。假设你有好几个有相同验证程序运行在你的服务器的客户。 每个客户有一个服务器运行在这个服务器有相同的 schema 只有微小的区别:的名字。可能为每个客户单独保存 schema 文件是可行的因为更新周期可能不是一样的,这不是我们例子验证程序的情况。这儿所有的客户同时更新。xml schema 文件允许我们为此可以使用变量。 <?xml version="1.0" encoding="iso-8859-1" ?>
<database>
<name><variable>name</variable></name>
</database>
我们现在在运行时设置变量为任意我们需要的东西。 foreach($clients as $name) {
$variables = array('name' => $name)
$manager->updatedatabase($input_file, $input_file.'.before', $variables);
}
xml schema 管理是 mdb 提供的抽象概念的另外一个非常重要的部分。它使得我们保持我们的 schema 定义与特定的 rdbms 无关。但是使用这个格式还确保了使用正确的原生数据类型因而 mdb 能够正确地映射它的原生数据类型。最后,因为数据是基于 xml 的,编写产生或者读取 xml schema 文件的工具要容易一些。
听起来不错但是我的应用程序已经使用了…… 大部分读者可能发现它们处于这样的境地——他们已经有了大量运行于其他抽象层的程序。由于 mdb 的出身,大部分 pear db 的用户应当发现 mdb 感觉上非常类似,因为 mdb 的 api 是基于 pear db 的。metabase 用户应当发现他们所有偏爱的功能都在 mdb 中有对应的东西。xml schema 格式和 metabase 中的是一摸一样的。一个完全的指导来引导你把已经写好的程序移植到 mdb 中超出了本文的范围,但是我将利用这个机会给一些提示。如果你有任何具体的问题,放心的发信来询问我。 为了把你的 pear db 程序移植到 mdb,最好的起点是 pear wrapper。你能使用 pear wrapper 来运行你的程序。wrapper 当然增加了一些额外负担,因而你可能有些想要移植到原生的
