我的框架之一 model层
共享一个Model类,先贴上Model代码,在用实例讲解调用方法
<?php /** * 模型基类 * 数据库处理类 */ class Model { protected $table = ""; protected $error = null; protected $config = null; protected $conn = null; protected $sql = null; protected $where = ""; protected $order = null; protected $group = null; protected $field = "*"; protected $limit = null; protected $join = null; protected $oldTable = null; const EXISTS_VAILIDATE = 1; // 表单存在字段则验证 const MUST_VALIDATE = 2; // 必须验证 const MODEL_INSERT = 1; // 插入模型数据 const MODEL_UPDATE = 2; // 更新模型数据 const MODEL_BOTH = 3; // 包含上面两种方式 const NO_AND = 1; // where不需要and const YES_AND = 2; // where需要and const YES_OR = 3; // where需要or protected $cachePath=SYSDIR_SMARTY_TEMPLATE_C; //缓存存放路径 protected function initVar(){ $this->field="*"; $this->where=""; $this->group=null; $this->limit=null; $this->join=null; $this->order=null; } /** * 构造函数 * * @param string $table * @param array $config */ public function __construct($table = null, $config = null) { $this->config = empty ( $config ) ? C () : $config; empty ( $table ) or $this->table ( $table ); // $this->connect (); } private function filter($name) { if (is_array ( $name )) { foreach ( $name as $k => $v ) { $name [$k] = $this->filter ( $v ); } return $name; } else { if(!$this->conn){ $this->connect(); } return mysql_real_escape_string ( trim ( $name )); } } /** * mysql连接 */ private function connect() { if (! ($this->conn = mysql_connect ( $this->config ["host"], $this->config ["user"], $this->config ["passwd"] ))) { $this->error = "连接不上Mysql数据库"; } mysql_select_db ( $this->config ["dbName"] ); if (mysql_get_server_info () > "4.1") { mysql_query ( "set names utf8"); } } /** * 执行sql语句 * * @param string $sql * @throws Exception * @return 查询语句返回查询结构 */ public function query($sql) { if (! $this->conn) $this->connect (); $this->sql = $sql; $rs = mysql_query ( $sql ); $this->initVar(); if (is_bool ( $rs )) { return $rs; } else { $data = array (); while ( $row = mysql_fetch_array ( $rs, MYSQL_ASSOC ) ) { $data [] = $row; } return $data; } } /** * 插入数据库 * * @param array $data * @return bool int 失败返回false */ public function save($data) { if (! empty ( $data ) && is_array ( $data )) { if (is_array ( $data [0] )) { foreach ( $data as $value ) { $rs=$this->save ( $value ); } return $rs; } else { $field = "`" . implode ( "`,`", array_keys ( $data ) ) . "`"; $value = """ . implode ( "","", $this->filter ( array_values ( $data ) ) ) . """; $this->sql = "insert into " . $this->table . "(" . $field . ")" . "values(" . $value . ");"; $rs = $this->query ( $this->sql ); $structure = $this->getStructure (); if ($structure [$structure ["_pk"]] ["extra"] == "auto_increment") { return mysql_insert_id (); } else { return $rs; } } } else { return false; } } /** * 数据更新 * * @param array $data * @return bool */ public function update($data) { if (! empty ( $data ) && is_array ( $data )) { $structure = $this->getStructure (); $data = $this->filter ( $data ); $flag = true; $field = ""; foreach ( $data as $key => $value ) { if ($key == $structure ["_pk"]) continue; if ($flag) { $flag = false; } else { $field .= ","; } $field .= "`{$key}`="{$value}""; } $this->sql = "update " . $this->table . " set " . $field . " where "; $this->sql .= empty ( $data [$structure ["_pk"]] ) ? $this->where : "`{$structure["_pk"]}`="{$data[$structure["_pk"]]}""; return $this->query ( $this->sql ); } else { return false; } } /** * 删除数据 * * @return bool */ public function delete($data = null) { ! empty ( $data ) and $this->where ( $data ); $this->sql = "delete from " . $this->table . " where " . $this->where; return $this->query ( $this->sql ); } /** * 更改表名 * * @param mix $table * table(array("User"=>"user")); 查询前缀+User表,并重新命名为user * table("user"); user * @return Model */ public function table($table) { if (is_string ( $table )) { $this->table = "`" . C ( "dbPrefix" ) . $table . "`"; $this->oldTable = C ( "dbPrefix" ) . $table; } if (is_array ( $table )) { $flag=true; foreach($table as $key=>$vo){ if($flag){ $flag=false; }else{ $this->table.=","; } $this->table.="`" . C ( "dbPrefix" ) . $key . "` as `" . $vo . "`"; $this->oldTable=$key; } } return $this; } // order排序 public function order($order) { $this->order = $order; return $this; } // join public function join($join) { $this->join = $join; return $this; } // group分组 public function group($group) { $this->group = $group; return $this; } /** * 查询的字段 默认为* * field(array("user.id","user.username",array("title","t"))) * field("id,username"); * * @param mix $fields * @return Model */ public function field($fields = "*") { if (is_string ( $fields )) { $this->field = $fields; } else if (is_array ( $fields )) { $this->field = ""; $flag = NO_AND; foreach ( $fields as $field ) { if (is_array ( $field )) { $flag = $this->getOneField ( $field [0], $flag ); $this->field .= " as "; $flag = NO_AND; $flag = $this->getOneField ( $field [1], $flag ); } else { $flag = $this->getOneField ( $field, $flag ); } } } return $this; } /** * 获取一个field 如果是date那么就是`date` 如果是user.id那么就是user.id * @param string $field * @param int $flag * @return string */ private function getOneField($field, $flag) { if (strpos ( $field, "." ) == false) { switch ($flag) { case NO_AND : $flag = YES_AND; break; case YES_AND : $this->field .= ","; break; } $this->field .= "`" . $field . "`"; } else { switch ($flag) { case NO_AND : $flag = YES_AND; break; case YES_AND : $this->field .= ","; break; } $this->field .= $field; } return $flag; } // limit public function limit($limit) { $this->limit = $limit; return $this; } // 事务开启 public function begin() { return $this->query ( "begin" ); } // 事务提交 public function commit() { return $this->query ( "commit" ); } // 事务回滚 public function rollback() { return $this->query ( "rollback" ); } /** * where条件查询 * * @param mix $map * @return Model */ public function where($map) { if (is_array ( $map )) { //$map = $this->filter ( $map ); $flag = NO_AND; foreach ( $map as $key => $value ) { if (strpos ( $key, "|" )) { $keys = explode ( "|", $key ); $this->where .= "("; foreach ( $keys as $i => $keyVo ) { $i == 0 or $flag = YES_OR; if (is_array ( $value )) { $flag = $this->getOneWhere ( $keyVo, $value [$i], $flag ); } else { $flag = $this->getOneWhere ( $keyVo, $value, $flag ); } } $this->where .= ")"; } else { $flag = $this->getOneWhere ( $key, $value, $flag ); } } } if (is_string ( $map )) { $this->where = $map; } return $this; } private function getOneWhere($key, $value, $flag = NO_AND) { switch ($flag) { case NO_AND : $flag = YES_AND; break; case YES_AND : $this->where .= " and "; break; case YES_OR : $this->where .= " or "; $flag = YES_AND; break; } $this->where .= "("; $this->where .= strpos ( $key, "." ) ? $key : "`" . $key . "`"; if (is_array ( $value )) { switch ($value [0]) { case "in" : is_array($value[1]) and $value[1]=implode(",",$value[1]); $this->where .= " in(" . $value [1] . ")"; break; case "between" : $this->where .= " between "" . $value [1] [0] . "" and "" . $value [1] [1] . """; break; default : $this->where .= " " . $value [0] . """ . $value [1] . """; } }else{ $this->where .= "=" . """ . $value . """; } $this->where .= ")"; return $flag; } // 根据条件获取sql语句 protected function getSql() { $this->sql = "select " . $this->field . " from "; $this->sql .= $this->table; empty ( $this->join ) or $this->sql .= " " . $this->join; empty ( $this->where ) or $this->sql .= " where " . $this->where; empty ( $this->group ) or $this->sql .= " group by " . $this->group; empty ( $this->order ) or $this->sql .= " order by " . $this->order; empty ( $this->limit ) or $this->sql .= " limit " . $this->limit; return $this->sql; } /** * 计算表中数据 * @return int */ public function count(){ $this->field="count(*) as `count`"; $rs=$this->find(); return $rs["count"]; } /** * 查询数据库,获取二维数组 * * @return array bool */ public function select() { $this->getSql (); return $this->query ( $this->sql ); } /** * 查询数据 * * @return array */ public function find() { $this->getSql (); $this->sql .= " limit 1"; $data = $this->query ( $this->sql ); return $data [0]; } /** * 获取最后一条sql语句 * * @return string */ public function getLastSql() { return $this->sql; } /** * 析构函数,释放mysql连接 */ public function __destruct() { if (isset ( $this->conn )) mysql_close ( $this->conn ); } /** * 获取错误信息 * * @return string */ public function getError() { return $this->error; } /** * 设置/读取缓存 和F的区别是不用序列化字段,小文件速度更快 * * @param string $name * @param anytype $data * @param int $time * 单位为秒 读取时才判断 * @throws Exception * @return mixed NULL */ protected function fileExport($name, $data = null) { $path = $cachePath; if (isset ( $data )) { if (file_put_contents ( $path . "/" . $name .".php", "<?php return " . var_export ( $data, true ) . ";" ) > 0) { return true; } else { throw new Exception ( "生成缓存文件失败" ); } } else { if (file_exists ( $file = $path . "/" . $name . ".php" )) { $content = require $file; return $content; } else { return null; } } } /** * 获取表结构 */ protected function getStructure($table = null) { empty ( $table ) and $table = $this->oldTable; static $_structure = array (); if (isset ( $_structure [$table] )) { return $_structure [$table]; } $fileName = $cachePath . "/" . $table . ".php"; $data = $this->fileExport ( $table); if ($data == null) { $structure = $this->query ( "describe " . $table ); $keys = array ( "Field", "Type", "Null", "Key", "Default", "Extra" ); foreach ( $structure as $vo ) { if ($vo ["Key"] == "PRI") { $data ["_pk"] = $vo ["Field"]; } foreach ( $keys as $key ) { $data [$vo ["Field"]] [strtolower ( $key )] = $vo [$key]; } } $this->fileExport ( $table, $data); $_structure [$table] = $data; } return $data; } /** * 获取当前操作,是新增数据还是更新数据 * * @param array $data * @return bool */ private function getOperation($data) { $structure = $this->getStructure (); if (array_key_exists ( $structure ["_pk"], $data )) { return self::MODEL_UPDATE; } else { return self::MODEL_INSERT; } } /** * 进行自动验证,自动完成 * 自动验证规则 * array( * @param string field 验证字段 * @param string rule 验证规则 * @param string error 错误提示 * @param mix [addition] 附加规则 * @param int [condition] 验证条件: 0:存在就验证EXISTS_VAILIDATE(默认) 1:必须验证:EXISTS_VAILIDATE * @param int [operation] 验证条件2: 0:插入数据库时验证:MODEL_INSERT 1:更新数据库时验证:MODEL_UPDATE 2:插入数据库和更新数据库都验证:MODEL_BOTH * )f * @param array $data * @return boolean */ public function create(&$data = null) { $data==null and $data=&$_POST; if (isset ( $this->_validate )) { $keys = array ( "field", "rule", "error", "addition", "condition", "operation" ); foreach ( $this->_validate as $vo ) { $keyList = $keys; if (! $this->isValidate ( $data, array_combine ( array_splice ( $keyList, 0, count ( $vo ) ), $vo ) )) { $this->error = $vo [2]; return false; break; } } } if (isset ( $this->_auto )) { $keys = array ( "field", "rule", "addition", "operation" ); foreach ( $this->_auto as $vo ) { $keyList = $keys; $this->isAuto ( $data, array_combine ( array_splice ( $keyList, 0, count ( $vo ) ), $vo ) ); } } return true; } /** * 是否进行验证 * * @param array $data * @param array $value * @return boolean */ private function isValidate($data, $value) { ( int ) $value ["condition"] = empty( $value ["condition"]) ? self::EXISTS_VAILIDATE : $value ["condition"]; ( int ) $value ["operation"] = empty( $value ["operation"]) ? self::MODEL_BOTH : $value ["operation"]; switch ($value ["condition"]) { case self::EXISTS_VAILIDATE : if ((isset ( $data [$value ["field"]] )) && ($value ["operation"] == self::MODEL_BOTH || $value ["operation"] == $this->getOperation ( $data ))) { return $this->validate ( $data, $value ); } else { return true; } break; case self::MUST_VALIDATE : if (! isset ( $data [$value ["field"]] )) { return false; } else if ($value ["operation"] == MODEL_BOTH || $value ["operation"] == $this->getOperation ( $data )) { return $this->validate ( $data, $value ); } else { return true; } break; default : return false; break; } } /** * 进行自动验证 * * @param array $data * @param array $value * @return boolean */ private function validate($data, $value) { $validate = array ( "require" => "/.+/", "email" => "/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/", "url" => "/^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]":+!]*([^<>""])*$/", "currency" => "/^d+(.d+)?$/", "number" => "/^d+$/", "zip" => "/^[1-9]d{5}$/", "integer" => "/^[-+]?d+$/", "double" => "/^[-+]?d+(.d+)?$/", "english" => "/^[A-Za-z]+$/" ); switch ($value ["rule"]) { case "require" : if (empty ( $data [$value ["field"]] )) { return false; } else { return true; } break; case "in" : if (is_string ( $value ["addition"] )) { $value ["addition"] = explode ( ",", $value ["addition"] ); } if (in_array ( $data [$value ["field"]], $value ["addition"] )) { return true; } else { return false; } break; case "between" : if (is_string ( $value ["addition"] )) { $value ["addition"] = explode ( ",", $value ["addition"] ); } if ($data [$value ["field"]] >= $value ["addition"] [0] && $data [$value ["field"]] <= $value ["addition"] [1]) { return true; } else { return false; } break; case "email" : if (preg_match ( $validate [$value ["rule"]], $data [$value ["field"]] )) { return true; } else { return false; } break; case "url" : if (preg_match ( $validate [$value ["rule"]], $data [$value ["field"]] )) { return true; } else { return false; } break; case "confirm" : if (md5 ( $data [$value ["field"]] ) == md5 ( $data [$value ["addition"]] )) { return true; } else { return false; } break; case "number" : if (preg_match ( $validate [$value ["rule"]], $data [$value ["field"]] )) { return true; } else { return false; } break; case "function" : if (is_array ( $value ["addition"] )) { $function = $value ["addition"] [0]; array_shift ( $value ["addition"] ); if ($function ( implode ( ",", $value ["addition"] ) )) { return true; } else { return false; } } if (is_string ( $value ["addition"] )) { if ($value ["addition"] ()) { return true; } else { return false; } } break; case "length" : if (is_string ( $value ["addition"] )) { $value ["addition"] = explode ( ",", $value ["addition"] ); } switch (count ( $value ["addition"] )) { case 1 : if (strlen ( $data [$value ["field"]] ) == $value ["addition"] [0]) { return true; } else { return false; } break; case 2 : if (mb_strlen ( $data [$value ["field"]],"UTF8" ) >= $value ["addition"] [0] && mb_strlen ( $data [$value ["field"]],"UTF8" ) <= $value ["addition"] [1]) { return true; } else { return false; } break; default : return false; break; } break; case "unique" : $rs = $this->where ( array ( $value ["field"] => $data [$value ["field"]] ) )->find (); if (empty ( $rs )) { return true; } else { return false; } break; case "regex" : if (preg_match ( $value ["addition"], $data [$value ["field"]] )) { return true; } else { return false; } break; default : return false; break; } } /** * 是否进行自动完成 * * @param array $data * @param array $value */ private function isAuto(&$data, $value) { ( int ) $value ["operation"] = empty ( $value ["operation"] ) ? self::MODEL_INSERT : $value ["operation"]; if (($value ["operation"] == self::MODEL_BOTH) || ($value ["operation"] == $this->getOperation ( $data ))) { $this->auto ( $data, $value ); } } /** * 进行自动完成操作 * * @param array $data * @param array $value */ private function auto(&$data, $value) { switch ($value ["rule"]) { case "function" : if (is_string ( $value ["addition"] )) { $value ["addition"] = explode ( ",", $value ["addition"] ); } $function=$value["addition"]["0"]; array_shift($value ["addition"] ); $data [$value ["field"]] = $function( implode ( ",", $value ["addition"] ) ) ; break; case "const" : isset($data [$value ["field"]]) or $data [$value ["field"]]=$value ["addition"]; break; default : break; } } }
继续添加一个C方法,用于存储一些配置信息:
/** * 设置/读取 配置 * * @param string $name * @param string $value */ function C($name = null, $value = null) { static $_config = array (); if (empty ( $name )) { return $_config; } if (is_string ( $name )) { if (empty ( $value )) return $_config [$name]; else $_config [$name] = $value; } if (is_array ( $name )) $_config = array_merge ( $_config, $name ); return null; }
下面就是使用方法:
查询方法:
<?php $config=array("host"=>"127.0.0.1","user"=>"root","passwd","prefix"=>"m_"); C($config); $db=new Model("user");//对m_news表操作 //取出全部数据 $list=$db->select(); //等同于 select * from `m_user`; //条件查询 $list=$db->where("username="root"")->select(); //等同于 select * from `m_user` where `username="root" //支持数组条件查询 $map["username"]="root"; $list=$db->where($map)->select(); //等同于 select * from `m_user` where `username`="root"; //注意,尽量采用数组,因为会进行自动过滤 //条件查询or使用 $map[username|email]="root"; $list=$db->where($map)->select(); //等同于 select * from `m_user` where (`username`="root") or (`email`="root") 其他复杂条件查询 $id=array(1,2,3,4,5,6,7); $map["id"]=array("in",$id); $list=$db->where($map)->select(); //等同于 select * from `m_user` where (`id` in (1,2,3,4,5,6,7)); $map["date"]=array(">","2013-1-1"); $list=$db->where($map)->select(); //等同于 select * from `m_user` where `date`>"2013-1-1"; //选择字段查询 $list=$db->field("id","name","title")->select(); //等同于 selelect id,name,title from `m_news` //支持数组 $list=$db->field(array("id","name","title"))->select(); //等同于 select `id`,`name`,`title` from `m_news`; //注意,只要是数组里的,会根据字段默认都加上`符号,如果你是news.id这样的形式,就不会加`符号 //字段重命名方式(数组) $list=$db->field(array(array("id","uid"),"name"))->select(); //等同于 select `id` as `uid`,`name` from `m_news`; //limit order group 例子 $db->order("id desc,sort asc")->group("id")->limit(2,10); //看到这里,不写,你也看出来了吧 //只获取一条数据 $user=$db->where(array("id"=>1))->find(); //获取总数 $count=$db->count(); //自己执行sql语句 $list=$db->query("select * from m_news");
多表查询:
<?php $list=M("user"=>"user")->join("join m_role role on user.role_id=role.id")->find();
插入数据库:
<?php //配置神马的都同上.我就直接$db代表实话的model $data["username"]="root"; $data["password"]="111"; $data["email"]=xx@gmail.com"; $rs=$db->save($data); //如果数据库主键是自增长id,则返回新插入id值,否则返回true or false; //支持批量插入 $data[0]["username"]="root"; $data[0]["password"]="111"; $data[0]["email"]=xx@gmail.com"; $data[1]["username"]="root"; $data[1]["password"]="111"; $data[1]["email"]=xx@gmail.com"; $rs=$db->save($data); if($rs){ echo "成功"; }else{ echo "失败"; }更新数据库:
<?php $data["id"]=1; $data["username"]=2; $db->update($data); //自动查询表结构,并缓存表结构结果,默认条件语句是表的主键,如果id是表的主键,那么本次sql为: //update `m_user` set `username`="2" where `id`=1;删除数据库:
<?php $data["id"]=1; $db->where($data)->delete(); //或者 $db->delete($data); //支持批量删除 $id=array(1,2,3,4,5); $db->delete(array("id"=>$id));
接下来还有一些关于字段验证的方法:
需要新建一个model去继承这个model
格式如下:
array(
* @param string field
验证字段
* @param string rule
验证规则
* @param string error
错误提示
* @param mix
[addition] 附加规则
* @param int
[condition] 验证条件: 0:存在就验证EXISTS_VAILIDATE(默认)
1:必须验证:EXISTS_VAILIDATE
* @param int
[operation] 验证条件2:
0:插入数据库时验证:MODEL_INSERT 1:更新数据库时验证:MODEL_UPDATE 2:插入数据库和更新数据库都验证:MODEL_BOTH
* )
例子如下:
<?php class UserModel extends Model{ protected $_validate=array( array("username","unique","用户名必须唯一"), array("username","length","用户名必须在2到12个字符之间",array(2,12)), array("email","email","email格式不正确"), ); }等等,并且还支持自定义函数验证
调用例子如下:
<?php //假设db就是model实例化的对象 if(!$db->create()){ echo $db->getError(); };当不通过验证时,就输出.
并且还支持字段完整功能.如下:
<?php class UserModel extends Model{ protected $_aotu=array( array("time","function","time"), array("hidden","const","1"), array("date","function",array("date","Y-m-j")) ); }这些分别表示:
time字段在新增时默认为time()函数的值
hidden字段在新增时默认为1
date字段在新增时默认为当前时间;格式为 Y-m-j
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: php验证函数(包括email,url,日期等等)
- 下一篇:没有了