彷hibernate数据库操作
<?php/** * @author:zhangmingshuang * @version:2011-10-13 * @param: */function __autoload($class_name){require(HIBERNATE_PATH.$class_name.".hbm.php");}/** * 类似JAVA的HIBERNATE操作 * 注意点: * 1.模型层文件命名型为:tablename.hbm.php (如果要使用别的命名方式,则需要更改autoload方法里的文件名格式) * 2.模型层的class的名为:表名 (例:class tablename{.......}) * 3.模型层的字段需要与表的字段一致 * */class hibernate{private $table_name = "";private $table_fileds = "";private $fileds_value = "";//privatevar $host; //地址localhost:3306var $name; //用户名var $pass; //密码var $db; //数据库名var $encode; //字符编码 ,utf8, 不是utf-8。or gbk//构造函数function __construct($host, $name, $pass, $db, $encode='utf8'){$this->host = $host;$this->name = $name;$this->pass = $pass;$this->db = $db;$this->encode = $encode;$this->connect();}//连结数据库function connect(){$conn = mysql_connect($this->host, $this->name, $this->pass) or die("Could not connect : " . $this->error());mysql_select_db($this->db) or die ("Could not select database : " . $this->error());mysql_query("SET NAMES '$this->encode'"); //设置编码,防止中文乱码}//析构函数function __destruct(){$this->close();}/** * 保存数据 * @param $class_handle : 类句柄 */function save($class_handle){$this->set_table_filed($class_handle);$fileds = substr($this->table_fileds, strpos($this->table_fileds,",")+1,strlen($this->table_fileds));$values = substr($this->fileds_value, strpos($this->fileds_value,",")+1,strlen($this->fileds_value));$sql = "INSERT INTO `".$this->table_name."`(".$fileds.") VALUES(".$values.")";$this->query($sql);}/** * 得取刚新增的ID */ function get_insert_id(){ return mysql_insert_id(); } /** * 获取数据 * @param$class_handle : 类句柄 * @param$val : 值 * @param$primary_key : 主建字段(默认为:模型层的第一个var) */ function get($class_handle,$primary_key_val,$primary_key=''){ $table_name = $this->get_table_name($class_handle);//取得表名 $filed_value_array = $this->get_filed_value($class_handle);//取得字段与值if(empty($primary_key)){//如果主键未输入,则默认为模型层的第一个VAR//取得模型层的第一个VARforeach ($filed_value_array as $key=>$value) {$primary_key = $key;break;}} $sql = "SELECT * FROM `".$table_name."` WHERE `".$primary_key."` = '".$primary_key_val."'"; $res = $this->query($sql); //mysql_fetch_array 为 mysql_fetch_row 扩展 可取出字段 $rows = mysql_fetch_array($res); if(!empty($rows)){ foreach($rows as $key=>$val){ if(is_numeric($key)){//删除 key 为数字的数据 unset($rows[$key]); } } $set_array = $this->get_class_set($class_handle);//取得字段 if(class_exists($table_name)){ $obj = new $table_name(); //将值SET进类中 foreach($rows as $key=>$val){//取出取得的数据库数据的第一个记录(如:ID)匹配foreach ($set_array as $k => $v){if(strtolower($v)=='set'.$key){$obj->$v($val); }} }return $obj; } }else{ return new $table_name(); } } /** * * 更新数据 * @param $class_handle : 类句柄 * @param $primary_key : 主建字段(默认为:模型层的第一个var) */ function update($class_handle,$primary_key=""){ $table_name = $this->get_table_name($class_handle);//取得表名$filed_value_array = $this->get_filed_value($class_handle);if(empty($primary_key)){//取得模型层的第一个VARforeach ($filed_value_array as $key=>$value) {$primary_key = $key;break;}}foreach ($filed_value_array as $k=>$v){if($k!=$primary_key){$set_sql .= "`".$k."`='".$v."',";}}$set_sql = rtrim($set_sql,",")."WHERE `".$primary_key."`='".$filed_value_array[$primary_key]."'";$sql = "UPDATE `".$table_name."` SET ".$set_sql;$this->query($sql); } /** * 删除数据 * @param$class_handle : 类句柄 * @param$primary_key_val : 要删除的值 * @param$primary_key : 主建字段(默认为:模型层的第一个var) */ function delete($class_handle,$primary_key_val,$primary_key=''){ $table_name = $this->get_table_name($class_handle);//取得表名$filed_value_array = $this->get_filed_value($class_handle);if(empty($primary_key)){//取得模型层的第一个VARforeach ($filed_value_array as $key=>$value) {$primary_key = $key;break;}}$sql = "DELETE FROM `".$table_name."` WHERE `".$primary_key."` = '".$primary_key_val."'";if(is_array($primary_key_val)){$primary_key_val = implode(",", $primary_key_val);$sql = "DELETE FROM `".$table_name."` WHERE `".$primary_key."`in(".$primary_key_val.")";}$this->query($sql); } /** * 查找数据 * @param $class_handle */ function find($class_handle,$order="",$order_by="DESC"){ $table_name = $this->get_table_name($class_handle);//取得表名 $sql = "SELECT * FROM `".$table_name."` WHERE 1 = 1"; if(!empty($order)){ $sql .= " ORDER BY ".$order." ".$order_by; } return $this->query($sql); } /** * 根据条件查找数据 * @param$sql : SQL语句 * @param$filed_arr : 条件 *///阻止sql注入function p_filterXss($str){$str = addslashes($str);$str = mysql_real_escape_string($str);return $str;} function query_by_sql($sql,$filed_arr){ //取出SQL语句中的?代替为字段 for($i=0;$i<count($filed_arr);$i++){ $filed_obj = mysql_real_escape_string(addslashes(trim($filed_arr[$i])));if(strstr($sql,"?")){$x_index = strpos($sql,"?");//找到第一个?//将语句分成二段$sql = substr($sql, 0,$x_index)."'".$filed_arr[$i]."'".substr($sql, $x_index+1,strlen($sql));} } return $this->query($sql); } /** * 分頁查詢 * @param$sql 查詢語句 * @param$page 當前頁 * @param$pageSize 每頁條數 */ function find_by_page($sql,$page,$page_size=10,$filed_arr=array()){ //取出SQL语句中的?代替为字段 for($i=0;$i<count($filed_arr);$i++){ $filed_obj = mysql_real_escape_string(addslashes(trim($filed_arr[$i])));if(strstr($sql,"?")){$x_index = strpos($sql,"?");//找到第一个?//将语句分成二段$sql = substr($sql, 0,$x_index)."'".$filed_arr[$i]."'".substr($sql, $x_index+1,strlen($sql));} } $page = empty($page) ? 1 : $page; return $this->query($sql." LIMIT " . ($page-1) * $page_size . ",$page_size"); } //返回记录集function get_rows($result){$rowNum = @mysql_num_rows($result);if ($rowNum > 0){for ($i=0; $i<$rowNum; $i++){$rows[$i] = mysql_fetch_array($result);}}return $rows;}//返回错误function error(){return mysql_error();}//关闭function close() {return @mysql_close();}/** * mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。 * 对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。 ** @param string $sql * return TRUE/FALSE or 资源标识符 */function query($sql){$result =mysql_query($sql) or die("Query failed : " . $this->error());return $result;}//統計記錄數function count($result){$rows_num = mysql_num_rows($result);return $rows_num;} /** * 将类名(表名)与类里的var(字段名)历遍取出 * @param $class_handle:类句柄 */function set_table_filed($class_handle){$this->table_name = get_class($class_handle);//取得表名$object_vars = get_object_vars($class_handle);//取得字段与值//将字段数组转成字符串$filed_array = array();$value_array = array();foreach ($object_vars as $key=>$val){array_push($filed_array, '`'.$key.'`');array_push($value_array, '\''.$val.'\'');}$this->table_fileds = implode(",", $filed_array);$this->fileds_value = implode(",", $value_array);}/** * 获取表名 * @param unknown_type $class_hanle */function get_table_name($class_handle){return get_class($class_handle);}/** * 取得类中的属性,生成SET的方法 * @param unknown_type $class_handle */function get_class_set($class_handle){$new_array = array();$filed_array = get_object_vars($class_handle);//取得字段与值foreach ($filed_array as $key=>$val){array_push($new_array, "set".ucfirst($key));}return $new_array;}/** * 取得类中的属性及对应值 * @param unknown_type $class_handle */function get_filed_value($class_handle){return get_object_vars($class_handle);//取得字段与值}}#--------------------Example-------------------------------#要使用此方法需要配置HIBERNATE_PATH常量,指向:模型层的路径(model/)#model模层建立规则:#1.名字:类名.hbm.php #2.类名:table_name (class table_name{ })#3.字段:即对表相对应的字段名(要与数据库一致)(var $id="";var $username="".....)#4.要配置GETAND SET 方法#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#使用方法#首先,需要实例化:hibernate对像即#$hibernate = new hibernate(DB_HOST, DB_USER, DB_PASS, DB_NAME);#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#**调用保存# $admin = new admin(); //不用配置inclue(requireor include_onceor require_once)#$admin->setUsername('admin');#$admin->setNo('no');#....#$hibernate->save($admin);#**获取刚刚新增的数据ID#$id = $hibernate->get_insert_id();#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#**根据ID获取数据#$admin = new admin();//因为无法预知是否会事先初使化数据,所以,所有方法需要调进句柄#$admin_get = $hibernate->get($admin,$id);//具体参数请自己查看#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#**更新#$admin = new admin();#$admin_get = $hibernate->get($admin,$id);#$admin_get->setUsername('admin');#$admin_get->setNo('no');#$hibernate->update($admin_get);//更新的时候,不传ID 但是不能执行 $admin_get->setId(1),这样就更新别的数据了#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#**删除#$admin = new admin();#$hibernate->delete(id);//ID可以为1或者数组#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#**查找数据##?>
页:
[1]