• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

php的分表分库类

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

 

<?php
include 'config.php';
class Model{
        //用户名
        protected $user;
        //密码
        protected $pwd;
        //主机
        protected $host;
        //库名,是一个数组
        protected $dbName=array();
        //字符集
        protected $charset='utf8';
        //连接资源是一个数组
        protected $_link=array();
        //通用表名
        protected $tabName;
        //真实表名
        protected $trueTabName;
        //表前缀
        protected $prefix;
        //字段缓存
        protected $fields;
        //创建表的sql语句
        protected $createSql='CREATE TABLE IF NOT EXISTS __TABLENAME__(
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `username` char(15) NOT NULL,
  `password` char(32) NOT NULL,
  `createtime` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;';

//1,通过ID取余,得到真实表名    mod
//2,用户名截取前几位   substr
//3,md5                        md5
//4,不带分库分表        none

        protected $partition=array(
                'type'=>'md5',        
                
                'rule'=>1,
        
        );


        public function __construct($tabName=''){
                $this->user=DB_USER;
                $this->host=DB_HOST;
                $this->dbName[0]=DB_NAME;
                $this->charset=DB_CHARSET;
                $this->prefix=DB_PREFIX;
                $this->pwd=DB_PWD;

                if(empty($tabName)){
                //userModel
                //newModel
                        $this->tabName=$this->prefix.ucfirst(strtolower(substr(get_class($this),0,-5)));

                }else{
                        $this->tabName=$this->prefix.$tabName;
                }

                $this->_link[0]=$this->connect($this->host,$this->user,$this->pwd,$this->dbName,$this->charset);

        }

        public function connect($host,$user,$pwd,$dbName,$charset,$linkId=0){
                $conn=mysql_connect($host,$user,$pwd);

                
                if(mysql_errno()){
                        $this->error(-1,$conn);
                        return false;
                }
        

                if(!$this->selectDb($dbName[$linkId],$conn)){
                        $this->error(-2,$conn);
                        return false;        
                }
                
                if(!$this->setCharset($charset,$conn)){
                        $this->error(-3,$conn);
                        return false;
                }
        

                return $conn;



        }


        public function selectDb($dbName,$conn){
                if(mysql_select_db($dbName,$conn)){

                        return true;
                }else{
                        return false;
                }        
        }

        public function setCharset($charset,$conn){
                if(mysql_set_charset($charset,$conn)){
                        return true;
                }else{
                        return false;
                }

        }

        public function addServer($host,$user,$pwd,$dbName,$charset,$linkId){
                $this->dbName[$linkId]=$dbName;
                $this->_link[$linkId]=$this->connect($host,$user,$pwd,$dbName,$charset,$linkId);

        }

        public function getTrueTable($content,$linkId=0){
                switch($this->partition['type']){
                        case 'mod':
                                if(!is_int($content)){
                                        $this->error(-4);
                                        return false;
                                }
                                $string=$content%$this->partition['rule'];
                                break;
                        case 'substr':
                                $string=substr($content,0,$this->partition['rule']);
                                break;
                        case 'md5':
                                $string=substr(md5($content),0,$this->partition['rule']);
                                break;
                        case 'none':
                                $string=null;
                                break;
                }

                if(empty($string)){
                        $this->trueTableName=$this->tabName;

                }else{
                        $this->trueTableName=$this->tabName.'_'.$string;
                }

                //第一,判断表是否存在,存在返回表字段缓存
                //第二,不存在,则创建表,返回字段缓存

                        $this->existsTable($this->trueTableName,$linkId);


        }
        //表是否存在
        //是否缓存了字段

        protected function existsTable($tableName,$linkId=0){
                $database=$this->dbName[$linkId];
                $sql='select `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` where `TABLE_SCHEMA`=\''.$database.'\' and `TABLE_NAME`=\''.$tableName.'\'';
        
                if($this->execute($sql,$linkId)){
                        //表存在
                        if(file_exists('cache/'.md5($this->tabName).'.php')){
                                $this->fields=include 'cache/'.md5($this->tabName).'.php';
                        }else{
                                //暂时留着不写,待会来写
                                $this->fields=$this->getFieldCache($linkId);
                        }

                }else{
                        //表不存在
                        $this->createTable($this->trueTableName,$linkId);
                        $this->fields=$this->getFieldCache($linkId);

                }

        }

        protected function getFieldCache($linkId=0){
                if(file_exists('cache/'.md5($this->tabName).'.php')){
                        $fields=include 'cache/'.md5($this->tabName).'.php';
                        return $fields;        
                }
                $sql="desc $this->trueTableName";
                $f=$this->query($sql,$linkId);
                
                $fields=$this->writeFields($f);

                return $fields;
                

        }

        protected function writeFields($f){
                foreach($f as $key=>$value){
                        $fields[]=$value['Field'];
                        
                        if($value['Key']=='PRI'){
                                $fields['_pk']=$value['Field'];
                        }
                        if($value['Extra']=='auto_increment'){
                                $fields['_auto']=$value['Field'];
                        }
                }
                $string="<?php \n return ".var_export($fields,true)."\n?>";
                
                file_put_contents('cache/'.md5($this->tabName).'.php',$string);
                return $fields;
                        
        }

        protected function createTable($tabName,$linkId=0){
                $sql=str_replace('__TABLENAME__',$tabName,$this->createSql);
        
                $this->execute($sql,$linkId);
        }

        //不需要返回结果集我用execute方法
        public function  execute($sql,$linkId=0){
                $conn=$this->_link[$linkId];
        
                $result=mysql_query($sql,$this->_link[$linkId]);
                if($result&&mysql_affected_rows()){
                
                        return mysql_affected_rows();
                }else{
                        return false;
                }

        }


        //需要返回结果集我用query方法
        public function query($sql,$linkId=0){
                $result=mysql_query($sql,$this->_link[$linkId]);
                
                if($result&&mysql_affected_rows()){
                        while($row=mysql_fetch_assoc($result)){

                                $rows[]=$row;
                        }
                }else{
                        return false;
                }
                return $rows;
        }


        public function error($num,$conn){
                switch($num){
                        case -1:
                                $string='连接数据库服务器失败'.mysql_error($conn);
                                break;
                        case -2:
                                $string='选择数据失败';
                                break;
                        case -3:
                                $string='设置字符集失败';
                                break;
                        case -4:
                                $string='数据库路由时选择的是取余,传入的不是整型';
                                break;
                }
        }

        


        //查最大值
        public function max($field,$linkId=0){
                if(!in_array($field,$this->fields)){
                        return false;
                }
                $sql="select max($field) as re from $this->trueTableName";
                $result=$this->query($sql,$linkId);
                $row=$result['re'];
                return $row;
                

        }        

        

        //查最小值
        public function min($field,$linkId=0){
                if(!in_array($field,$this->fields)){
                        return false;
                }
                $sql="select min($field) as re from $this->trueTableName";
                $result=$this->query($sql,$linkId);
                $row=$result['re'];
                return $row;
                

        }
        //求和
        public function sum($field,$linkId=0){
                if(!in_array($field,$this->fields)){
                        return false;
                }
                $sql="select sum($field) as re from $this->trueTableName";
                $result=$this->query($sql,$linkId);
                $row=$result['re'];
                return $row;
                

        }
        //最平均数
        public function avg($field,$linkId=0){
                if(!in_array($field,$this->fields)){
                        return false;
                }
                $sql="select avg($field) as re from $this->trueTableName";
                $result=$this->query($sql,$linkId);
                $row=$result['re'];
                return $row;
                

        }
        //求总数
        public function count($field='',$linkId=0){
                if(empty($field)){
                        $field=$this->fields['_pk'];
                }
                $sql="select count($field) as re from $this->trueTableName";
                $result=$this->query($sql,$linkId);
                $row=$result['re'];
                return $row;
        }
        //
        //删除
        public function delete($data,$where='',$linkId=0,$order='',$limit=''){
                //delete from 表  where 字段  order by  字段 limit 
                
                if(is_array($data)){
                        $value=join(',',$data);
                }else{
                        $value=(int)$data;
                }
                $fields=$this->fields['_pk'];

                if(empty($where)){

                        $sql="delete from $this->trueTableName where $fields in ($value)";
                }else{
                        $where='where '.$where;
                        if(!empty($order)){
                                $order='order by '.$order;        
                        }
                        if(!empty($limit)){
                                $limit='limit '.$limit;        
                        }

                        $sql="delete from $this->trueTableName $where $order $limit";
                }
                return $this->execute($sql,$linkId);
        }
        //
        //修改
        public function save($data,$where,$linkId=0,$order='',$limit=''){

                //update 表  set 字段=值,字段=值 where 条件 order  limit
                $key=array_keys($data);
                $newKey=array_intersect($key,$this->fields);
        
                foreach($data as $key=>$value){
                        if(!in_array($key,$newKey))
                                continue;
                        $update.=$key.'="'.$value.'",';
                
                }
                $update=rtrim($update,',');
                
                if(!empty($order)){
                        $order='order by '.$order;
                }
                if(!empty($limit)){
                        $limit='limit '.$limit;
                }

                if(!empty($where)){
                        $where='where '.$where;
                }


                $sql="update $this->trueTableName set $update $where $order $limit";

                echo $sql;
                $result=$this->execute($sql,$linkId);
                return $result;

        }



        //增加
        public function add($data,$linkId=0){
                //insert into 表(字段) values(值)
                $key=array_keys($data);
                $newKey=array_intersect($key,$this->fields);
                foreach($data as $key=>$value){
                        if(!in_array($key,$newKey))
                                continue;
                        $values.="'".$value."',";
                }
                $values=trim($values,',');
                $fields=join(',',$newKey);
                $sql="insert into $this->trueTableName($fields) values($values)";
                echo $sql;
                $result=$this->execute($sql,$linkId);
                return $result;
        }


        //单条查询
        public function find($linkId=0,$where='',$order=''){
                //select * from 表 where  order  limit 1
                $field=join(',',$this->fields);
                if(!empty($where)){
                        $where='where '.$where;
                }
                if(!empty($order)){
                        $order='order by '.$order;
                }
                $sql="select $field from $this->trueTableName $where $order limit 1";
                $result=$this->query($sql,$linkId);
                return $result[0];
                
        }

        //多条查询
        public function select($field='',$linkId=0,$where='',$order='',$limit=''){
                //select * from 表 where  order  limit
                if(empty($field)){
                        $fields=join(',',$this->fields);
                }else{
                        if(is_array($field)){
                                $newKey=array_intersect($field,$this->fields);
                                $fields=implode(',',$newKey);
                        }else{
                                $fields=$field;
                        }
                }
                if(!empty($where)){
                        $where='where '.$where;
                }
                if(!empty($order)){
                        $order='order by '.$order;
                }
                if(!empty($limit)){
                        $limit='limit '.$limit;
                }
                $sql="select $fields from $this->trueTableName $where $order $limit";
                $result=$this->query($sql,$linkId);
                return $result;
                
        }
        //按照字段来查询数据


        function __call($name,$param){
                $key=substr($name,0,5);
                if(strtolower($key)=='getby'){
                        $field=strtolower(substr($name,5));
                
                        if(!in_array($field,$this->fields)){
                                return false;
                        }
                        $f=join(',',$this->fields);
                        $value=$param[0];
                        $sql="select $f  from $this->trueTableName where $field='$value'";
        
                        $result=$this->query($sql);
                        return $result[0];

                }
        }



}

?>

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
基于PHP——简单的WSDL的创建(WSDL篇)发布时间:2022-07-10
下一篇:
php输出年份发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap