技术开发 频道

用PHP的PEAR DB模块编写数据库脚本

  八、提交返回结果集的语句

  现在,我们的表建好了,还存入了一些记录,所以可以使用SELECT语句来检索数据了,代码如下所示:

$result =& $conn->query ("SELECT name, category FROM animal");
  
if (DB::isError ($result))
     die ("
SELECT failed: " . $result->getMessage () . "\n");
   printf ("Result
set contains %d rows and %d columns\n",
           $result
->numRows (), $result->numCols ());
  
while ($row =& $result->fetchRow ())
     printf ("
%s, %s\n", $row[0], $row[1]);
   $result
->free ();

  一个成功的query()调用将返回一个对象$result,它可以用于对结果集进行各种操作。能够从$result获取的信息包括,结果集的行数和列数,以及这些记录的内容等。当您不再该结果集合的时候,可以通过调用free()方法将其销毁。之后,$result就会失效,所以也不能再用它来访问结果集合了。

  九、获取结果集的其他方法

  FetchRow()有一个可选参数,该参数用来指示值的返回类型。默认情况下,fetchRow()将结果集的下一行(有时候也称为当前行)作为一个数组返回,数组中存放的是SELECT语句中指定的列所对应的内容,它们可以通过从0开始的数字索引来进行访问。它等价于使用下面所示的DB_FETCHMODE_ORDERED参数调用fetchRow():

$row =& $result->fetchRow (DB_FETCHMODE_ORDERED);

   但是FetchRow()可以返回一个关联数组,这样的话,我们就可以通过列名来引用数组元素。为此,可以传递给fetchRow()一个参数DB_FETCHMODE_ASSOC,如下所示:

while ($row =& $result->fetchRow (DB_FETCHMODE_ASSOC))
     printf ("
%s, %s\n", $row["name"], $row["category"]);

  若要将数据行作为对象来获取,可以使用DB_FETCHMODE_OBJECT模式。这样一来,我们就可以像对待对象属性那样来访问数据列的值(即记录的属性值)了,如下所示:

while ($obj =& $result->fetchRow (DB_FETCHMODE_OBJECT))
     printf ("
%s, %s\n", $obj->name, $obj->category);

  当我们调用fetchRow()时传递了覆盖了默认的数据获取模式的话,可以通过调用setFetchMode()来恢复默认的模式,如下所示:

$result =& $conn->query ($stmt1);
  
while ($row =& $result->fetchRow (DB_FETCHMODE_ASSOC)) ...
   ...
   $result
=& $conn->query ($stmt2);
  
while ($row =& $result->fetchRow (DB_FETCHMODE_ASSOC)) ...
   ...

  此外,我们还可以:

$conn->setFetchMode (DB_FETCHMODE_ASSOC);
   $result
=& $conn->query ($stmt1);
  
while ($row =& $result->fetchRow ()) ...
   ...
   $result
=& $conn->query ($stmt2);
  
while ($row =& $result->fetchRow ()) ...
   ...

  十、确定语句的类型

  通常提交语句的时候,我们都知道是否会从这个语句获得一个结果集。然而,在某种情况下这是不现实的,例如编写的脚本所执行的语句是从一个文件中随机读入的。 但是,只有知道了一个语句是否返回结果集才能进行正确的处理,为此,我们可以使用isManip()来检查语句字符串。 IsManip()是DB类的一个方法,如果语句是修改数据行的,不会返回结果集,那么它的返回值为true;如果语句是检索数据行的,会返回一个结果集,那么它的返回值为false,如下所示:

if (DB::isManip ($stmt))
   {
     #该语句将修改数据;并且不应预期返回结果集
   }
  
else
   {
     #该语句将检索数据;将返回结果集
   }
 
0
相关文章