最新消息:博客断断续续关停过,感谢保留友链的友们,以后本博客可能会比较少更新,但是会一直开下去,并保持稳定性。

php连接和操作PostgreSQL数据库的类

技术交流 东子 2281次浏览 2 条评论 无图浏览

在本文中,我们将介绍如何在自己的PHP应用程序中使用PostgreSQL数据库数据库和事务。

一、概述

给我们的PHP应用程序集成PostgreSQL的事务功能并非什么难事,只要在适当的时间启动PostgreSQL的事务,然后当所有操作都完成的时候提交事务或者回滚就行了。下面我们介绍利用 PHP连接PostgreSQL数据库并且进行事务处理的一般方式。通过这个示例程序,能够帮您熟悉为应用程序集成PostgreSQL数据库和事务功能的一般过程。

二、创建PostgreSQL类

虽然PostgreSQL为PHP提供了相应的函数库,但是您最好不要直接从自己的脚本中调用这些函数,相反地,您应该将它们封装到一个类中,然后使用这个类与数据库进行交互,其中提供了一个这样的类,它实现了我们所需的一些基本功能。

以下代码是 PostgreSQL的数据层封装类。

<?php

/**
 * PostgreSQL 操作类
 * Class PostgreSQL
 */
class PostgreSQL {
    private $linkid; // PostgreSQL连接标识符
    private $host; // PostgreSQL服务器主机
    private $port; // PostgreSQL服务器主机端口
    private $user; // PostgreSQL用户
    private $passwd; // PostgreSQL密码
    private $db; // Postgresql数据库
    private $result; // 查询的结果
    private $querycount; // 已执行的查询总数

    /**
     * 初始化$host、$user、$passwd和$db字段
     * @param $host
     * @param $port
     * @param $db
     * @param $user
     * @param $passwd
     */
    public function __construct($host, $port ,$db, $user, $passwd) {
        extension_loaded('pgsql') or die('您的 PHP 环境没有安装 PostgreSQL 扩展,这对 PHP 来说是必须的。');
        $this->host = $host;
        $this->port = $port;
        $this->user = $user;
        $this->passwd = $passwd;
        $this->db = $db;
    }

    /**
     * 连接Postgresql数据库
     */
    public function connect(){
        try{
            $this->linkid = @pg_connect("host=$this->host port=$this->port dbname=$this->db
user=$this->user password=$this->passwd");
            if(!$this->linkid){
                throw new Exception("Could not connect to PostgreSQL server.");
            }
        }
        catch (Exception $e) {
            die($e->getMessage());
        }
    }

    /**
     * 执行数据库查询
     * @param $query
     * @return resource
     */
    public function query($query){
        try{
            $this->result = @pg_query($this->linkid, $query);
            if(! $this->result)
                throw new Exception("The database query failed.");
        }
        catch (Exception $e){
            echo $e->getMessage();
        }
        $this->querycount++;
        return $this->result;
    }

    /**
     * 确定受查询所影响的行的总计
     * @return int
     */
    public function affectedRows(){
        $count = @pg_affected_rows($this->linkid);
        return $count;
    }

    /**
     * 确定查询返回的行的总计
     * @return int
     */
    public function numRows(){
        $count = @pg_num_rows($this->result);
        return $count;
    }

    /**
     * 将查询的结果行作为一个对象返回
     * @return object
     */
    public function fetchObject(){
        $row = @pg_fetch_object($this->result);
        return $row;
    }

    /**
     * 将查询的结果行作为一个索引数组返回
     * @return array
     */
    public function fetchRow(){
        $row = @pg_fetch_row($this->result);
        return $row;
    }

    /**
     * 将查询的结果行作为一个关联数组返回
     * @return array
     */
    public function fetchArray(){
        $row = @pg_fetch_array($this->result);
        return $row;
    }

    /**
     * 返回在这个对象的生存期内执行的查询总数。
     * 这不是必须的,但是您也许会感兴趣。
     * @return mixed
     */
    public function numQueries(){
        return $this->querycount;
    }

    /**
     * 启动事务
     */
    public function begin(){
        $this->query('START TRANSACTION');
    }

    /**
     * 事务提交
     */
    public function commit(){
        $this->query('COMMIT');
    }

    /**
     * 事务回滚
     */
    public function rollback(){
        $this->query('ROLLBACK');
    }

    /**
     * 在当前事务里定义一个新的保存点
     * @param $savepointname
     */
    public function setsavepoint($savepointname){
        $this->query("SAVEPOINT $savepointname");
    }

    /**
     * 回滚到一个保存点
     * @param $savepointname
     */
    public function rollbacktosavepoint($savepointname){
        $this->query("ROLLBACK TO SAVEPOINT $savepointname");
    }
}

三、数据库的连接和操作例子

//载入类文件
require_once('../PostgreSQL.class.php');
//实例化pgsql类
$pgsqldb = new PostgreSQL("localhost","5432","webuser","root","root");
//连接到PostgreSQL数据库
$pgsqldb->connect();
if(!$pgsqldb){ 
	die("无法连接到PostGreSQL数据库!");
}else{
	echo "成功连接!";
	$query = "select name from ex where gid = 2";
	$result = $pgsqldb->query($query);
	$row = $pgsqldb->fetchRow();
	echo $row[0];
}

对于其中的事务方法,因为这些命令通常不会出错,所以我们没有引入异常处理,从而使我们的示例代码更加简洁。

四、使用事务的注意事项

使用事务时,有许多事项需要注意,例如:

1、只有当整个过程都必须全部成功时才有必要使用事务。举例来说,向购物车添加产品是一个关键的过程,但是浏览可用的产品则不是。

2、PostgreSQL允许您回滚数据定义语句,即任何用于创建、修改或者丢弃一个数据库对象的语句,这里所说的数据库对象包括表、索引、触发器、函数、视图,等等。

3、事务不能嵌套。在COMMIT或者ROLLBACK命令之前提交多个START TRANSACTION命令是没有效果的。然而,您却可以使用保存点来取得嵌套事务所提供的功能。

当建立数据库驱动的应用程序的时候,谨慎的使用数据库的事务功能将为您带来巨大的好处。

声明:欢迎转载,转载请注明来源:东子博客。  本文地址链接:http://blog.kilvn.com/php-postgresql-class/

发表我的评论
取消评论
表情 每日打卡 贴图 链接 私密消息

Hi,您需要填写昵称和邮箱!

  • 昵称
  • 邮箱
  • 网址

网友最新评论 (2)

  1. Roogle2015-12-04 14:06 定期来的脚迹回复
    • 东子2015-12-07 22:22 我去,你博客好清新!回复