<?php
/**********************************************************************************
* Author:hit9
* github:@hit9
* url:http://hit9.github.com/wiki/php-mysql-orm
* Permission to use it for any purpose
* Dbç±»,è´è´£æ°æ®åºè¿æ¥ååºæ¬çCURD,å®ç°äºè¿è´¯æä½åäºå¡å¤ç
* é
置项:DB_HOST,DB_CHAR_SET,DB_NAME,DB_USER,DB_PASSWD,TABLE_PREFIX,QUERY_ERROR
* æ¯æ¬¡å®ä¾ååå©è¿æ¥æ°æ®åº
* å®ä¾åçåæ°:$classname(æ°æ®åºè¡¨çåå(ä¸å¸¦åç¼)),$primary_key(表主é®)
*
************************************************************************************/
/************************************* settingts ******************************************
define('DB_HOST','localhost');//æ°æ®åºæå¡å¨å°å,ä¸è¬ä¸ºlocalhost
define('DB_NAME','dbname');//æ°æ®åºåå
define('DB_USER','root');//æ°æ®åºç®¡çç¨æ·å
define('DB_PASSWD','******');//æ°æ®åºç®¡çå¯ç
define('TABLE_PREFIX','t_');//æ°æ®åºè¡¨ååç¼
define('DB_CHAR_SET','utf8');//æ°æ®åºè¿æ¥ç¼ç
define('QUERY_ERROR',true);//æ¯å¦è°è¯æ¨¡å¼,è°è¯æ¨¡å¼ä¸ä¼æ¾ç¤ºæ¥è¯¢æ¥é
/************************************************************************************/
class db
{
private static $conn;//æ°æ®åºè¿æ¥
private $table;//æ°æ®åºè¡¨åå
private $tablepre;//表åç¼
private $data;//ææ¶åæ¾åå
¥çæ°æ®çæ°ç»
private $options;//ææ¶åæ¾æ¥è¯¢æ¡ä»¶çæ°ç»
private $query_error=QUERY_ERROR;//æ¯å¦å¼å¯æ°æ®åºæ¥è¯¢é误æ¾ç¤º
//é»è®¤ç主é®
public $primary_key='id';
//æé 表å,åå§åæ°ç»,è¿æ¥æ°æ®åº
// åæ°$classname æ¯ä¸ä¸ªMod模åçç±»åå,æ¯å¦ 'UserMod'
function __construct($tablename,$primary_key='id')
{
$this->tablepre=TABLE_PREFIX;
$this->table=$this->tablepre.$tablename;
$this->primary_key=$primary_key;
$this->data=array();
$this->options=array();
$this->connect();//è¿æ¥æ°æ®åº
}
//设置类çç§æå±æ§
function __set($name,$value)
{
$this->data[$name]=$value;
}
//éè½½æ¹æ³
function __call($method,$args)
{
//妿æ¯limit or orderBy
if($method==='limit' or $method==='orderBy')
{
$this->options[$method]=$args[0];
return $this;// è¿åæ¤å¯¹è±¡
}elseif(preg_match("/like$/",$method))//like
{
$char=substr($method,0,-4);
$this->options['like']="`".$char."` LIKE '$args[0]'";
return $this;
}
elseif(preg_match("/^getBy/",$method))//妿æ¯getBy彿°,å°±æ ¹æ®å段ååºä¸ä¸ªç»ææ¥
{
$char=lcfirst(substr($method,5));//è·ååæ®µå,getByChar åæ®µåå¨å½æ°åä¸å¿
é¡»é¦åæ¯å¤§å
$sql="SELECT * FROM ".$this->table." WHERE ".$char."='$args[0]' LIMIT 1";
return mysql_fetch_object($this->query($sql));
}else{
if($this->query_error) exit('Unknown method: '.$method);
else exit('Something Wrong');
}
}
//where()
public function where($arg='')
{
if(is_array($arg))//ææ°ç»å½¢å¼çåæ°è§£ææå符串形å¼
{
$arr_str=array();
foreach ($arg as $key=>$var) {
$var=$this->check_input($var);
$arr_str[]=$key."='".$var."'";
}
$str_temp=implode(' AND ',$arr_str);
}elseif(is_string($arg))
{
$str_temp=$arg;
}
if(isset($this->options['where']))//å¦æå·²ç»æwhere
{
$this->options['where'].=" AND ".$str_temp;
}else{
$this->options['where']=$str_temp;
}
return $this;
}
public function select($arg='')
{
if(is_string($arg)) $this->options['select']=$arg;
else if(is_array($arg)){
$this->options['select']=implode(',',$arg);
}
return $this;
}
//æ¸
空optionsæ°ç»,ææè¿è´¯æä½çæåä¸ä¸ªæä½é½è¦æ¸
空optionsæ°ç»
private function empty_options()
{
$this->options=array();
}
//åä¾è¿æ¥æ°æ®åº,è¿åè¿æ¥ç¬¦å·
private function connect()
{
if(!self::$conn)
{
self::$conn=mysql_connect(DB_HOST,DB_USER,DB_PASSWD);
mysql_query('set names '.DB_CHAR_SET);
mysql_select_db(DB_NAME);
}
return self::$conn;
}
//ææ°æ®åæå符串
private function implodefields($cond)
{
$fields = array();
foreach($cond as $key => $value) {
//å®å
¨,转ä¹å符串,鲿³¨å
¥
$value = $this->check_input($value);
$fields[] = "$key='$value'";
}
return implode(', ', $fields);
}
//æ£æ¥è¾å
¥
private function check_input($value)
{
$value = str_replace("_","\_",$value);
$value = str_replace("%","\%",$value);
// å»é¤ææ
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// 妿䏿¯æ°ååå å¼å·
if (!is_numeric($value))
{
$value = mysql_real_escape_string($value);
}
return $value;
}
//æ¸
æ´dataæ°ç».ä¸ä¸ªacionæµç¨ä¸éè¦å¤æ¬¡åå
¥,æ¯åå®ä¸æ¬¡æ°æ®é½ä¼ä½¿ç¨æ¤æ¹æ³æ¸
æ´data
public function data_clean()
{
$this->data=array();
}
//æ¥è¯¢æ°æ®åº,è¿åæ¥è¯¢å¥æ
public function query($sql='')
{
if($sql=='')
{
$this->debug_error('SQL is empty');
}else{
$re=mysql_query($sql);
if(!$re) $this->debug_error('Query Error :'.mysql_error().' Your SQL is : '.$sql);
}
return $re;
}
//è·åä¸ä¸ªç»æéçæ°ç®
// åæ°:sqlè¯å¥,妿è¯å¥ä¸ºç©º,åæ¥è¯¢æ¡ä»¶whereçæ¥è¯¢æ¡ä»¶æé sqlè¯å¥,å¦ææ æ¥è¯¢æ¡ä»¶,ååºè¯¥è¡¨çè®°å½ä¸ªæ°
public function getNum($sql='')
{
//æ sqlè¯å¥ä¼ å
¥,æ¥çææ æ¥è¯¢æ¡ä»¶,å¦åå½ä½æ¥è¯¢è¡¨çè®°å½æ°å¤ç
if($sql=='')
{
if(!empty($this->options))//妿å颿è¿è´¯æä½
{
$sql="SELECT {$this->primary_key} FROM {$this->table}";
$sql=$this->parseoptions($sql);// è§£ææ¥è¯¢æ¡ä»¶æé sql
$this->empty_options();//è¿è´¯æä½çç»ç¹éè¦æ¸
空è¿è´¯æä½çæ°ç»options
}else{
$sql="SELECT {$this->primary_key} FROM {$this->table}";
}
}
return mysql_num_rows($this->query($sql));
}
//æå
¥æä½,å¨è¡¨ä¸å¢å ä¸ä¸ªè®°å½,è¿åæ§è¡ç»ætrue or false
public function add($arr=array())
{
$this->data=array_merge($this->data,$arr);
$fields = $this->implodefields($this->data);
$sql = "INSERT INTO {$this->table} SET $fields";
$this->data_clean();//dataæ°ç»æ¸
空
return $this->query($sql);
}
//æ¥è¯¢
//妿æç
§ä¸»é®æ¥è¯¢,åè¿åä¸ä¸ªå¯¹è±¡ä¾¿äºå¿«éè·ååæ®µå¼
//妿å为ä¸ä¸ªæ¥è¯¢çç»æé(åè¾¹æè¿è´¯æ¡ä»¶éå¶),åè¿åä¸ä¸ªäºç»´æ°ç»ä¾¿äºéå
public function find($id='',$fields='*')
{
if(isset($this->options['select'])) $fields=$this->options['select'];
//妿æåæ°ä¼ å
¥,è§ä½æ¥è¯¢ä¸»é®å¤ç
if(!empty($id))
{
$id=$this->check_input($id);
$sql="SELECT ".$fields." FROM {$this->table} WHERE {$this->primary_key}='$id' LIMIT 1";
$obj=mysql_fetch_object($this->query($sql));
return $obj;
}else{
if(!empty($this->options))//妿å颿è¿è´¯æä½
{
$sql="SELECT ".$fields." FROM {$this->table}";
$sql=$this->parseoptions($sql);// è§£ææ¥è¯¢æ¡ä»¶æé sql
$this->empty_options();//è¿è´¯æä½çç»ç¹éè¦æ¸
空è¿è´¯æä½çæ°ç»options
}else{
//å¦åè§ä½æ¥è¯¢å
¨é¨è®°å½
$sql="SELECT ".$fields." FROM {$this->table}";
}
$return_arr=array();
$re=$this->query($sql);
while($re_arr=mysql_fetch_array($re))
{
$return_arr[]=$re_arr;
}
return $return_arr;
}
}
//delete彿°
public function delete($id='')
{
//å¦æä¼ å
¥äºåæ°,æç
§ä¸»é®å é¤
if(!empty($id))
{
$id=$this->check_input($id);
$sql="DELETE FROM {$this->table} WHERE {$this->primary_key}='$id'";
return $this->query($sql);
}else{
$sql="DELETE FROM {$this->table}";
if(empty($this->options)) $this->debug_error('No Query Conditions for delete()');
$sql=$this->parseoptions($sql);// è§£ææ¥è¯¢æ¡ä»¶æé sql
$this->empty_options();
return $this->query($sql);
}
}
//æ¸
空表
public function empty_table()
{
$sql="TRUNCATE TABLE {$this->table}";
return $this->query($sql);
}
//update é¨å
public function update($arg1=NULL,$arg2=NULL)
{
if(isset($arg1))//妿æåæ°ä¼ å
¥
{
if(isset($arg2))//妿æä¸¤ä¸ªåæ°
{
if(!is_array($arg1) and is_array($arg2))
{
$this->data=$arg2;
$id=$arg1;
}else{
$this->debug_error('Wrong Use of function update($arg1,$arg2):If 2 arguments used,$arg1 must be primary_key and $arg2 must be data array');
}
}else{
if(is_array($arg1))//å¦æä½¿æç
§dataæ°ç»æ´æ°
{
$this->data=$arg1;
}else{
$id=$arg1;//å¦åè§ä½æç
§ä¸»é®æ´æ°
}
}
}
if(empty($this->data)) $this->debug_error('update() function can not found data to use');
$fields = $this->implodefields($this->data);
if(isset($id))//å¦æä½¿ç¨ä¸»é®æ´æ°æ¹å¼
{
$id=$this->check_input($id);
$sql="UPDATE {$this->table} SET ".$fields." WHERE {$this->primary_key}='$id'";
}else{//ä½¿ç¨æ¡ä»¶æ´æ°
$sql="UPDATE {$this->table} SET ".$fields;
if(empty($this->options)) $this->debug_error('No Query Conditions for update()');
$sql=$this->parseoptions($sql);// è§£ææ¥è¯¢æ¡ä»¶æé sql
$this->empty_options();
}
$this->data_clean();//dataæ°ç»æ¸
空
return $this->query($sql);
}
//ç´æ¥æ§è¡sqlè¯å¥
public function exec_sql($sql)
{
$sqltype = strtolower(substr(trim($sql),0,6));// æªåsqlè¯å¥ä¸çå6个å符串,å¹¶è½¬æ¢æå°å
$result = $this->query($sql);
$calback_arrary = array();// å®ä¹äºç»´æ°ç»
if ("select" == $sqltype)// 夿æ§è¡çæ¯selectè¯å¥
{
if (false == $result)
{
return false;
}
else if (0 == mysql_num_rows($result))
{
return false;
}
else
{
while($result_array = mysql_fetch_array($result))
{
array_push($calback_arrary, $result_array);
}
return $calback_arrary;// æåè¿åæ¥è¯¢ç»æçäºç»´æ°ç»,æ¢ç¶æ¥è¯¢å°çç»ææ¯å¤ä¸ª,è¾åºæ°ç»ä¾¿äºforeach
}
}
else if ("update" == $sqltype || "insert" == $sqltype || "delete" == $sqltype)
{
if ($result)
{
return true;
}
return false;
}
}
//è§£ææ¥è¯¢æ¡ä»¶
private function parseoptions($sql='')
{
$arr=$this->options;
//é¦å
æ£æ¥where
if(isset($arr['where']))
{
$sql.=" WHERE ".$arr['where'];
if(isset($arr['like']))//卿£æ¥whereçåæ¶æ£æ¥æ¯å¦ælikeåå¥
{
$sql.=" AND ".$arr['like'];
}
}else{
if(isset($arr['like']))
{
$sql.=" WHERE ".$arr['like'];//åªælikeæ å
¶å®whereçæ
å½¢
}
}
//æ£æ¥orderBy
if(isset($arr['orderBy']))
{
$sql.=" ORDER BY ".$arr['orderBy'];
}
//æ£æ¥limit
if(isset($arr['limit']))
{
$sql.=" LIMIT ".$arr['limit'];
}
return $sql;
}
//äºå¡å¤çé¨å,commit & rollback
// å¼å§ä¸ä¸ªäºå¡
public function begin()
{
$this->query('BEGIN');
}
//äºå¡å®æ
public function commit()
{
$this->query('COMMIT');
}
//äºå¡åæ»
public function rollback()
{
$this->query('ROLLBACK');
}
private function debug_error($msg)
{
if($this->query_error) echo $msg;//debugä¸,æ¾ç¤ºé误
}
//table() æ¹åå½åç表
public function table($tbl_name)
{
$this->table=$tbl_name;
return $this;
}
}