mysql 数据库访问层_MYSQL数据库访问层

/**

* 数据访问层,仅处理MYSQL

* 包括

* by:李勇

* at:2009-01-19

*/final classDalSplite{

public function__construct(PDO $pdo){

}

}/**

* 指定库中的指定表的访问类

*

*/final classDalTable{

private$pdo;

private$tableName;

private$meta;

private$primaryKey;/**

* 构造方法

*

* @param PDO $pdo

* @param string $tableName

*/public function__construct(PDO $pdo,$tableName){

if(!is_string($tableName)) returnnull;$this->pdo=$pdo;$this->tableName=$tableName;$this->meta=false;$this->primaryKey=false;

return$this;

}/**

* 获取本表的表结构(元数据),失败时返回0

*

* @return 0/array:=>array(列信息)

*/private functiongetMeta(){

if($this->meta!==false)return$this->meta;$sql="DESCRIBE ".$this->tableName;$table=$this->query($sql);

if(!$tableor !count($table)){$this->meta=0;

}else{$meta=array();

foreach ($tableas$col) {$meta[$col['Field']]=$col;

}$this->meta=$meta;

}

return$this->meta;

}/**

* 获取本表的主键字段,无主键或组合主键时返回0

*

* @return 0/主键字段名

*/private functiongetPrimaryKey(){

if($this->primaryKey!==false)return$this->primaryKey;$sql="SHOW INDEX FROM ".$this->tableName;$table=$this->query($sql);

if(!$tableor !count($table)){$this->primaryKey=0;

}else{$pkvs=array();

foreach ($tableas$row) {

if($row['Key_name']=='PRIMARY')$pkvs[]=$row['Column_name'];

}

if(count($pkvs)!=1){$this->primaryKey=0;

}else{$this->primaryKey=$pkvs[0];

}

}

return$this->primaryKey;

}/**

* Enter description here...

*

* @param bool $distinct    是否消重

* @param mixed $fields     请参考createFields

* @param mixed $where      请参考createWhere

* @param mixed $groupby    请参考createGroupby

* @param mixed $having     请参考createHaving

* @param mixed $orderby    请参考createOrderby

* @param mixed $limit      请参考createLimit

* @return mixed    单值/一维无键数组/一维有键数组/二维数组(一维无键,二维有键)

*/private function_select($distinct,$fields=null,$where=null,$groupby=null,$having=null,$orderby=null,$limit=null){

if(is_object($fields))$fields=get_object_vars($fields);

if(!$whereand !$groupbyand !$havingand !$orderbyand !$limitandis_array($fields) and isset($fields['fields'])){

if(isset($fields['where']))$where=$fields['where'];

if(isset($fields['groupby']))$groupby=$fields['groupby'];

if(isset($fields['having']))$having=$fields['having'];

if(isset($fields['orderby']))$orderby=$fields['orderby'];

if(isset($fields['limit']))$limit=$fields['limit'];$fields=$fields['fields'];

return$this->_select($distinct,$fields,$where,$groupby,$having,$orderby,$limit);

}$fields=$this->createFields($fields);$where=$this->createWhere($where);$groupby=$this->createGroupby($groupby);$having=$this->createHaving($having);$orderby=$this->createOrderby($orderby);$limit=$this->createLimit($limit);$sql='SELECT ';

if($distinct)$sql.='DISTINCT ';$sql.=$fields;$sql.=" FROM ".$this->tableName." ";$sql.=$where.$groupby.$having.$orderby.$limit;$set=$this->query($sql);$rows=count($set);

if($rows)$cols=count($set[0]);

else$cols=0;

if($rows==1and$cols==1){$col=array();

foreach ($set[0] as$cell) {$col[]=$cell;

}

return$col[0];

}

if($rows==1){

return$set[0];

}

if($cols==1){$col=array();

foreach ($setas$row) {$col[]=$row[0];

}

return$col;

}

return$set;

}/**

* 返回查询结果

*      请参考_select

*/public functionselect($fields=null,$where=null,$groupby=null,$having=null,$orderby=null,$limit=null){

return$this->_select(false,$fields,$where,$groupby,$having,$orderby,$limit);

}/**

* 返回消重后的查询结果

*      请参考_select

*/public functiondistinct($fields=null,$where=null,$groupby=null,$having=null,$orderby=null,$limit=null){

return$this->_select(true,$fields,$where,$groupby,$having,$orderby,$limit);

}/**

* 插入一条数据

*

* @param array[1] $row

*      =>

* @return int

*/public functioninsert($row){

if(!$row)returnfalse;

if(is_object($row))$row=get_object_vars($row);

if(!is_array($row))returnfalse;$meta=$this->getMeta();$fields='';$values='';

foreach ($rowas$name=>$value){

if(!is_string($name))continue;

if(!isset($meta[$name]))continue;

if($fields)$fields.=' , ';$fields.=$name;

if($values)$value.=' , ';$values.="'".mysql_escape_string($value)."'";

}

if(!$fieldsor !$values)returnfalse;$sql="INSERT INTO ".$this->tableName.'('.$fields.') VALUES('.$values.')';$count=$this->execute($sql);

if(!$count)returnfalse;

return$this->pdo->lastInsertId();

}/**

* 删除表中的部分数据

*

* @param mixed $where

*      请参考createWhere

* @return int

*/public functiondelete($where){$where=trim($this->createWhere($where));

if(!$where)returnfalse;$sql="DELETE FROM ".$this->tableName." ".$where;

return$this->execute($sql);

}/**

* 删除表中全部数据

*

* @return int

*/public functiondeleteAll(){$sql="DELETE FROM ".$this->tableName;

return$this->execute($sql);

}/**

* 修改表中的部分数据

*

* @param array[1] $row

*      =>

* @param mixed $where

*      请参考createWhere

* @return int

*/public functionupdate($row,$where){

if(!$row)returnfalse;

if(is_object($row))$row=get_object_vars($row);

if(!is_array($row))returnfalse;$meta=$this->getMeta();$set='';

foreach ($rowas$name=>$value){

if(!is_string($name))continue;

if(!isset($meta[$name]))continue;

if($set)$set.=' , ';$set=$name."='".mysql_escape_string($value)."' ";

}

if(!$set)returnfalse;$where=$this->createWhere($where);

if(!$where)returnfalse;$sql="UPDATE ".$this->tableName." SET ".$set." ".$where;

return$this->execute($sql);

}/**

* 生成字段列表

*

* @param mixed $fields

*      null/''/0   所有字段

*      string      直接使用

*      object/array

*

*          =>

* @return string

*/private functioncreateFields($fields=null){

if(!$fields)return'*';

if(is_string($fields)) returntrim($fields);

if(is_object($fields))$fields=get_object_vars($fields);

if(!is_array($fields)) return'*';$ret='';

foreach($fieldsas$key=>$value){

if(is_int($key)){

if(!is_string($value))continue;

if($ret)$ret.=' , ';$ret.=$value;

continue;

}

if(!is_string($value))continue;

if($ret)$ret.=' , ';$ret.=$key.' AS '.$value;

}

return$ret;

}/**

* 生成WHERE子句

*

* @param mixed $where

*      参考createCondition

* @return string

*/private functioncreateWhere($where){$condition=$this->createCondition($where);

if(!$condition)return'';$condition=trim($condition);

if(strpos(strtoupper($condition),'WHERE')===0)return$condition;

return'WHERE '.$condition;

}/**

* 生成HAVING子句

*

* @param mixed $having

*      参考createCondition

* @return string

*/private functioncreateHaving($having){$condition=$this->createCondition($having);

if(!$condition)return'';$condition=trim($condition);

if(strpos(strtoupper($condition),'HAVING')===0)return$condition;

return'HAVING '.$condition;

}/**

* 生成 GROUP BY 子句

*

* @param mixed $groupby

*      参考createSort

* @return string

*/private functioncreateGroupby($groupby){$sort=$this->createSort($groupby);

if(!$sort)return'';$sort=trim($sort);

if(strpos(strtoupper($sort),'GROUP')===0)return$sort;

return'GROUP BY '.$sort;

}/**

* 生成 ORDER BY 子句

*

* @param mixed $orderby

*      参考createSort

* @return string

*/private functioncreateOrderby($orderby=null){$sort=$this->createSort($orderby);

if(!$sort)return'';$sort=trim($sort);

if(strpos(strtoupper($sort),'ORDER')===0) return$sort;

return'ORDER BY '.$sort;

}/**

* 生成列排序子句,用于Order By与Group By中

*

* @param mixed $sort

*      string  直接使用

*      object/arrray

*           ASC|asc|DESC|desc

*          [|=>,...]

* @return string

*/private functioncreateSort($sort=null){

if(!$sort)return'';

if(is_string($sort)) returntrim($sort);

if(is_object($sort))$sort=get_object_vars($sort);

if(!is_array($sort)) return'';

if(count($sort)==2and (strtoupper($sort[1])=='ASC'orstrtoupper($sort[1])=='DESC')) return$sort[0].' '.strtoupper($sort[1]);$meta=$this->getMeta();$ret='';

foreach ($sortas$key=>$value) {

if(is_int($key)){

if(!isset($meta[$value]))continue;

if($ret)$ret.=' , ';$ret.=$value;

continue;

}

if(strtoupper($value)=='ASC'orstrtoupper($value)=='DESC'){

if(!isset($meta[$key]))continue;

if($ret)$ret.=' , ';$ret.=$key.' '.strtoupper($value);

continue;

}

continue;

}

return$ret;

}/**

* 生成分页子句

*

* @param mixed $limit

*      string  直接使用,其中可包含LIMIT

*      int     只限制行数,不限制偏移

*      object/array

*          [limit/LIMIT/Limit=>,Offset/offset/OFFSET=>]

*          [,]

*          []

* @return string

*/private functioncreateLimit($limit=null){

if(!$limit)return'';

if(is_string($limit)){$limit=trim($limit);

if(strpos(strtoupper($limit),'LIMIT')===0) returnstrtoupper($limit);

return'LIMIT '.$limit;

}

if(is_int($limit)) return'LIMIT '.$limit;

if(is_object($limit))$limit=get_object_vars($limit);

if(!is_array($limit))return'';$l=null;$o=null;

if(isset($limit['Limit']))$l=$limit['Limit'];

if(isset($limit['limit']))$l=$limit['limit'];

if(isset($limit['LIMIT']))$l=$limit['LIMIT'];

if(isset($limit['Offset']))$o=$limit['Offset'];

if(isset($limit['offset']))$o=$limit['offset'];

if(isset($limit['OFFSET']))$o=$limit['OFFSET'];

if($l){

if($o){

return'LIMIT '.$l.' OFFSET '.$o;

}

return'LIMIT '.$l;

}

if(count($limit)==2){$l=$limit[1];$o=$limit[0];

return'LIMIT '.$l.' OFFSET '.$o;

}

if(count($limit)==1) return'LIMIT '.$limit[0];

return'';

}/**

* 生成条件表达式,用于Where,Having子句中

*

* @param mixed $condition

*      string  直接使用

*      int     主键值

*      object/array and组合

*          PrimaryKey=>主键值

*          列名=>列值(string/int)

* @return string

*/private functioncreateCondition($condition=null){

if(is_null($condition)) return'';

if(is_string($condition)) returntrim($condition);

if(is_int($condition)){

if($this->getPrimaryKey())

return$this->getPrimaryKey()."='".$condition."' ";

return'';

}

if(is_object($condition))$condition=get_object_vars($condition);

if(!is_array($condition))return'';

if(isset($condition['PrimaryKey'])){

if($this->getPrimaryKey())

return$this->getPrimaryKey()."='".mysql_escape_string($condition['PrimaryKey'])."'";

return'';

}$meta=$this->getMeta();$ret='';

foreach ($conditionas$key=>$value) {

if(!is_int($key)){

if(!isset($meta[$key]))continue;

if(!is_int($value)&&!is_string($value))continue;

if(is_string($value))$value=trim($value);

if($ret)$ret.=' and ';$ret.=' '.$key."='".mysql_escape_string($value)."' ";

continue;

}

}

return$ret;

}/**

* 执行SQL语句,并返回影响的行数

*

* @param string $sql

* @return int

*/public functionexecute($sql){

if(!is_string($sql)) returnfalse;

return$this->pdo->exec(trim($sql));

}/**

* 查询并返回结果集

*

* @param string $sql

* @return array[2]

*/public functionquery($sql){

if(!is_string($sql)) returnfalse;

return$this->pdo->query(trim($sql));

}

}/**

* 本程序包的异常类

*

*/classDalExceptionextendsException{//所有异常情况constDE_PARAMETER_TYPE=1001;

constDE_UNKNOWN=2000;//所有异常情况的文字表达static private$msgs=array(self::DE_PARAMETER_TYPE=>'参数类型错误:类:的方法:的第个参数的类型应该是类型,但现在是类型,值为:',self::DE_UNKNOWN=>'未知错误');

public function__construct($code=0,$msg=null) {

if(isset(self::$msgs[$code])){

if(is_string($msg)){$message=$msg;

}else if(is_array($msg)){$message=vsprintf(self::$msgs[$code],$msg);

}else{$message=self::$msgs[$code];

}

}else{$code=self::DE_UNKNOWN;

if(is_string($msg)){$message=$msg;

}else{$message='错误代码:'.$code;

}

}parent::__construct($message,$code);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bootstrap 输入错误提示_win7系统提示explorer.exe应用程序错误怎么办

在电脑当中弹出错误提示框可谓是多种多样,详细有很多电脑都有碰到过,最近有位win7系统用户在使用电脑的过程中,系统总是提示“explorer.exe应用程序错误”,用户不知道怎么解决这个问题,为此非常苦恼,那么wi…

mysql 分页效率_MYSql分页查询效率提高

CREATE TABLE goods (UrlId char(100) CHARACTER SET utf8 NOT NULL,Title varchar(100) CHARACTER SET utf8 DEFAULT NULL,CreateTime char(30) CHARACTER SET utf8 DEFAULT NULL,PRIMARY KEY (UrlId))上面是本人表格的结构,本人的程序是用来做搜索引擎的&#xff…

json阅读器_Flutter小说阅读器系列一:使用Bloc模式获取起点小说关键字提示

Bloc模式下的小说关键字提示效果图最近难得有些闲暇时间,所以我又打算做一个小说阅读器,以前倒是用RNGolang写了一个,不过当时太过放飞自我导致自己看起来都很费力,这次我准备换成Flutter试一下。先简单将小说阅读器分为以下几个部…

python获取mysql中的数据供js调用_详解js文件通过python访问数据库方法

我来教你 js文件怎么通过python访问数据库,希望能够为你带来帮助。 1、如果是要提交表单内容给 服务器的 python 处理,那么只需要在表单 里面的 action 填写服务端的处理路由就可以了。或者用 指向服务器路由get querystring。前端方面不需要python啊。…

python 初始化一个4维向量_看图学NumPy:掌握n维数组基础知识点,看这一篇就够了...

摘要:NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具。国外有位程序员讲NumPy的基本运算以图解的方式写下来,让学习过程变得轻松有趣。 NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具。然而对初学者来说,NumPy的大量运算…

fasterrcnn tensorflow代码详解_pytorch目标检测代码的一些bug调试

这几天一直在做调包侠,是时候来总结总结了。记录一些我所遇到的不常见的问题。faster rcnn:参考代码:jwyang/faster-rcnn.pytorch​github.compytorch代码调试,相较于tensorflow的版本要友好一些,不用创建软连接啥的,数…

win8 mysql6_Win8系统 MySQL 6.0 安装图解

Win8系统 MySQL 6.0 安装图解(作者:wanghui2015/04/08)1、首先双击mysql-6.0.10-msi,会出现如下图所示界面。点击next;2、出现如下界面:这三个为选择安装类型,新手可以选择Typical或Complete就可以了。咱们为了看一下安…

python 对比文件内容差异_使用Python来比较文件夹并提取差异部分

在客户那边建库,需要把几百个G几十万个文件导入到Oracle里,好不容易导完了才发现中间缺了好几大块数据,约有四分之一吧,郁闷得很。 数据是客户从第三方买的,据客户分析是拷贝过来的时候有部分数据漏掉了,但…

mysql查询缓存到redis_php查询mysql并缓存到redis

首先安装redis,并在php环境中开启php_redis扩展。下面不多说了,直接上代码$redis new redis();$redis->connect(127.0.0.1, 6379);$blog $redis->get(redisrow);//如果$blog数组为空,则去数据库中查询,并加入到redis中if(…

python画锯齿波_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统

如前篇所介绍,用Shell Lab测试台软件配合之前介绍的任意款实验板,都能方便地实现ADC电压测量,但遇到两个问题:示例代码虽然众多,但大都默认ShellLab类型的控制器,需要手动改为Mcush.Mcush类型才能运行&…

java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase

转载自微信公众号Hadoop实操温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github:https://github.com/fayson/cdhproject提示:代码块部分可以左右滑动查看噢1文章编写目的越…

python归并排序算法实现_python算法实现系列-归并排序

效率比较高的归并排序&#xff0c; 有两种方式。1.使用递归def merge(left, right):result []i,j 0, 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i 1else:result.append(right[j])j 1result left[i:]result right[j…

python编程教程交互式联系_Python Koans交互式教程

Python Koans是一个学习Python编程语言的交互式教程&#xff0c;通过解决当中的问题来更深刻地理解Python。本系列文章为在此项目的学习中的问题解决方案及思考Lesson 2 String字符串是 Python 中最常用的数据类型。我们可以使用引号’或”来创建字符串。about_strings.py#!/us…

wxpython使用简介_wxpython简介

Python​ Python是一种成功的脚本语言&#xff0c;它最初是由Guido van Rossum开发的。它于1991年首次发布。Python的灵感来自于ABC和Haskell编程语言。Python是一种高级的、通用的、多平台的、解释型的语言。有人更喜欢称它为动态语言。它很容易学习。Python是一种极简主义语言…

计算机科学与python编程导论_计算机科学入门和使用Python编程

你将学到什么A Notion of computationThe Python programming languageSome simple algorithmsTesting and debuggingAn informal introduction to algorithmic complexityData structures课程概况This course is the first of a two-course sequence: Introduction to Compute…

电脑4次连续故障音_格力空调电子膨胀阀故障判定与“E6”处理方法

一、电子膨胀阀常见故障原因电器电子膨胀阀是一种利用电子控制器通过电缆向线圈发出脉冲控制信号&#xff0c;控制施加于膨胀阀上的电压或电流&#xff0c;从而控制阀针的动作实现阀口流通面积改变达到流量自动调节目的的节流器件&#xff0c;是空调器的重要部件之一&#xff0…

mysql+性能+计算列_MYSQL性能优化的最佳20+条经验

当你查询表的有些时候&#xff0c;你已经知道结果只会有一条结果&#xff0c;但因为你可能需要去fetch游标&#xff0c;或是你也许会去检查返回的记录数。在这种情况下&#xff0c;加上 LIMIT 1 可以增加性能。这样一样&#xff0c;MySQL数据库引擎会在找到一条数据后停止搜索&…

ClickHouse 入门与实战教程

目录 1. ClickHouse 简介 什么是 ClickHouse&#xff1f; ClickHouse 的优势和特点 适用场景 2. 安装 ClickHouse 3. ClickHouse 的基本概念 4. ClickHouse 的基本操作 创建数据库和表、插入和查询数据 使用 MergeTree 引擎处理时序数据 管理分区 创建带有分区的 Mer…

python脚本自动消除安卓版_python脚本中appium的自启动自关闭

前提&#xff1a;已安装appium命令行版本将appium的启动及其关闭直接写在脚本中&#xff0c;运行起来会方便很多创建startAppiumServer.bat 和 stopAppiumServer.bat文件&#xff0c;然后文件存放在运行的包下面注意点&#xff1a;调用startAppiumServer.bat 和stopAppiumServe…

sid图像数据_实战材料信息学:使用skimage处理扫描电子显微镜(SEM)图像数据

算开个头&#xff0c;不算特别实战扫描电子显微镜&#xff0c;材料开发不可缺少的分析仪器。原理就不详述了。材料的形貌&#xff0c;具体长什么样的都可以看得很清楚。材料表面的形貌很多情况下会和材料的物性产生直接关系&#xff0c;比如说可以从SEM看出粒子的直径分布&…