`

xser php5 framework v0.11 测试版 新增的功能 -- sqlbuilder

阅读更多
<?php

class xser_dbo_mysql_sqlbuilder extends xser_dbo_sqlbuilder {
	
	private $db_link_identifier ;	
	static function instance($db_link_identifier){
		if (!is_resource($db_link_identifier))
        	throw new Exception('INVALID db_link_identifier');
		
		static $instance;		
        if (is_null($instance))
            $instance = new xser_dbo_mysql_sqlbuilder();
        $instance->db_link_identifier = $db_link_identifier ;
        return $instance;
	}
	
	public function escape_value($value){
		if (is_int($value) || is_float($value)) { return $value; }
        if (is_bool($value)) { return $value ? 1 : 0; }
        if (is_null($value)) { return 'NULL'; }
        return "'" . mysql_real_escape_string($value, $this->db_link_identifier) . "'";
	}
	
	public function sql_limit($length,$offset = null){
		$sql = '' ;
		if ( !empty($offset) ){
			$sql = sprintf(' limit %d , %d',
				(int)$offset ,empty($length) ? (int)$length : 4294967294) ;
		} else if (!empty($length)){
			$sql = " limit " . (int)$length;
		}
        return $sql ;
	}
	
}

// 简单的通用sql生成器
abstract class xser_dbo_sqlbuilder {
 	
 	// insert into table_name (f1,f2[,..]) values(v1,v2[,..])
 	const tpl_sql_insert = 'insert into %s (%s) values(%s)' ;
 	
 	// select f1,f2[,..] from table_name [sql_conditions][sql_sort] [sql_limit] 
 	const tpl_sql_select = 'select %s from %s %s %s %s' ;

 	// update table_name set pair1,pair2 [sql_conditions]
 	const tpl_sql_update = 'update %s set %s %s' ;
 	
 	protected $meta_table = array();
 	
 	public abstract function escape_value($value);
 	public abstract function sql_limit($length,$offset = null);
 	
 	/**
 	 * 重新初始化表元信息
 	 * @param array $meta_table 表元信息
 	 * @return xser_dbo_sqlbuilder
 	 */
 	public function table($meta_table){
 		$this->meta_table = $meta_table ;return $this ;
 	}
 	
 	public function sql_insert($record){
 		if (xser::varify_provider()->not_null_array($record)){			
 			$_row = array_map(array(& $this,'escape_value'),$record);
 			$columns = implode(',',array_keys($_row)) ;
 			$values = implode(',',array_values($_row)) ;
 			return sprintf(self::tpl_sql_insert,
 				$this->meta_table['table'],$columns,$values);
 		}
 		return '' ;
 	}
 	
 	public function sql_update($record,$conditions=null){
 		if (!empty($record) && is_array($record)){
 			$_row = array_map(array(& $this,'escape_value'),$record);
 			$sql_conditions = empty($conditions)? '' : $this->sql_conditions($conditions);
			$pairs = array();
 			foreach ($_row as $field=>$val){
 				$pairs[] = "{$field}={$val}" ;
 			}
 			$pairs = implode(',',$pairs) ;
 			return sprintf(self::tpl_sql_update,
 				$this->meta_table['table'],$pairs,$sql_conditions);
 		}
 		return '' ;
 	}
 	
 	public function sql_select($conditions = null, $sort = null, $limit = null, $fields = '*'){
 		// 处理排序
        $sql_sort = $sort != '' ? " order by {$sort}" : '';
 		if (is_array($limit)) {
            list($length, $offset) = $limit;
        } else {
            $length = $limit;$offset = null;
        }
        
        $sql_limit = empty($length)? '' : $this->sql_limit($length,$offset);
        $sql_conditions = empty($conditions)? '' : $this->sql_conditions($conditions);
 		
 		return sprintf(self::tpl_sql_select,
 			$fields ,$this->meta_table['table'] ,$sql_conditions,$sql_sort,$sql_limit );
 	}
 	
 	public function sql_conditions($conditions = null){
 		if (empty($conditions)) return '' ;
 		$sql = ' where ';
 		if (is_string($conditions) )
 			return $sql . $conditions ;
 		else if (is_array($conditions)){
 			$join_char = '' ;// 第一个条件前面 没有 and 连接符 			
 			foreach ($conditions as $field=>$cond){
 				// 支持 like / or 等操作 例如: 'name' => array('%Bob%','like') 				
 				$op_char = '=' ;
 				if (is_array($cond)){
 					$value = array_shift($cond);
 					// if $value is array , will use "in" [] opchar 					
 					if (is_array($value)){
 						$value = array_map(array(& $this,'escape_value'),$value);
 						$value = '[' . implode(',',$value) . ']' ;
 					}
 					
 					$_op_char = array_shift($cond);
 					if (!empty($_op_char) && is_string($_op_char))
 						$op_char = $_op_char ;
 						 					
 				}else {
 					$value = $cond ; 
 				}
 				// 过滤值	
 				$value = $this->escape_value($value);
 					
 				$sql .= "{$join_char} {$field} {$op_char} {$value} " ; 				
 				$join_char = ' and ' ;
 			}
 			return $sql ;
 		}
 		return '' ;
 	}
 	
 }	

 

 

demo如下:

<?php
class xser_rbac_table {
 // 表
 protected $table = null ;
    protected $pk = null ;
    
    //当前表为主表,及当前表主键在子表中的外键字段
    protected $link = null ;
    protected $link_fk = null ;
    
    //当前表为子表,及当前表主键在主表中的外键字段
    protected $belong = null ;
    protected $belong_fk = null ;
    
    //多对多
    protected $more_to_more = null ;
    
 protected $meta_table = null ;
 
 function create($row,$msg=null,$affected_rows=0){
  $this->_before_create($row);
  $sql = $this->sqlbuilder()->sql_insert($row);
  xser::dbo_provider()->execute($sql,$msg,$affected_rows);
        return $affected_rows > 0 ;
 }
 
 function update($row,$conditions=null,$msg=null,$affected_rows=0){
  $sql = $this->sqlbuilder()->sql_update($row,$conditions);
  xser::dbo_provider()->execute($sql,$msg,$affected_rows);
  return $affected_rows > 0 ;
 }
 
 function find_one($conditions=null, $fields = '*',$msg=null){
  $sql = $this->sqlbuilder()->sql_select($conditions,null,1,$fields);  
  return xser::dbo_provider()->find_one($sql,$msg);
 }
 
 // 1:more , 仅仅支持单主键
 function more_links($current,$fields = '*',$msg=null){
  $sql = "select {$fields} from {$this->link}" ;
  $conditions = array($this->link_fk => $current[$this->pk]);
  $sql .= $this->sqlbuilder()->sql_conditions($conditions);  
  return xser::dbo_provider()->find_all($sql,$msg);
 }
 
 // 1:one , 仅仅支持单主键
 function one_link($current,$fields = '*',$msg=null){
  $sql = "select {$fields} from {$this->link}" ;
  $conditions = array($this->link_fk => $current[$this->pk]);
  $sql .= $this->sqlbuilder()->sql_conditions($conditions);  
  return xser::dbo_provider()->find_one($sql,$msg);
 }
 
 // 定位,当前对象从属于哪个对象 
 function belongs_to($current,$fields = '*',$msg=null){
  $sql = "select {$fields} from {$this->belong}" ;
  $conditions = array($this->belong_fk => $current[$this->pk]);
  $sql .= $this->sqlbuilder()->sql_conditions($conditions);  
  return xser::dbo_provider()->find_one($sql,$msg);
 }
 
 function find_more($conditions=null, $fields = '*',$msg=null){
  $sql = $this->sqlbuilder()->sql_select($conditions,null,null,$fields);  
  return xser::dbo_provider()->find_all($sql,$msg);
 }
 
 function _before_create(&$row){}
 
 /**
  * @return xser_dbo_sqlbuilder
  */
    protected function sqlbuilder($table){
     if (empty($this->meta_table))
      $this->meta_table = array(
       'table' => $this->table ,
       'pk' => $this->pk ,
       'fields' => xser::dbo_provider()->table_columns($this->table)
      );
     return xser::dbo_provider()->sqlbuilder()->table($this->meta_table);
    }
}

 

1
0
分享到:
评论

相关推荐

    xser_exception_handler -- xser php fr v0.1 自定义捕获异常信息

    NULL 博文链接:https://vb2005xu.iteye.com/blog/618326

    苹果CH34XSER驱动

    CH34XSER驱动(一些ESP32开发板需要该驱动),安装后需重启。 (该zip文件下有英文版驱动安装教程)

    CH340USB转串口芯片mac os驱动程序

    在网上找了半天才找到的ch340的mac驱动程序,前天买了一块arduino的板子,发现上边的USB转串口芯片用的是ch340的,windows7下可以自动安装驱动,但是在mac系统下发现找不到arduino的板子,找了半天才找到这个驱动。...

    基于matlab实现的数值计算及金融运用 ,金融时间序列数据分析 ,MATLAB和其他软件数据连接.rar

    基于matlab实现的数值计算及金融运用 ,金融时间序列数据分析 ,MATLAB和其他软件数据连接.rar

    使用SegNet进行语义分割-python源码.zip

    使用SegNet进行语义分割-python源码.zip

    JSP企业电子投票系统 2.zip

    JSP企业电子投票系统 2

    EmotionVGGnet情绪识别-python源码.zip

    EmotionVGGnet情绪识别-python源码.zip

    基于matlab实现的遗传算法、模拟退火算法、禁忌搜索算法求解VRP问题的matlab程序.rar

    基于matlab实现的遗传算法、模拟退火算法、禁忌搜索算法求解VRP问题的matlab程序.rar

    大数据Python科学计算库-Numpy实战:numpy代码

    大数据Python科学计算库-Numpy实战:numpy代码 练习题.ipynb 9-读写.ipynb 8-随机模块.ipynb 7-运算.ipynb 6-数组 生成.ipynb 5-数组形状.ipynb 4-排序.ipynb 3-数值计算. ipynb 2-array结构.ipynb 1-Numpy概述.ipynb 1- Numpy概述.ipynb 2-array结构.ipynb 3-数值计算.ipy nb 4-排序.ipynb 5-数组形状.ipynb 6-数组生成.ipynb 7-运算.ipynb 8-随机模块.ipynb 9-读写.ipynb 练习题.i pynb

    基于统计分析的地面搜索最短耗时的计算方案设计.doc

    本文档是课题研究的研究报告内含调研以及源码设计以及结果分析

    基于BlazePose+KNN实现人体姿态健身计数算法python源码+项目说明.zip

    基于BlazePose+KNN实现人体姿态健身计数算法python源码+项目说明.zip 项目描述: 实现基于mediapipe的人体姿态识别的AI健身自动计数功能 支持健身动作:1、俯卧撑 2、深蹲 3、引体向上 4、仰卧起坐 创建时间:2022.11.28 完成时间:2022.11.28 如何训练新的健身动作模型? 1、修改mian函数 2、首先在fitness_pose_images_in的文件夹下存储对应健身的初态动作与末态动作图像 3、修改videoprocess.py文件中的代码,flag模式选择部分,注意class_name必须与fitness_pose_images_in文件夹下的文件名字保持一致 4、修改videoprocess.py文件中的代码,flag模式选择部分,注意class_name必须与fitness_pose_images_in文件夹下的文件名字保持一致 5、修改trainingsetprocess.py文件中的代码,flag模式选择部分,注意 文件名 必须与fitness_pose_images_in文件夹下的文件名字保持一

    dijkstra 算法说明和基础应用介绍.docx

    Dijkstra 算法,又称为迪杰斯特拉算法,是一种用于解决单源最短 路径问题的经典算法。它的核心思想是通过逐步确定起点到其他顶 点的最短路径来求解。该算法被广泛应用于图论和网络路由等领域。 Dijkstra 算法的基本步骤如下: 1. 创建一个距离数组 dist[] ,用于存储起点到各个顶点的最短距离。 将起点的最短距离初始化为 0,其他顶点的最短距离初始化为无穷 大。 2. 创建一个集合 S ,用于存储已经找到最短路径的顶点。 3. 重复以下步骤,直到集合 S 包含所有顶点: a. 从距离数组 dist[]中选择最小值对应的顶点 v,将 v 加入集合 S。 b. 更新距离数组 dist[] : - 对于每个与 v 相邻的顶点 u,如果通过顶点 v 可以获得更短的 路径,则更新 dist[u]为更短的距离。 c. 重复步骤 a 和 b,直到集合 S 包含所有顶点。 4. 最终,距离数组 dist[]中存储的就是起点到各个顶点的最短路径。 下面通过一个简单的例子来说明 Dijkstra 算法的具体过程。假设有 一个带权有向图,其中的顶点和边分别如下所示:

    node-v12.6.0-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    IEC 60695-11-3:2012.pdf

    IEC 60695-11-3:2012.pdf

    机械设计电话自动组装产线非常好的设计图纸100%好用.zip

    机械设计电话自动组装产线非常好的设计图纸100%好用.zip

    Editor下载非常好用的工具

    010editor是一款小巧专业的实用型编程工具,010editor官方版功能强悍,便捷好用,支持用户进行编辑十六进制和二进制,可选择自己需要的进制进行编辑,还可对任何的文件进行编辑。

    2007-2022各省份节能环保支出及占一般预算支出比例

    点上面 附件图标,上传附件后可设置现金定价 2007-2022年各省份节能环保 支出占一般预算支出面板数据 已经整理成省级面板数据 手动整理不易

    node-v10.17.0-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    保护大堡礁(pytorch + yolov5训练自定义数据集)-python源码.zip

    保护大堡礁(pytorch + yolov5训练自定义数据集)-python源码.zip

    PPT经典背景音乐库 视台常用图片呈现背景音乐 雄伟大气的曲子

    PPT经典背景音乐库 名称: 电视台常用图片呈现背景音乐 名称: 雄伟大气的曲子

Global site tag (gtag.js) - Google Analytics