<?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> ");
$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> ");
}else{
$str.=("<a href='".$url."?page=".$i."'>".$i."</a> ");
}
}
}else{
for($i=$curPg-2;$i<$curPg+8;++$i){
if($i==$curPg){
$str.=("<a href='".$url."?page=".$i."'><b>".$i."</b></a> ");
}else{
$str.=("<a href='".$url."?page=".$i."'>".$i."</a> ");
}
}
}
}else{
for($i=1;$i<=10;++$i) {
if($i==$curPg){
$str.=("<a href='".$url."?page=".$i."'><b>".$i."</b></a> ");
}else{
$str.=("<a href='".$url."?page=".$i."'>".$i."</a> ");
}
}
}
if($pgNum>1){
$str.=("<a href='".$url."?page=".$pgNum."'>...".$pgNum."<Font face=webdings>:</font></a> ");
}
$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