欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

Model.class.php

程序员文章站 2024-02-17 17:14:04
...

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="";

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];

}

}

相关标签: Model.class.php