• 一个简单的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的记录数
    */
  • 相关阅读:
    PHP WAMP关闭notice等提示
    PowerDesigner 逆向工程 从SQL文件转换成PDM 从PDM转成CDM
    Servlet 各种path路径比较
    数据库一对一的两种关联 主键关联和外键关联
    Java Timer定时器
    VS2010彻底卸载
    VS2010每次编译都重新编译整个工程的解决方案
    DbgPrint/KdPrint输出格式控制
    error TRK0002: Microsoft Visual Studio 10.0VCinlink.exe Access is denied.
    WinDbg F9时“code not found breakpoint not set”
  • 原文地址:https://www.cnblogs.com/bgcolor/p/2992561.html
Copyright © 2020-2023  润新知