最近帮兄弟写一个企业网站,网站比较小,数组处理,涉及MySQL的增,删,改,查特别多,因此很繁琐.改了别人的Mysql操作类
该类非常轻量级,支持Mysql的增,删,改,查,并将所有查询建立在Memcache缓存服务器上,效率高.缺点是不支持:多表连贯操作!
配置的时候将,数据库地址,用户名,端口号(默认3306),密码,和Memcache地址,端口(默认11211),重新写下,就可以使用了.
废话少说,上代码
<?php class Model{ protected $host='127.0.0.1'; protected $port='3306'; protected $user='root'; protected $pwd='123456'; protected $dbname='test'; protected $charset='utf8'; protected $table; protected $link; protected $sql; protected $mserver='127.0.0.1'; protected $mport='11211'; protected $cache_time='15'; //实例化的时候,传入表名 public function __construct($table){ $this->table=$table; $this->link=$this->connect(); } //链接数据库 public function connect(){ $conn = mysql_connect($this->host.':'.$this->port,$this->user,$this->pwd); if(!$conn) { die("Connect Server Failed: " . mysql_error()); } if(!mysql_select_db($this->dbname)) { die("Select Database Failed: " . mysql_error()); } mysql_set_charset($this->charset); return $conn; } //查询有结果集所调用的query方法,也可以,直接query(自定义sql语句,无视下面的select方法等) public function query($sql){ $this->sql=$sql; $result=mysql_query($sql); $data=array(); if (mysql_affected_rows()>0) { while($row=mysql_fetch_assoc($result)){ $data[]=$row; } return $data; }else{ die($sql."\n".'没有查询符合该条件的记录'); } } //所有查询,都从memcahe中取,如果没有再去mysql中取 public function memcache($sql){ $mem=new Memcache(); $data=''; //如果连接失败,表示服务器没有安装memcahe if (@!$mem->connect($this->mserver,$this->mport)) { $data=$this->query($sql); }else{ $key=md5($sql); $data=$mem->get($key); if (!$data) { $data=$this->query($sql); $mem->set($key,$data,MEMCACHE_COMPRESSED,$this->cache_time); echo '如果出现这句话,就表示从mysql中查询数据,反之,从memcache取的数据,效率高'; } $mem->close(); } return $data; } //执行插入,删除,修改,等操作时,调用该方法 public function execute($sql,$ms){ $this->sql=$sql; $result=mysql_query($sql); if ($result) { return mysql_affected_rows();//操作成功,返回成功记录的数量 }else{ die($ms.'执行该条的SQL语句是:'.$sql);//执行相关操作,错误时返回的消息 } } //查询表中的总数,默认为表中id的总数,where条件,默认为空,需要调用时传入如:id>5等 public function acount($where=''){ //设置别名,若不设置,返回的数组中键是[count(id)],比较怪异,设置后键为count if(empty($where)){ $sql="select count(id) as count from $this->table"; }else{ $sql="select count(id) as count from $this->table where $where"; } $data=$this->memcache($sql); return $data[0]['count']; } //按字段查询,第一个参数多条件传入时,用逗号,分开如:id,name,xxxx,如第一个参数为*,即查询所有 public function select($field,$where='',$order='',$limit=''){ $sql="select $field from $this->table $where $order $limit"; if(!empty($field)){ //注意这些关键词后面有空格 if (!empty($where)){ $where='where '.$where; } if (!empty($order)) { $order='order by '.$order; } if (!empty($limit)) { $limit='limit '.$limit; } $sql="select $field from $this->table $where $order $limit"; $data=$this->memcache($sql); return $data; }else{ die('请检查select方法参数,该方法的sql语句有误:'.$sql); } } //添加数据,传入参数是数组如:一维数组array('name'=>$n,'city'=>$c,) //二维数组array(array('name'=>$n,'city'=>$c,),array('name'=>$n2,'city'=>$c2,)) public function add($data){ $k=''; $v=''; $v2=''; foreach ($data as $key=>$value) { if(is_array($value)){ $tmp=''; foreach ($value as $key2=>$value2) { //只取二维数组里面第一个数组下面键对应的值,也就是mysql中的字段,(因为二维数组里面第二个,第三个..等数组键都是一样的) if ($key<1) { $k.=$key2.','; } $tmp.="'$value2'".','; } $v2.='('.rtrim($tmp,',').'),'; }else{ $k.=$key.','; $v.='"'.$value.'",'; } } $k=rtrim($k,','); $sql="insert into $this->table($k) values "; if (empty($v)) { $sql.=rtrim($v2,','); }else{ $v='('.rtrim($v,',').')'; $sql.=$v; } return $this->execute($sql,'添加失败!'); } //修改,更新mysql记录,第一个参数传数组(一位数组)如:array('name'=>'张三','city'=>'南京'),第二个参数一般是条件,比如id>5,id=5,id in(15,16)等,后面参数两个相对用的比较少 public function update($data,$where,$order='',$limit=''){ $k=''; foreach ($data as $key=>$value) { $k.=$key.'='."'$value'".','; } $k=rtrim($k,','); if (!empty($where)) { $where='where '.$where; } if (!empty($order)) { $order='order by '.$order; } if (!empty($limit)) { $limit='limit '.$limit; } $sql="update $this->table set $k $where $order $limit"; return $this->execute($sql,'修改失败!'); } //删除表中记录,如果第一个参数为空,则启用第二参数,条件删除如:id>5或则id>5 and age=6 public function delete($data,$and=''){ if(!empty($data)){ if (is_int($data)) { $data='where id='.$data; }else if (is_array($data)) { $data='where id in('.join(',',$data).')'; }else{ die("第一个参数请传入整型或者数组类型"); } $sql="delete from $this->table $data"; }else{ if((int)$and){ die("第二个参数错误"); }else{ $sql="delete from $this->table where $and"; } } return $this->execute($sql,'删除失败!'); } //查看sql语句,一般用不到,因为操作一旦失败,程序自动输出sql语句 public function __get($pname){ if ($pname=='sql') { return $this->sql; } } public function __destruct(){ mysql_close(); } } ?>
调用如下:
/** select 方法 4个参数:field字段,where条件,order顺序,limit数量 //$r=$m->select('*');//查询所有记录 //查出表中id,name,age,num_iid字段对应的值,条件是id<10并且num_iid!=0,按age倒叙排列,取5条记录 //$r=$m->select('id,name,age,num_iid','id<100 and num_iid!=0','age desc',10) **/ /** *add 方法 参数1个,传入一位数组或者二维数组 $arr=array( array('name'=>'昆山','province_id'=>4), array('name'=>'张家港','province_id'=>5), array('name'=>'吴江','province_id'=>6), array('name'=>'常熟','province_id'=>7), array('name'=>'太仓','province_id'=>8), ); *$arr=array('name'=>'太仓','province_id'=>8); //$r=$m->add($arr); **/ /** * update方法 4个参数:第一个参数是一维数组,where条件,order顺序,limit数量 *$arr=array('name'=>'太仓','province_id'=>8); *$r=$m->update($arr,'id>10','','');//后面两个参数相对用的很少 **/ /** * delete 方法两个参数:第一个参数要么是整型数字要么传入数组,默认删除的是mysql中的id,如果开启条件删除第一个参数必须为空,反之第二个为空 *$r=$m->delete((int)$num)//如果第1参数不是数组,必须将该字符串转为整型,delete from table where id=1 $r=$m->delete(array(1,2,4,5,6,999));批量删除id in("数组")的记录 条件删除,必须将第一个参数设置为空 $r=$m->delete('','id>6 and age=100') PS:删除操作是敏感操作,稍有不慎可能数据全部删除,例如delete from TABLE_NAME where NUM NUM为数字,只要NUM等于非零的(整型)或者(字符串型)的数字,表中的数据会全部删除,因此删除最好调用自定义$m->query("SQL"),方法 **/
/*
acount方法查总数,一个参数默认为空
$r=$m->acount();//查询表中的总记录条数
$r=$m->acount('age<18')//age小于18的记录数
*/