热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHPSQL查询封装-PHP源码

PHPSQL查询封装
PHP代码


 *      $tools = new SQLTools("表名", "数据库操作对象实例");
 *      $tools->query("字段默认为*")                          //(如无后续操作此处返回查询结果集)
 *            ->where( '条件', PDO参数化查询参数 )                //(如无后续操作此处返回查询结果集)
 *            ->group( 'id' )                                    //(如无后续操作此处返回查询结果集)
 *            ->order( 'id', 'desc' )                            //(如无后续操作此处返回查询结果集)
 *            ->limit( 0, 100 )                              //(如无后续操作此处返回查询结果集)
 *            ->toSQL();                                         // 返回拼接出来的SQL
 *
 * 
 */
 
defined( 'SQL_TAG_QUERY' ) OR define( 'SQL_TAG_QUERY', 'query' );
defined( 'SQL_TAG_LIMIG' ) OR define( 'SQL_TAG_LIMIT', 'limit' );
defined( 'SQL_TAG_WHERE' ) OR define( 'SQL_TAG_WHERE', 'where' );
defined( 'SQL_TAG_ORDER' ) OR define( 'SQL_TAG_ORDER', 'order' );
defined( 'SQL_TAG_GROUP' ) OR define( 'SQL_TAG_GROUP', 'group' );
 
// to xx 自己加吧
defined( 'TO_SQL' ) OR define( 'TO_SQL', 'toSQL' );
 
class SQLTools{
 
    public $id          = null;
    public $db          = null;
    public $tableName   = null;
 
    private $__code     = null;
    private $__query    = null;
    private $__where    = null;
    private $__param    = null;
    private $__limit    = null;
    private $__order    = null;
    private $__group    = null;
     
    /**
     * 实例化
     * @param $tableName stirng 表名
     * @param $db 一个数据库操作对象,且必须有个叫query的方法,接受两个参数  sql 及 params
     * @param $id 主键字段名
     */
    public function __construct( $tableName, $db, $id=null ){
        $this->db = $db;
        $this->id = $id;
        $this->tableName = $tableName;
    }
     
    public function query( $fields='*', $tableName=null ){
        $tableName === null && ( $tableName = $this->tableName );
        $this->__query = "SELECT $fields FROM $tableName ";
        return $this->__setResultByCallCode( SQL_TAG_QUERY );
    }
 
    public function where( $where, $params ){
        $this->__where = "WHERE $where ";
        $this->__param = $params;
        return $this->__setResultByCallCode( SQL_TAG_WHERE );
    }
 
    public function order( $fields, $sort ){
        $this->__order = "ORDER BY $fields $sort ";
        return $this->__setResultByCallCode( SQL_TAG_ORDER );
    }
 
    public function group( $fields ){
        $this->__group = "GROUP BY $fields";
        return $this->__setResultByCallCode( SQL_TAG_GROUP );
    }
 
    public function limit( $m, $n ){
        $this->__limit = sprintf( 'LIMIT %d,%s ', $m, $n );
        return $this->__setResultByCallCode( SQL_TAG_LIMIT );
    }
 
    public function toSQL(){ return $this->__setResultByCallCode( TO_SQL ); }
 
    public function clear(){
        $this->__code    = null;
        $this->__query   = null;
        $this->__where   = null;
        $this->__param   = null;
        $this->__limit   = null;
        $this->__order   = null;
        $this->__group   = null;
    }
 
    // 真正查询的地方
    private function __query( $tag ){
        $__sql = $this->__query;
 
        $this->__where !== null && ( $__sql .= $this->__where );
        $this->__group !== null && ( $__sql .= $this->__group );
        $this->__order !== null && ( $__sql .= $this->__order );
        $this->__limit !== null && ( $__sql .= $this->__limit );
         
        $result = $tag === TO_SQL ? $__sql : $this->db->query( $__sql, $this->__param );
        $this->clear();
 
        return $result;
    }
 
    /**
     * 通过堆栈信息获取调用脚本后面调用方法,
     * 根据方法生成相关返回对象
     * @param $tag sql标签
     * @return object
     **/
    private function __setResultByCallCode( $tag ){
        if( $this->__code !== null ){
            return $this->__createResult( $this->__code, $tag );
        }
 
        $info = debug_backtrace();
        if( !is_array($info) ){
            return null;
        }
         
        // 找到调用文件索引 ( 这里是通过文件名匹配的,如果改了文件名请自行修改这段代码 )
        $index = -1;
        foreach( $info as $counter => $item ){
            if( isset($item['file']) ){
                if( stripos($item['file'], 'SQLTools.class.php') > 0 ){
                    $index = $counter + 1;  // 下一个item即调用文件
                    break;
                }
            }
        }
 
        // 没有找到调用信息
        if( $index === -1 ){
            return null;
        }
 
        // 堆栈中没有找到相关信息
        $caller = $info[$index];
        if( !isset($caller['file']) || !file_exists($caller['file']) || !isset($caller['line']) ){
            return null;
        }
 
        $line = $caller['line'];
        $file = @fopen( $caller['file'], "r" );
        $counter = 1;
 
        $code = '';
        while( ($buffer = fgets($file)) !== false ){
            if( $counter >= $line ){
                $code .= $buffer;
                if( substr( $buffer, -2, 1 ) == ';' ){
                    goto end;
                }
            }
            $counter++;
        }
 
        end: isset( $file ) && @fclose( $file );
 
        $code = str_replace( ' ',  '', $code );
        $code = str_replace( "\t", '', $code );
        $code = str_replace( "\n", '', $code );
        $code = explode( '->', $code );
         
        return $this->__createResult( $code, $tag );
    }
 
    // 返回$this起到链接作用,又判断当前调用tag是否已经结束
    private function __createResult( $code, $tag ){
        $this->__code = $code;
 
        foreach( $this->__code as $code){
            if( stripos($code, $tag) === 0 && substr( $code, -1 ) === ';' ){  // 判断查询结束
                return $this->__query( $tag );
            }
        }
 
        return $this;
    }
}

推荐阅读
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Echarts图表重复加载、axis重复多次请求问题解决记录
    文章目录1.需求描述2.问题描述正常状态:问题状态:3.解决方法1.需求描述使用Echats实现了一个中国地图:通过选择查询周期&#x ... [详细]
author-avatar
留恋的花纹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有