`
wolferill
  • 浏览: 59249 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

实现php超级查询(应该能满足大部分查询需求)

阅读更多

本来是搞Java的,可由于项目需求,无奈暂时转战PHP,刚学一个星期,不过用起来也还勉强顺手。

 

没有了Hibernate这样强大的中间件框架的支持,php要访问数据库我只能从基本的sql语句写起了(不知道php高手们是怎么做的,有好工具就推荐一下吧,在下感激不尽)。

 

不同的表有不同的查询语句,又between又in还要order by,真是崩溃呀,为了实现那些各式各样的sql查询语句,秉着“不重复发明轮子的精神”,我设计了一个“准工厂模式”的php函数,可以根据需求生成sql查询语句,应当能满足大部分的需求了。

 

使用方法如下:

 

<?php

//使用范例:
include("searchBean.php");
$conditions = array(new SearchBean("type_id", "in", array(31, 42, 44)),
	new SearchBean("title", "like", "php超级查询"),
	new SearchBean("hit", ">", 20),
	new SearchBean("id", "order by", 0),
	new SearchBean("content", "is not null"),
	new SearchBean("add_time", "between", array('2009-07-29', '2010-07-29')));
echo create_sql ("news", $conditions, 0, 10)."<br>";

?>

 

输出如下:

 

select * from news 
where type_id in (31, 42, 44) and 
        title like '%php超级查询%' and 
        hit > 20 and 
        content is not null 
        and add_time between '2009-07-29' and '2010-07-29' 
order by id ASC 
Limit 0,10

 

searchBean.php文件中的主要代码如下(有提供下载哟!):

 

<?php

/**
 * 用于封装数据库查询条件的类
 * @author Technicolor
 */
class SearchBean {

	private $column;
	private $relation;
	private $value;

	/**
	 * 构造函数
	 * @param string $column 查询的列名
	 * @param string $relation 查询关系,必须为小写字母,支持如下条件:<br>
	 *  =,>,>=,<,<=,<>,like,between,in,is null,order by(以及对应的not关系)
	 * @param string $value 查询的值,当$relation为like时,字符串自动首尾添加"%";<br>
	 * 当$relation为between时,$value应当为数组参数,取数组的前两个值作为between的范围,且$value[0]较小<br>
	 * 当$relation为in时,$value应当为数组参数<br>
	 * 当$relation为is null时,$value参数将被忽略<br>
	 * 当$relation为order by时,value为1则降序,0则升序
	 */
	function SearchBean($column, $relation, $value=null) {//略  }

	function get_column() {//略	}

	function get_relation() {//略	}

	function get_value() {//略	}

	/**
	 * 将array转换为对应的sql in片断
	 * @param array $array SQL IN 参数数组
	 * @return string SQL IN:<br>
	 * (1,2,3,…)或('a','b','c')
	 */
	private static function trans_value_in($array) {//略	}

	/**
	 * 将array转换为对应的sql between片断
	 * @param array $array SQL BETWEEN 参数数组
	 * @return string SQL BETWEEN:<br>
	 * 1 and 2 或 'a' and 'b'
	 */
	private static function trans_value_between($array) {//略  }

	/**
	 * 将SearchBean转换为对应的sql查询条件片断
	 * @return string sql查询条件片断
	 */
	function to_sql() {
		$sql = "";
		if (is_null($this->value) &&
				$this->relation != "is null" &&
				$this->relation != "is not null") {
			return $sql;
		}
		if ($this->relation == "order by") {
			$type = $this->value ? "DESC" : "ASC";
			$sql = "$this->column $type";
		} else if ($this->relation == "in" || $this->relation == "not in") {
			$sql = "$this->column $this->relation " . self::trans_value_in($this->value);
		} else if ($this->relation == "between" || $this->relation == "not between") {
			$sql = "$this->column $this->relation " . self::trans_value_between($this->value);
		} else if ($this->relation == "like" || $this->relation == "not like") {
			$sql = "$this->column $this->relation '%$this->value%'";
		} else if ($this->relation == "is null" || $this->relation == "is not null") {
			$sql = "$this->column $this->relation";
		} else {
			if (is_string($this->value)) {
				$sql = "$this->column $this->relation '$this->value'";
			} else {
				$sql = "$this->column $this->relation $this->value";
			}
		}
		return $sql;
	}

}


/**
 * 生成sql查询语句
 * @param string $tableName 查询的表名
 * @param array(SearchBean) $conditions 查询条件列表
 * @param int $start 查询起始索引(用于分页)
 * @param int $limit 查询限制个数(每页显示个数)
 * @param int $count 0则为“select *”,1则为“select count(*)”(用于统计个数)
 */
function create_sql($tableName, $conditions="", $start=0, $limit=0, $count=0) {
	$page = "";
	if ($start >= 0 && $limit > 0) {
		$page = " Limit " . $start . "," . $limit;
	}
	$where = 0;
	$where_sql = "";
	$order_by = 0;
	$order_by_sql = "";
	if (is_a($conditions, "SearchBean")) {
		$relation = $conditions->get_relation();
		if ($relation == "order by") {
			$order_by_sql = $conditions->to_sql();
			$order_by++;
		} else {
			$where_sql = $conditions->to_sql();
			$where++;
		}
	} else if (is_array($conditions)) {
		foreach ($conditions as $c) {
			if (is_a($c, "SearchBean")) {
				$str = $c->to_sql();
				if ($str) {
					$relation = $c->get_relation();
					if ($relation == "order by") {
						$order_by_sql = $order_by ? $order_by_sql . ", " . $str : $str;
						$order_by++;
					} else {
						$where_sql = $where ? $where_sql . " and " . $str : $str;
						$where++;
					}
				}
			}
		}
	}
	$where_sql = $where ? " where " . $where_sql : "";
	$order_by_sql = $order_by ? " order by " . $order_by_sql : "";
	$sql = "";
	if ($count) {
		$sql = "select count(*) from $tableName" . $where_sql;
	} else {
		$sql = "select * from $tableName" . $where_sql . $order_by_sql . $page;
	}
	return $sql;
}
?>

 

当然,上面那部分只生成了sql语句,还没有进行查询,对查询那部分我是这样做的:

1、将所有数据库中常用的表设计成类,库表列对应于类的成员变量;

2、在系统中记录数据库表名称和类名称的双向映射

3、提供一个通用查询函数,返回值是该表对应的类的对象的数组,函数中通过表名判断需要生成的对象类型

 

具体实现就不放出来了,与具体项目相关,可根据需要对searchBean.php中的函数进行封装

 

 

 

2
3
分享到:
评论
7 楼 vb2005xu 2010-08-11  
6楼思维还是停留在PHP4,根本不懂PHP5
6 楼 bobboy007 2010-08-06  
php这样搞没多少意义,容易陷入过度设计。性能损失很厉害。
到php5对面向对象支持都一般般,
要真用到这么多架构还是选java.当然现在很多php框架开发的不错。但php本质还是面向过程多。
5 楼 vb2005xu 2010-08-02  
建议 看下 QEE 然后再来评价 PHP ORM ....
4 楼 zhouzhao21 2010-07-31  
symfony 不错。 我也做了几年 java 了, 没有什么好不好的。合适就行。
3 楼 kk15378924 2010-07-30  
效率....
php干orm是很吃力不讨好的...
2 楼 wolferill 2010-07-30  
vb2005xu 写道
看看呵呵 ,

/**
 * 返回复合条件字符串,解决ZF组合条件不能自动生成的问题
 * 

……  ……  ……


呵呵,谢谢了

刚刚看了些PHP的MVC框架,感觉还是蛮强大的
1 楼 vb2005xu 2010-07-30  
看看呵呵 ,

	/**
	 * 返回复合条件字符串,解决ZF组合条件不能自动生成的问题
	 * 
	 * 	用法:
	 *	$sql_cond = Zend_Custom_DB_TableDataGateway::getConditions(
	 *		Zend_Custom_DB_TableDataGateway::getDefaultAdapter() ,
	 *		array(
	 *			'first_name' => 'iamsese' ,
	 *			'age' => array(18,'>=') ,
	 *			'grade' => array(72,'>','OR') ,
	 *			'last_name' => array('%kenxu%','LIKE') ,
	 *		)			
	 *	);
	 *	
	 *	Zend_Custom_Core::dump($sql_cond) ;
	 *  // 显示: (  first_name = 'iamsese' AND age >= 18 OR grade > 72 AND last_name LIKE '%kenxu%' )
	 *	
	 *	$game = new Game();
	 *	
	 *	$sql_cond = Zend_Custom_DB_TableDataGateway::getConditions(
	 *		$game->getAdapter() ,
	 *		array(
	 *			'gamename' => array('%文%','LIKE') ,
	 *		)			
	 *	);
	 *  // 显示: (  gamename LIKE '%文%' ) 
	 *	
	 *	$funabc = $game->get($sql_cond);
	 *	Zend_Custom_Core::dump($funabc->toArray(),$sql_cond) ;
	 *	
	 * @param Zend_Db_Adapter_Abstract $dbAdapter db适配器对象
	 * @param mixed $conditions 条件
	 * @return string
	 */
	static function getConditions(Zend_Db_Adapter_Abstract $dbAdapter,$conditions){
		
		if (empty($conditions)) return '' ;
		if (is_string($conditions)) return "( {$conditions} )" ;
		if (is_array($conditions)) {

			$text = '' ; $join = '' ;
			foreach ($conditions as $fld => $cond){
				if (is_object($cond)) continue ;
				
				$compare = "=" ; //缺省的比较符
				
				$noQuote = false ; //不进行转义字符操作 
				
				if (is_array($cond)){ // array(:value,:compare,:join,:noQuote)
					
					$value = array_shift($cond);
					
					if (is_object($value)) continue ;
					
					if ($_ = array_shift($cond)) // :compare
						$compare = $_ ;
						
					if ($_ = array_shift($cond)) { // :join
						if ($join) // 第一次无须连接符号
							$join = $_ ;
					}
						
					if ($_ = array_shift($cond) ) // :noQuote
						$noQuote = true ;
						
				} else {
					$value = $cond ;
				}
						
				if ($noQuote) {
					
					$value = is_array($value) ? '(' . implode(',',$value) . ')' : $value ;
					$_ = "{$fld} {$compare} {$value}" ;
					
				} else {
					// 参数占位符
					$paramQM = is_array($value) ? '(?)' : '?' ;
					$_ = $dbAdapter->quoteInto("{$fld} {$compare} {$paramQM}",$value);
				}

				$text .= " {$join} {$_}" ;
				
				$join = 'AND' ;
			}
			
			return "({$text} )" ;
		}
		return '' ;	
	}

相关推荐

    超级简单企业网站PHP源码

    这个源码包含了一系列常见企业网站的功能模块,如公司简介、产品展示、联系我们、新闻发布、企业荣誉和人才招聘等,能够满足企业的基本线上宣传需求。 首先,让我们深入了解一下PHP。PHP是一种广泛使用的开源脚本...

    超级无敌php网站系统源码

    【标题】"超级无敌php网站系统源码"揭示了这个压缩包内容的核心——一个基于PHP语言的网站系统源代码。PHP是一种广泛使用的开源脚本...同时,理解并修改源代码以满足特定需求,也是使用源码建站时不可忽视的一部分。

    超级漂亮的一个PHP网站模板

    【PHP网站模板详解】 ...总的来说,这个“超级漂亮的一个PHP网站模板”提供了快速建立专业、美观网站的可能性,无论你是开发者还是非技术人员,都可以通过调整和定制来满足自己的需求,创建出令人印象深刻的在线存在。

    基于PHP的BBS论坛设计与实现.pdf

    文章最后对系统的实现进行了总结,指出基于PHP的BBS论坛设计与实现可以满足高校学生的信息需求,提高高校学生的信息化水平。 知识点一:BBS的概念和功能 * BBS是Bulletin Board System的缩写,是网络提供的一种...

    DEDE超级标签

    这些标签可以是文章、图片、分类等各种类型的内容,使开发者无需编写复杂的SQL查询,就能实现复杂的数据操作。 在织梦内容管理系统中,DEDE超级标签的使用通常包括以下几个步骤: 1. **创建标签**:首先,你需要在...

    PHP在线影院系统的设计与实现

    该系统分为前台和后台两大部分。前台设计注重用户体验,采用人性化界面,旨在使用户能够轻松地找到并观看感兴趣的视频。未明确观影目标的用户可以通过热门视频排行榜快速发现流行内容;而具有特定观影需求的用户则可...

    商业编程-源码-Php Guest System(超级留言系统) v0814.zip

    通过理解和掌握这些关键技术点,开发者不仅可以部署和运行Php Guest System,还可以对其进行定制和扩展,以满足特定的业务需求。对于学习PHP Web开发的人来说,这个源码是一个宝贵的参考资料,能帮助他们加深对实际...

    超级CMS系统多语言版 v2.39.zip

    《超级CMS系统多语言版 v2.39》是一款针对多语言网站管理需求而设计的高效内容管理系统。这款系统的核心特点在于其强大的多语言支持,能够帮助用户轻松管理和发布多种语言的内容,为全球化的网站运营提供了便利。...

    ECSHOP商家入驻插件5.0超级至尊版

    ECSHOP商家入驻插件5.0超级至尊版是...用户可以根据文档指导,灵活调整设置,以满足自己平台的独特需求。同时,持续的更新和支持确保了插件与ECSHOP系统以及电子商务行业的发展保持同步,为用户提供稳定且强大的服务。

    BOOM超级团队成员系统 v1.5

    它具有高度的自定义性,可以根据不同团队的需求调整成员显示信息,以满足各种工作场景。作为中文PHP程序的佼佼者,它不仅在功能上表现出色,而且在安全性方面也相当可靠,确保了用户的密码有四重保护措施,为数据...

    pbootcms抖音小程序,适合大部分企业的小程序

    适合大部分企业的抖音小程序模板,对接pbootcms后台数据,提高企业曝光量,而pbootcms建站简单,快捷,模板特别多,功能齐全,二开简单,超级好用。而且免费使用,无需付费。 1、系统采用高效、简洁、强悍的模板标签...

    FCKeditor_2.4.3—超级简化版

    - **fckeditor.js**:这是编辑器的主要JavaScript文件,包含了大部分的编辑器功能实现。 - **fckconfig.js**:配置文件,可以在这里修改编辑器的默认设置,如工具栏布局、允许的HTML标签等。 - **index.php**:...

    notepad++超级文本编辑器绿色版

    同时,它的“查找和替换”对话框提供了多种选项,如全字匹配、区分大小写等,满足了各种复杂的查找需求。 在代码编辑方面,Notepad++支持多文档界面,可以同时打开并编辑多个文件,这对于处理多个项目或者比较不同...

    中国农业大学人才招聘管理系统的设计与实现.pdf

    随着信息技术的快速发展,各类管理系统已经成为高校等事业单位日常工作不可或缺的一部分。...未来,随着技术的进步和高校人事管理需求的变化,本系统还将不断地进行优化和升级,以满足更加多元化的管理需求。

    PHP Smarty简体中文参考手册(让你更快速掌握PHP Smarty模板引擎)

    5. **配置选项**:Smarty有许多配置参数,比如模板目录、编译目录、缓存目录等,这些可以通过`$smarty`对象进行设置,以满足不同项目的个性化需求。 6. **安全控制**:Smarty提供了安全功能,比如限制可以使用的...

    mysql数据库的超级详细总结

    2. **分布式数据库**:为了满足大规模数据处理的需求,MySQL将继续优化分布式数据库技术,提升数据处理的并行性和可扩展性。 3. **AI与数据库融合**:人工智能技术的应用将推动MySQL向自动化、智能化方向发展,例如...

    柠檬鱼叮咚超级点餐6.2.9.zip

    开发者可以通过PHP代码进行灵活定制,满足不同商家的个性化需求。 其次,小程序前端是直接与用户交互的部分,它以其轻量化、无需下载安装的特点,深受用户喜爱。在这个系统中,小程序前端设计简洁明了,用户可以...

    最新团购导航网 LHT 超级实用

    操作简单意味着即使是对计算机不太熟悉的用户也能轻松上手,而"界面主流"则意味着设计风格符合当前的审美趋势,符合大部分用户的使用习惯,提供良好的视觉体验。 【标签】"团购导航 LGT",这里的"LGT"可能是"LHT"的...

    php word转html格式类

    在IT行业中,尤其是在Web开发领域,常常需要处理各种文件格式的转换,以便于在不同的应用...在实际应用中,可能需要根据具体需求进行调整和优化,以满足更复杂的需求,比如保持原始样式、支持更多特殊元素的转换等。

Global site tag (gtag.js) - Google Analytics