初学PHP,写了个通用的带事务的数据库操作类,自己测了下,没发现问题,请大家检查下.<?php
/**
 * DBHelper
 * 通用数据库操作类
 */
class DBhelper {
var $url;
var $user;
var $pwd;
var $db;

var $connect_ok;
var $link;

var $pconnect;
var $transResult;
/*
 * 构造方法,数据库服务器地址,用户名,密码,数据库实例名称
 */
function DBhelper($p_server,$p_user,$p_pwd,$p_db){
$this->connect_ok=true;
$this->url=$p_server;
$this->user=$p_user;
$this->pwd=$p_pwd;
$this->db=$p_db; $this->linkDb();
$this->pconnect=false;
}
/*
 * 设置持久连接
 */
function setPconnect($pconn = true){
if($pconn){
if($this->connect_ok){
@mysql_close($this->link);
}
$this->connect_ok=true;
$this->linkDb(true);
}else{
$this->connect_ok=true;
$this->linkDb();
}
$this->pconnect=$pconn;

//echo $this->connect_ok?"TRUE":"FALSE";
}
/*
 * 开始事务
 */
function beginTrans(){
$this->setPconnect(false);
@mysql_query("begin",$this->link);
$this->transResult=true;
}
/*
 * 执行SQL
 */
function excute($sql){
if(!$this->connect_ok){
$this->transResult=false;
return false;
}
$tmp=mysql_query($sql,$this->link);
//检查从开始事务后,每次执行是否成功
$this->transResult=$this->transResult&&$tmp;
return $tmp;
}
/*
 * 结束事务
 */
function endTrans(){
if($this->pconnect){
return false;
}
if($this->transResult){//每次执行均成功
@mysql_query("commit");
return true;
}
@mysql_query("rollback");
return false;
}
/*
 * 显示错误
 */
function showErr(){
return mysql_error($this->link);
}
/*
 * 关闭连接
 */
function close(){
@mysql_close($this->link);
}
/*
 * 内部方法,连接数据库
 */
function linkDb($p=false){
if($p){
$this->link = @mysql_pconnect($this->url, $this->user, $this->pwd) or 
$this->connect_ok=false;
}else{
$this->link=@mysql_connect($this->url,
$this->user,$this->pwd) or $this->connect_ok=false;
}
mysql_query("SET NAMES 'GB2312'");
@mysql_select_db($this->db);
}}
?>

解决方案 »

  1.   

    只是包装一下函数.
    用php4写的类.
    最好用php5的新特性.构造函数,析构函数等等.
    另外,没有处理,如果只beginTrans,没有endTrans的这种情况.
      

  2.   

    增加free_result函数,使程序更加的健壮,运行效率会提高还有就是字符集可以作为参数传递GB2312和UTF-8未必是什么样的数据库
      

  3.   

    只能用于innodb表吗?楼主
      

  4.   

    给点建议。做个单态调用,即,增加
    getInstance()方法,这样,可以给坐你在不同位置下节省很多资源。
      

  5.   

    mysql 暂时只有InnoDB支持事务,所以只能用于innodb表可以把mysql_query,mysql_fetch_array都封装进去