设为首页 收藏本站
查看: 840|回复: 0

[经验分享] 实现php超级查询(应该能满足大部分查询需求)

[复制链接]
发表于 2017-4-13 07:37:26 | 显示全部楼层 |阅读模式
  本来是搞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中的函数进行封装

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-364133-1-1.html 上篇帖子: PHP基础知识之INCLUDE与REQUIRE的区别(又一篇) 下篇帖子: php对外发包引发服务器崩溃的终极解决方法分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表