一个简单的MySQL操作类

最近帮兄弟写一个企业网站,网站比较小,数组处理,涉及MySQL的增,删,改,查特别多,因此很繁琐.改了别人的Mysql操作类

该类非常轻量级,支持Mysql的增,删,改,查,并将所有查询建立在Memcache缓存服务器上,效率高.缺点是不支持:多表连贯操作!

配置的时候将,数据库地址,用户名,端口号(默认3306),密码,和Memcache地址,端口(默认11211),重新写下,就可以使用了.

废话少说,上代码

<?php
class Model{
    protected $host='127.0.0.1';
    protected $port='3306';
    protected $user='root';
    protected $pwd='123456';
    protected $dbname='test';
    protected $charset='utf8';
    protected $table;
    protected $link;
    protected $sql;
    protected $mserver='127.0.0.1';
    protected $mport='11211';
    protected $cache_time='15';

    //实例化的时候,传入表名
    public function __construct($table){
            $this->table=$table;
            $this->link=$this->connect();
        }
    //链接数据库
    public function connect(){
       $conn = mysql_connect($this->host.':'.$this->port,$this->user,$this->pwd);
        if(!$conn) {
            die("Connect Server Failed: " . mysql_error());
        }
        if(!mysql_select_db($this->dbname)) {
            die("Select Database Failed: " . mysql_error());
        }
        mysql_set_charset($this->charset);
        return $conn;
    }
    
    //查询有结果集所调用的query方法,也可以,直接query(自定义sql语句,无视下面的select方法等)
    public function query($sql){
        $this->sql=$sql;
        $result=mysql_query($sql);
        $data=array();
        if (mysql_affected_rows()>0) {
            while($row=mysql_fetch_assoc($result)){
                $data[]=$row;
            }
            return $data;
        }else{
            die($sql."\n".'没有查询符合该条件的记录');
        }
    }
    
    //所有查询,都从memcahe中取,如果没有再去mysql中取
    public function memcache($sql){
        $mem=new Memcache(); 
        $data='';
        //如果连接失败,表示服务器没有安装memcahe
        if (@!$mem->connect($this->mserver,$this->mport)) {
            $data=$this->query($sql);
        }else{
            $key=md5($sql);
            $data=$mem->get($key);
            if (!$data) {
                $data=$this->query($sql);
                $mem->set($key,$data,MEMCACHE_COMPRESSED,$this->cache_time);
                echo '如果出现这句话,就表示从mysql中查询数据,反之,从memcache取的数据,效率高';
            }
            $mem->close();
        }
        return $data;
    }
    //执行插入,删除,修改,等操作时,调用该方法
    public function execute($sql,$ms){
        $this->sql=$sql;
        $result=mysql_query($sql);
        if ($result) {
            return mysql_affected_rows();//操作成功,返回成功记录的数量
        }else{
            die($ms.'执行该条的SQL语句是:'.$sql);//执行相关操作,错误时返回的消息
        }
    }
    
    //查询表中的总数,默认为表中id的总数,where条件,默认为空,需要调用时传入如:id>5等
    public function acount($where=''){
        //设置别名,若不设置,返回的数组中键是[count(id)],比较怪异,设置后键为count
        if(empty($where)){
            $sql="select count(id) as count from $this->table";
        }else{
            $sql="select count(id) as count from $this->table where $where";
        }
        $data=$this->memcache($sql);
        return $data[0]['count'];
    }
    
    //按字段查询,第一个参数多条件传入时,用逗号,分开如:id,name,xxxx,如第一个参数为*,即查询所有
    public function select($field,$where='',$order='',$limit=''){
        $sql="select $field from $this->table $where $order $limit";
        if(!empty($field)){
            //注意这些关键词后面有空格
            if (!empty($where)){
                $where='where '.$where;
            }
            if (!empty($order)) {
                $order='order by '.$order;
            }
            if (!empty($limit)) {
                $limit='limit '.$limit;
            }
            $sql="select $field from $this->table $where $order $limit";
            $data=$this->memcache($sql);
            return $data;
         }else{
            die('请检查select方法参数,该方法的sql语句有误:'.$sql);
        }
    }
    
    //添加数据,传入参数是数组如:一维数组array('name'=>$n,'city'=>$c,)
    //二维数组array(array('name'=>$n,'city'=>$c,),array('name'=>$n2,'city'=>$c2,))
    public function add($data){
        $k='';
        $v='';
        $v2='';
        foreach ($data as $key=>$value) {
            if(is_array($value)){
                $tmp='';
                foreach ($value as $key2=>$value2) {
                    //只取二维数组里面第一个数组下面键对应的值,也就是mysql中的字段,(因为二维数组里面第二个,第三个..等数组键都是一样的)
                    if ($key<1) {
                        $k.=$key2.',';
                    }
                    $tmp.="'$value2'".',';
                }
                $v2.='('.rtrim($tmp,',').'),';
            }else{
                $k.=$key.',';
                $v.='"'.$value.'",';
            }
        }
        $k=rtrim($k,',');
        $sql="insert into $this->table($k) values ";
         if (empty($v)) {
             $sql.=rtrim($v2,',');
         }else{
            $v='('.rtrim($v,',').')';
            $sql.=$v;
         }
        return $this->execute($sql,'添加失败!'); 
    } 

    //修改,更新mysql记录,第一个参数传数组(一位数组)如:array('name'=>'张三','city'=>'南京'),第二个参数一般是条件,比如id>5,id=5,id in(15,16)等,后面参数两个相对用的比较少
    public function update($data,$where,$order='',$limit=''){
        $k='';
        foreach ($data as $key=>$value) {
            $k.=$key.'='."'$value'".',';
        }
        $k=rtrim($k,',');
        if (!empty($where)) {
            $where='where '.$where;
        }
        if (!empty($order)) {
            $order='order by '.$order;
        }
        if (!empty($limit)) {
            $limit='limit  '.$limit;
        }
        $sql="update $this->table set $k $where $order $limit";
        return $this->execute($sql,'修改失败!');
    }
    
    //删除表中记录,如果第一个参数为空,则启用第二参数,条件删除如:id>5或则id>5 and age=6
    public function delete($data,$and=''){
        if(!empty($data)){
            if (is_int($data)) {
                $data='where id='.$data;
            }else if (is_array($data)) {
                $data='where id in('.join(',',$data).')';
            }else{
                die("第一个参数请传入整型或者数组类型");
            }
            $sql="delete from $this->table $data";
        }else{
            if((int)$and){
                die("第二个参数错误");
            }else{
                $sql="delete from $this->table where $and";
            }
        }
        return $this->execute($sql,'删除失败!');
    } 
    //查看sql语句,一般用不到,因为操作一旦失败,程序自动输出sql语句
    public function __get($pname){
        if ($pname=='sql') {
            return $this->sql;
        }
    }

    public function __destruct(){
        mysql_close();
    }
}
?>

调用如下:

/**
      select 方法 4个参数:field字段,where条件,order顺序,limit数量
    //$r=$m->select('*');//查询所有记录
    //查出表中id,name,age,num_iid字段对应的值,条件是id<10并且num_iid!=0,按age倒叙排列,取5条记录
    //$r=$m->select('id,name,age,num_iid','id<100 and num_iid!=0','age desc',10)
    **/
    
    /**
    *add 方法 参数1个,传入一位数组或者二维数组
    $arr=array(
        array('name'=>'昆山','province_id'=>4),
       array('name'=>'张家港','province_id'=>5),
        array('name'=>'吴江','province_id'=>6),
        array('name'=>'常熟','province_id'=>7),
        array('name'=>'太仓','province_id'=>8),
    );
    *$arr=array('name'=>'太仓','province_id'=>8);
    //$r=$m->add($arr);
    **/

   /**
    * update方法 4个参数:第一个参数是一维数组,where条件,order顺序,limit数量
    *$arr=array('name'=>'太仓','province_id'=>8);
    *$r=$m->update($arr,'id>10','','');//后面两个参数相对用的很少
    **/

    /**
     * delete 方法两个参数:第一个参数要么是整型数字要么传入数组,默认删除的是mysql中的id,如果开启条件删除第一个参数必须为空,反之第二个为空
     *$r=$m->delete((int)$num)//如果第1参数不是数组,必须将该字符串转为整型,delete from table where id=1
      $r=$m->delete(array(1,2,4,5,6,999));批量删除id in("数组")的记录
      条件删除,必须将第一个参数设置为空
      $r=$m->delete('','id>6 and age=100')
      PS:删除操作是敏感操作,稍有不慎可能数据全部删除,例如delete from TABLE_NAME where NUM
      NUM为数字,只要NUM等于非零的(整型)或者(字符串型)的数字,表中的数据会全部删除,因此删除最好调用自定义$m->query("SQL"),方法
     **/
/*
acount方法查总数,一个参数默认为空
$r=$m->acount();//查询表中的总记录条数
$r=$m->acount('age<18')//age小于18的记录数
*/

 

posted @ 2013-03-31 23:36  bgColor  阅读(256)  评论(0编辑  收藏  举报