pg_fetch_row($result, $row) 以一个数组的形式返回结果集中的指定行。同样必须使用$row参数,而且没有一个内部的计数器。
pg_fetch_array($result, $row) 与对应的mysql_fetch_array($result)基本一样,只是需要指定行,并且缺少一个内部的计数器。
有关这些函数的更详细的信息,请参看PHP.Net上的PHP文档。
PHP对MySQL和Postgres支持的最本质的不同在于对结果集的阅读。MySQL自动决定获取哪一行,而Postgres必须指定要阅读哪一行。下面是一些例子,你也可能会遇到这些问题,对于它们有两个解决方案。
//第一个普通的例子:
$rslt=mysql_query("SELECT * FROM blah", $connection_id);
while($value=mysql_fetch_array($rslt))
{
//完成数据处理工作
}
//对于Postgres,这样的代码无法执行,因为他们需要指定行号
//代码将作如下改动(如果你没有使用前面讨论的函数):
$rslt=pg_exec($connection_id, "SELECT * from blah");
$limit=pg_numrows($rslt);
for($rownum=0;$rownum<$limit;$rownum++)
{
$value=pg_fetch_array($rslt, $rownum);
//完成处理工作
}
在上面的例子中,你可以注意到Postgres的代码要稍微长一点,这是因为你必须指定行号。然而,如果你使用了你编写的自己的计数函数,问题就变得很简单了。这儿是一个添加了这样一个函数的有用的文件。请注意在postg_query()中使用了三个全局变量。
<?php
// /usr/local/lib/php/mysite/configfile.php
$hostname = "localhost";
$username = "username";
$database = "mydb";
$password = "mypasswd";
//内部计数变量
$fetch_array_counter=0;
$fetch_object_counter=0;
$fetch_row_counter=0;
//处理连接到PostgreSQL数据库的函数
function postg_connect($hostname, $username, $password, $database)
{
return pg_connect(host=$hostname, dbname=$database user=$username,
password=$password");
}
//不需要任何参数的连接
function postg_autoconnect()
{
global $hostname, $username, $password, $database;
return pg_connect(host=$hostname, dbname=$database user=$username,
password=$password");
}
//查询函数
function postg_query($query, $connection_id)
{
//将全局变量设置为0
global $fetch_array_counter, $fetch_row_counter, $fetch_object_counter;
$fetch_array_counter=$fetch_row_counter=$fetch_object_counter=0;
return pg_exec($connection_id, $query);
}
//pg_fetch_array()置换
function postg_fetch_array($rslt)
{
global $fetch_array_counter;
$fetch_array_counter++;
//计数器加一
return pg_fetch_array($rslt, $fetch_array_counter);
}
//pg_fetch_row()置换
function postg_fetch_row($rslt)
{
global $fetch_row_counter;
$fetch_row_counter++;
//计数器加一
return pg_fetch_row($rslt, $fetch_row_counter);
}
//pg_fetch_object()置换
function postg_fetch_object($rslt)
{
global $fetch_object_counter;
$fetch_object_counter++;
//计数器加一
return pg_fetch_object($rslt, $fetch_object_counter);
}
?>
当然,如果你在同一个循环中同时对两个结果集进行操作,上面的函数将无法正常地工作,因为它们只使用了一个内部的计数器。如果因为某种原因,你需要同时阅读几个结果集,你将不得不使用传统的Postgres方法。
另一个你可能遇到的问题是在Postgres中没有与MySQL中mysql_insert_id()相应的函数,这个函数反映最后的INSERT查询的索引值。PHP文档往往会让读者误以为pg_getlastoid()会完成这项工作,但是实际情况并不是这样。缺少这一样一个函数并不一个无法逾越的障碍,你可以利用Postgres的SEQUENCE系统来实现这样的功能。
幸运的是,要获得最后的ID是相当容易的。你可以通过SQL获得Sequence信息,因此你可以用这个语句来实现mysql_insert_id()的功能:
function postg_insert_id($tablename, $fieldname)
{
global connection_id;
$result=pg_exec($connection_id, "SELECT last_value FROM ${tablename}_
${fieldname}_seq");
$seq_array=pg_fetch_row($result, 0);
return $seq_array[0];
}
因为Postgres使用了一个特别的命名系统来命名序列,我上面建立的这个函数需要指定表名和字段名。调用这个函数,会返回你的表中的任意SERIAL字段的最后一个序列值,即使在表中有不止一个这样的字段。
经过上面的这些处理后,你已经可以在你的MySQL站点上成功地运行PostgreSQL了。然而,这仅仅是第一步;如果你想了解更多,继续看下去,你会看到一些有用的PostgreSQL的资源。
更进一步的资源
从PostgreSQL非FAQ文档站点你可以看到最初的和最重要的PostgreSQL资源。这个有价值的资源可以向你提供大量的书籍、参考、技术参考甚至于具体的工作。它同样会涉及将后端数据库从MySQL 改为Postgres,此外对于使用PostgreSQL的其它问题它也可以给你帮助。
另一个有价值的PostgreSQL提供的资源是PostgreSQL交互文档。其中涉及到使用PostgreSQL的很多问题。
Xach Beane,因为其在The GIMP(一种图形处理软件)上的工作而著名,他也编写了关于将MySQL dump转换为Postgres dump的书写一个脚本。他的程序可以更为全面地处理这些问题。不过,对这些问题的处理并不是十分完美的,因此你得小心地使用它。
Dobrica Pavlinusic也编写了一个程序以处理从MySQL到Postgres的转换。同样得提醒你这个程序的处理仍然不是十分完美的,因此还是少不了象我们上面所讨论的手工的修改。
从这儿你可以找到一个非常完全的PostgreSQL&PHP指南。它会从安装开始介绍PostgreSQL的使用。这个指南非常值得初学者阅读。
Bruce Momjohan编写了一本关于PostgreSQL的名为PostgreSQL: Introduction and Concepts的书,已由Addison Wesley出版。你甚至还可以在线阅读!
最后,OpenDocs也出版了实用PostgreSQL。这本书在2001年十月份出版,你可以从the OpenDocs Linuxports.com站点阅读。
将你的站点的后端数据库从MySQL改为PostgreSQL是一个明智的选择。转换工作肯定会耗费时间和精力,但是经过这些努力后,你的站点可以拥有一个更完美的数据库系统。就象我一样,你也会觉得这项工作是有意义的!
![]() |

