mysql model class php_Model.class.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="";

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

}

}

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库的model.py是用来定义数据库模型的Python文件。在Web应用中,我们通常使用关系型数据库(如MySQL、PostgreSQL等)或非关系型数据库(如MongoDB、Redis等)来存储数据。而数据库模型就是将这些数据存储到数据库中的一种方式。 在Django框架中,我们可以使用ORM(Object-Relational Mapping)来定义数据库模型。ORM是一种将对象和关系数据库之间的映射技术,它可以将数据库中的表与Python中的类相对应,将表中的行与类的实例相对应,使得我们可以使用Python代码来操作数据库,而不需要编写SQL语句。 在model.py文件中,我们首先需要导入Django框架中的models模块,然后定义一个类来表示数据库中的一张表。在这个类中,我们可以定义表中的字段(Field),例如CharField、IntegerField等,以及一些其他的属性,例如null、blank、default等。 下面是一个简单的model.py文件的例子: ```python from django.db import models class User(models.Model): name = models.CharField(max_length=50) age = models.IntegerField() email = models.EmailField(null=True, blank=True) def __str__(self): return self.name ``` 在这个例子中,我们定义了一个User类,它继承自models.Model类。我们定义了三个字段,分别是name、age和email,它们分别对应着表中的三个列。其中,name是一个CharField类型的字段,它的最大长度为50;age是一个IntegerField类型的字段;email是一个EmailField类型的字段,它可以为空。 在类中,我们还定义了一个__str__()方法,它返回的是对象的name属性,方便我们在控制台中查看对象时能够更加直观地显示对象的信息。 通过定义好的数据库模型,我们可以使用Django的ORM来进行数据库操作,例如创建表、查询数据、插入数据等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值