- ·上一篇文章:通过ADO调用Access数据库和COM程序
- ·下一篇文章:PHP中通过ADO调用Access数据库
PEAR MDB数据库抽象层一次编写—随处运行
在 mdb 中这个方法叫 mdb::gettextvalue()。不同之处是 mdb 给每种前面所列的数据类型都提供了这样的函数。因而我们也能够把 $timeout 转换为正确的格式。 // convert $timeout to the mdb timestamp format
$timeout = mdb_date::unix2mdbstamp($timeout);
// select query showing how the datatype conversion works
$query = 'select createtime, user_id from sessions';
$query .= ' where session = '.$mdb->gettextvalue($session);
$query .= ' and lastaccess < '.$mdb->gettimestampvalue($timeout);
为了作个演示,让我们假定我仅仅想要获取第一行。mdb::queryrow() 获得第一行,它释放结果集并且返回其内容,因而它正是我们所要的。 $result = $mdb->queryrow($query);
但是不同的 rdbms 返回像日期这样的数据时用的格式是不同的。因此,如果我们然后要对一些数据进行计算,不管选择的 rdbms 是什么,把数据以相同的格式返回是重要的。这个可以由 mdb 半自动地完成。你所有需要做的是告诉你的结果列将是什么样的类型,mdb将处理转换的工作。最简单的办法是把这样的信息传递给查询函数。 $types = array('timestamp', 'integer');
$result = $mdb->queryrow($query, $types);
这告诉 mdb 结果集的第一列类型是 'timestamp' 以及第二列是'integer'。所有查询函数能够接受这样的元信息作为可选的参数。数据还能事后用 mdb::setresulttypes() 来设置。取决于数据获取于的,它然后将被相应的转换返回的数据。mdb 内部的 timestamps 的数据格式是遵循 iso 8601 标准的。其他像 pear::date 这样的包能够处理这种格式。mdb 还在 mdb_date 类中提供了一些数据格式转换函数,它们能够被可选的包含。 因为相当多的 rdbms 以相同的方法返回整数数据,没有必要转换整数数据。因而,为了获得稍许的性能改进你能够这么做: $types = array('timestamp');
$result = $mdb->queryrow($query, $types);
这样只有结果集的第一列会被转换。当然,如果 mdb 用于返回整数不同的,这可能成为一个问题。然而,稍许的性能改善可能并不值得冒这个风险。但是再一次的,它显示了这些特性的使用仅仅是供选择的。 listing 1 展示了一个使用预准备的查询的例子。如果你必须运行大量查询而唯一的差别是数据传递给,但是查询的结构还是一样的,这些能够相当的方便。高级的能够在内存中储存解析好的查询来加速性能。 listing 1 $alldata = array(
array(1, 'one', 'un'),
array(2, 'two', 'deux'),
array(3, 'three', 'trois'),
array(4, 'four', 'quatre')
); $p_query = $mdb->preparequery('insert into numbers values (?,?,?)');
$param_types = array('integer', 'text', 'text'); foreach ($alldata as $row) {
$mdb->execute($p_query, null, $row, $param_types);
}
在 $alldata 中储存的所有四个数组将用于 execute 语句。数据将自动被转换为正确的格式。因为这是一个插入语句,mdb::execute() 的第二个参数被设置为 null 因为我们将没有任何结果列需要我们设置数据类型。 在支持的数据类型中还有 lob (大对象),它使得我们能够在中储存文件。二进制文件储存在 blob (二进制大对象)中而且普通文本文件储存在 clob (字符大对象)中。在 mdb 中你仅仅能够使用预准备的 insert 和 update 查询储存 lob。使用 mdba::setparamblob() 或者 mdb::setparamclob() 你能够设置预准备查询的 lob 域的值。两个函数都预期传递一个 lob 对象,而它能够使用 mdb::createlob() 创建。 $binary_lob = array(
'type' => 'inputfile',
'filename' => './myfile.gif'
);
$blob = $mdb->createlob($binary_lob); $character_lob = array(
'type' => 'data',
'data' => 'this would be a very long string container the clob data'
);
$clob = $mdb->createlob($character_lob);
如你能看到的,mdb::createlob() 被传递一个关系数组。type 键的值可能是以下中的一个:data, inputfile 或者 outputfile。前两个用于你想要把 lob 写入的时候。如果你有一个储存在变量中的 lob,你应当在 需要使用 inputfile 时从文件直接读取 lob。最后,outpufile 应当在你想要从中读取 lob 时使用。取决于你是否使用数据或者 inputfile 你需要给 filename 键或者 data 键指定一个值,像上面的例子那样。现在,我们将把前面的 lob 储存到中去。 $p_query = $mdb->preparequery('insert into files (id, b_data, c_data) values (1, ?, ?)'); $mdb->setparamblob($p_query, 1 , $blob, 'b_data');
$mdb->setparamclob($p_query, 2 , $clob, 'c_data'); $result = $mdb->executequery($p_query);
为了从中获取上面的文件,我们需要首先从中选择数据并且使用 mdb::createlob() 创建 lob 对象。这次我们将设置 'type' 为 'outputfile' $mdb->query('select b_data from files where id = 1'); $binary_lob = array
$timeout = mdb_date::unix2mdbstamp($timeout);
// select query showing how the datatype conversion works
$query = 'select createtime, user_id from sessions';
$query .= ' where session = '.$mdb->gettextvalue($session);
$query .= ' and lastaccess < '.$mdb->gettimestampvalue($timeout);
为了作个演示,让我们假定我仅仅想要获取第一行。mdb::queryrow() 获得第一行,它释放结果集并且返回其内容,因而它正是我们所要的。 $result = $mdb->queryrow($query);
但是不同的 rdbms 返回像日期这样的数据时用的格式是不同的。因此,如果我们然后要对一些数据进行计算,不管选择的 rdbms 是什么,把数据以相同的格式返回是重要的。这个可以由 mdb 半自动地完成。你所有需要做的是告诉你的结果列将是什么样的类型,mdb将处理转换的工作。最简单的办法是把这样的信息传递给查询函数。 $types = array('timestamp', 'integer');
$result = $mdb->queryrow($query, $types);
这告诉 mdb 结果集的第一列类型是 'timestamp' 以及第二列是'integer'。所有查询函数能够接受这样的元信息作为可选的参数。数据还能事后用 mdb::setresulttypes() 来设置。取决于数据获取于的,它然后将被相应的转换返回的数据。mdb 内部的 timestamps 的数据格式是遵循 iso 8601 标准的。其他像 pear::date 这样的包能够处理这种格式。mdb 还在 mdb_date 类中提供了一些数据格式转换函数,它们能够被可选的包含。 因为相当多的 rdbms 以相同的方法返回整数数据,没有必要转换整数数据。因而,为了获得稍许的性能改进你能够这么做: $types = array('timestamp');
$result = $mdb->queryrow($query, $types);
这样只有结果集的第一列会被转换。当然,如果 mdb 用于返回整数不同的,这可能成为一个问题。然而,稍许的性能改善可能并不值得冒这个风险。但是再一次的,它显示了这些特性的使用仅仅是供选择的。 listing 1 展示了一个使用预准备的查询的例子。如果你必须运行大量查询而唯一的差别是数据传递给,但是查询的结构还是一样的,这些能够相当的方便。高级的能够在内存中储存解析好的查询来加速性能。 listing 1 $alldata = array(
array(1, 'one', 'un'),
array(2, 'two', 'deux'),
array(3, 'three', 'trois'),
array(4, 'four', 'quatre')
); $p_query = $mdb->preparequery('insert into numbers values (?,?,?)');
$param_types = array('integer', 'text', 'text'); foreach ($alldata as $row) {
$mdb->execute($p_query, null, $row, $param_types);
}
在 $alldata 中储存的所有四个数组将用于 execute 语句。数据将自动被转换为正确的格式。因为这是一个插入语句,mdb::execute() 的第二个参数被设置为 null 因为我们将没有任何结果列需要我们设置数据类型。 在支持的数据类型中还有 lob (大对象),它使得我们能够在中储存文件。二进制文件储存在 blob (二进制大对象)中而且普通文本文件储存在 clob (字符大对象)中。在 mdb 中你仅仅能够使用预准备的 insert 和 update 查询储存 lob。使用 mdba::setparamblob() 或者 mdb::setparamclob() 你能够设置预准备查询的 lob 域的值。两个函数都预期传递一个 lob 对象,而它能够使用 mdb::createlob() 创建。 $binary_lob = array(
'type' => 'inputfile',
'filename' => './myfile.gif'
);
$blob = $mdb->createlob($binary_lob); $character_lob = array(
'type' => 'data',
'data' => 'this would be a very long string container the clob data'
);
$clob = $mdb->createlob($character_lob);
如你能看到的,mdb::createlob() 被传递一个关系数组。type 键的值可能是以下中的一个:data, inputfile 或者 outputfile。前两个用于你想要把 lob 写入的时候。如果你有一个储存在变量中的 lob,你应当在 需要使用 inputfile 时从文件直接读取 lob。最后,outpufile 应当在你想要从中读取 lob 时使用。取决于你是否使用数据或者 inputfile 你需要给 filename 键或者 data 键指定一个值,像上面的例子那样。现在,我们将把前面的 lob 储存到中去。 $p_query = $mdb->preparequery('insert into files (id, b_data, c_data) values (1, ?, ?)'); $mdb->setparamblob($p_query, 1 , $blob, 'b_data');
$mdb->setparamclob($p_query, 2 , $clob, 'c_data'); $result = $mdb->executequery($p_query);
为了从中获取上面的文件,我们需要首先从中选择数据并且使用 mdb::createlob() 创建 lob 对象。这次我们将设置 'type' 为 'outputfile' $mdb->query('select b_data from files where id = 1'); $binary_lob = array
