我写的一个PHP连接 数据库的类 1.2 (PostgreSQL版)

 
<?php
/**
 * Name:        pgsql.class.php
 * Author:      Jeff Jing
 * Description: A class for PostgreSQL connection of PHP
 * DateTime:    2009-05-26 16:33:06
 * Update:      2009-10-02 23:03:45
 * Version:     1.2.0
 */
 // 保留署名权,违者追究责任
 /** version 1.2.0 Log:
   1. 修改了分页查询的函数,改为 getPg(); 返回的数组 $arr  $arr['data'] 为查询的那一页的数据 $arr['index'] 为页码数组
   2. 新增方法getOne() 返回单行查询的结果
   3. 新增方法 getSeq() 和 setSeq() 返回当前序列的值 和 设置当前序列的值
  */
 
require_once("Util/exceptions.php");
 
class model{
 private $conn;
 function __construct($pConnect=false){
  $host='localhost';
  $port='5432';
  $user='mypost';
  $password='jeff';
  $dbname='demo';
  $this->conn=pg_connect("host=$host dbname=$dbname user=$user password=$password port=$port")or die("数据库连接失败"); #
        if($pConnect){
    $this->conn=pg_pconnect("host=$host dbname=$dbname user=$user password=$password port=$port");
  }          
       
 }
 function __desrtruct(){
     if($this->conn){
         pg_close($this->conn); // 对象销毁的时候关闭连接
     }   
 }
 function Query($sql){
     # Discription:根据查询语句,返回一个二维数组
     # @ param $sql: SQL语句
  @$result=pg_query($sql);
  try{   ## 如果SQL语句错误的话$result为布尔false,抛出SQL语句错误的异常
   if(!$result){
    throw new SQLErrorException("SQL语句有误,[".$sql."]");
   }
  }catch (SQLErrorException $see){
   $see->showMsg();
  }
  $arr=array();
   while($row=pg_fetch_assoc($result)){ #利用循环将查询结果填充到二维数组
       array_push($arr,$row);   
   }
   return $arr;
 }
 public function getOne($sql){
     # Discription:根据查询语句,返回一个一维数组,如查询结果有多行,则返回第一行
     # @ param $sql: SQL语句
  @$result=pg_query($sql);
  try{   ## 如果SQL语句错误的话$result为布尔false,抛出SQL语句错误的异常
   if(!$result){
    throw new SQLErrorException("SQL语句有误,[".$sql."]");
   }
  }catch (SQLErrorException $see){
   $see->showMsg();
  }
  $arr=array();
  $arr=pg_fetch_assoc($result);  # 取第一行结果填充到数组
  
   return $arr; 
 }
 public function getPg($sql,$totalSql,$url,$curPg,$order='',$num=10){
     ## Description:  分页函数,返回查询页码的 数据 以及页码字符串
  # @ $sql        查询语句,不加 limit 限制的
  # @ $totalSql   查询页码的语句,将查询值保存到sql到 total 中
  # @ $url   显示分页结果的URL
  # @ $curPg  当前页码
  # @ $order      手工写好的 Order by 语句
  # @ $num     每页记录的条数,默认为 10
  # 返回key-value形式数组  $arr["pgIndex"] 页码数组  $arr["data"] 查询结果数据
     $arr=array();
  $pg=$this->getOne($totalSql);
  if($num<0){
     echo ("每页的记录条数不能小于1");
     exit;
  }
  if($pg){
      $rcdNum=$pg['total']; // 记录的条数 , 查询记录条数的语句 必须 将条数的字段名select 为 total
   $pgNum=ceil($rcdNum/$num);// 页数
   $str=""; // 页码字符串
   $str.=("<a href='".$url."page=1'><Font face=webdings>9</font></a>&nbsp;&nbsp;");
   $bf=$curPg<$pgNum?$curPg:$pgNum;
   if($curPg-2>=0){
    if($curPg+10>$pgNum){
     for($i=$pgNum-9;$i<=$pgNum;++$i){
        if($i==$curPg){
         $str.=("<a href='".$url."?page=".$i."'><b>".$i."</b></a>&nbsp;&nbsp;");
        }else{
         $str.=("<a href='".$url."?page=".$i."'>".$i."</a>&nbsp;&nbsp;");
        }    
     }
    }else{
     for($i=$curPg-2;$i<$curPg+8;++$i){
        if($i==$curPg){
         $str.=("<a href='".$url."?page=".$i."'><b>".$i."</b></a>&nbsp;&nbsp;");
        }else{
         $str.=("<a href='".$url."?page=".$i."'>".$i."</a>&nbsp;&nbsp;");
        }
     }   
    }
   }else{
      for($i=1;$i<=10;++$i)   {
      if($i==$curPg){
       $str.=("<a href='".$url."?page=".$i."'><b>".$i."</b></a>&nbsp;&nbsp;");
      }else{
       $str.=("<a href='".$url."?page=".$i."'>".$i."</a>&nbsp;&nbsp;");
      }
      }
   }
   if($pgNum>1){
      $str.=("<a href='".$url."?page=".$pgNum."'>...".$pgNum."<Font face=webdings>:</font></a>&nbsp;&nbsp;");
   }
   $offset=($curPg-1)*$num;
   if($order){
    $rs=$this->Query($sql.' '.$order." limit {$num} offset {$offset} ");
   }else{
    $rs=$this->Query($sql." limit {$num} offset {$offset} ");
   }
   
   $arr["pgIndex"]=$str;
   $arr["data"]=$rs;
   
   return $arr;   
   
  }
  return null;
 }
 public function getSeq($seq){
     # 获取某个序列的当前值,用于获取刚插入数据库的自动递增字段的值
  # @ param $seq 自增字段的序列
      $query="select currval('{$seq}') as seq ;";
   $rs=$this->getOne($query);
   return $rs['seq'];
 }
 public function setSeq($seq,$id){
      # 设置某个序列的起始值
   # @ param $seq 序列的名字
   # @ param $id  序列的起始值
      $query="alter SEQUENCE {$seq} start with {$id} ";
   $rs=$this->affectRowQuery($query);
   if($rs>0){
      return true;
   }
   return false;  
 }
 public function affectRowQuery($sql){ 
     # 返回查询影响行数
  # @ param $sql SQL语句
        //echo $sql;
  $re=pg_query($this->conn,$sql);
  //var_dump($re);
        try{
         if($re===false){
          throw new SQLErrorException("SQL语句有误,[".$sql.']');
         }
        }catch (SQLErrorException $see){
         $see->showMsg();
        }
  return pg_affected_rows($re);
 }
 public function NumQuery($sql){ 
     # 返回查询得到的结果行数
  # @ param $sql SQL语句
  @$result=pg_query($sql);
  try{   ## 如果SQL语句错误的话$result为布尔false,抛出SQL语句错误的异常
   if(!$result){
    throw new SQLErrorException("SQL语句有误,[".$sql."]");
   }
  }catch (SQLErrorException $see){
   $see->showMsg();
  }
  return pg_num_rows($result);
 }
 function insert($table,$arr,$keys=''){
        # Description: 从数组中向数据表添加数据,成功返回true,失败返回false
  # @ param $table 要操作的数据表
  # @ param $arr 数组,必须以字段名为下标
  # @ param $keys  数据表主键数组,推荐用以逗号分开的字符串
  if(empty($table) || empty($arr)){
     return $this->paramError;
  }
  ### 查询要插入的记录是否已存在
  
  if($keys){
      $keyArr=array();
      $ext="select * from ".$table." where ";
      $where='';
      if(is_string($keys)){
       $keyArr=explode(',',$keys);
      }
      if(is_array($keys)){
       $keyArr=$keys;
      }
         foreach ($keyArr as $key){
       $where.=(" $key='".$arr[$key]."' and");
      }
      $where=substr($where,0,strlen($where)-4);
      //echo  $arr['usr'];
      $ext.=$where;
      //echo $ext;
      $re=$this->Query($ext);
   if($re){
      return "exists";
   }
      //echo "<br>Affected".$row;;
            
  }
       
  ###END查询是否存在####
  
  $query=" INSERT INTO  ".$table; ## 拼接SQL语句
  $cols='';
  $values='';      
  foreach ( $arr as $col=>$value){
   $cols.=($col.',');       // 获取sql语句要插入的字段
   $values.=("'".$value."',"); # 获取sql语句要插入的字段值     
  }
  $cols='('.substr($cols,0,strlen($cols)-1).')';
  $values='('.substr($values,0,strlen($values)-1).')';
  $query.=$cols.' VALUES '.$values;  # 生成查询语句
  //echo $query;
  $num=$this->affectRowQuery($query);
  //echo $num;
  if($num==1){
   return "succeed";
  }else{
   return "fail";
  }
 }
 
 function update($table,$arr,$where=''){
        # Discript: 根据数组修改数据表的数据,如果执行成功,返回影响行数,否则返回false
  # @ param $table 要操作的数据表
  # @ param $arr 数组,必须以字段名为下标
  # @ $where UPDATE语句中的where子句
  $query="UPDATE ".$table." set ";
  $set='';
  foreach($arr as $col=>$value){
      $set.=(' '.$col." = '".$value."', ");
  }
  $set=substr($set,0,strlen($set)-2); # 去掉最后的逗号
  $query.=($set ." ".$where);
  //echo $query;
  $num=$this->affectRowQuery($query);
  var_dump($num);
  if($num<=0){
      return "fail";
  }else{
      return "succeed";
  }
 }
 public function begin(){
     $this->affectRowQuery("begin;");  // Begin transAction
  $this->affectRowQuery("savepoint sp"); // Create savepoint
 }
    public function commit(){
  $this->affectRowQuery("commit");
 }
 public function rollback(){
     $this->affectRowQuery("rollback to savepoint sp");
 } 
}
?>
 
源代码在附件中,51cto 不支持.php扩展名的附件,无奈只好改为 .txt

你可能感兴趣的:(PHP,数据库,类,PostgreSQL,休闲)