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