| 将你的网站从MySQL改为PostgreSQL |
|
| |
|
数以一个数组的形式返回结果集的一行。这个值可以通过一个从0开始的数组值获得。(即$field1 = $var[0];)。同样,这个函数保存了一个内部的计数器以保证每次调用时可以返回下一行。 mysql_fetch_array($result) 这个函数和另外两个fetch函数基本相同,只是它以一个联合数组的形式返回一个行($field1 = $var["field1"];)。 Postgres pg_numrows($result) 与对应的mysql_num_rows($result)完全一样 pg_cmdtuples($result) 与对应的mysql_affected_rows($result)完全一样 pg_fetch_object($result, $row) 获得结果集中的指定行。必须使用$row</CODE>参数,而且没有一个内部的计数器。除此之外,它与mysql_fetch_object($result)完全相同。 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是一个明智的选择。转换工作肯定会耗费时间和精力,但是经过这些努力后,你的站点可以拥有一个更完美的数据库系统。就象我一样,你也会觉得这项工作是有意义的!Linux联盟收集整上一页 [1] [2]
 |
频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。
| 原始作者:佚名 |
录入时间:2007-1-3 3:34:08 |
| 信息来源:不详 |
投稿信箱:itqoo@126.com |
|
|
 |
|
|
|
| 教程录入:itqoo 责任编辑:itqoo |
|
上一个教程: 利用图形界面从SQL导入导出到MySQL
下一个教程: Oracle与SQL Server之间的数据迁移 |
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |