【转】PHP实现连贯操作
【第一种方案 __call】
我们在使用一些框架(如ThinkPHP)编码的时候,常用到这样的代码。
- M('User')->where(array('id'=>1))->field('name')->select();
这样不仅有利于编码,而且也能让人"心情愉悦"呢。好了,不多说了。让我们看看如何实现的吧?
- <?php
- //数据库操作基类[PS:主要功能连贯功能实现]
- class Db{
- //此属性定义要实现连贯操作的方法名
- public $sql = array(
- "field" => "",
- "where" => "",
- "order" => "",
- "limit" => "",
- "group" => "",
- "having" => "",
- );
- /**
- * 连贯操作时,调用field() where() order() limit() group() having()方法且组合成sql语句
- * 此方法为PHP魔术方法,调用类中不存在的方法时就会自动调用此方法
- * @param $methodName 调用不存在的方法时,接收这个方法名称的字符串
- * @param $args 调用不存在的方法时,接收这个方法的参数,以数组形式接收
- */
- function __call($methodName,$args){
- //把要请求的方法名,统一转为小写
- $methodName=strtolower($methodName);
- //若请求方法名与成员属性数组$sql下标对应上;则将第二个参数,赋值给数组中"下标对应的元素"
- if(isset($this->sql[$methodName])){
- $this->sql[$methodName]=$args[0];
- }else{
- echo '调用类'.get_class($this).'中的'.$methodName.'()方法不存在';
- }
- //返回对象;从而可以继续调用本对象中的方法,形成连贯操作
- return $this;
- }
- /**
- * 用此方法拼接成一个select的sql语句;[PS:此方法终结了连贯操作,置于连贯操作的最后面]
- */
- function select(){
- //按照select语法拼接sql字符串[PS:可以在mysql命令行中执行"help select;"查看其语法构结]
- $sql="SELECT {$this->sql['field']} FROM test {$this->sql['where']} {$this->sql['group']} {$this->sql['having']} {$this->sql['order']} {$this->sql['limit']}";
- echo $sql;
- }
- }
- $obj=new db();
- $obj->field('name,sex,address')->where('where name="gongwen"')->limit('limit 1')->select();
- //输出:SELECT name,sex,address FROM test where name=gongwen limit 1
原文出处http://www.gwalker.cn/article-163.html
【第二种方案 不使用__call】
下面写的这个例子,则不是用_call的,大家可以扩展一下吧。
- /*
- * SQL语句组合实例类,始发文章web开发笔记
- * 学习用,非专业类
- * */
- class sql{
- private $sql=array("from"=>"",
- "where"=>"",
- "order"=>"",
- "limit"=>"");
- public function from($tableName) {
- $this->sql["from"]="FROM ".$tableName;
- return $this;
- }
- public function where($_where='1=1') {
- $this->sql["where"]="WHERE ".$_where;
- return $this;
- }
- public function order($_order='id DESC') {
- $this->sql["order"]="ORDER BY ".$_order;
- return $this;
- }
- public function limit($_limit='30') {
- $this->sql["limit"]="LIMIT 0,".$_limit;
- return $this;
- }
- public function select($_select='*') {
- return "SELECT ".$_select." ".(implode(" ",$this->sql));
- }
- }
- $sql =new sql();
- echo $sql->from("testTable")->where("id=1")->order("id DESC")->limit(10)->select();
- //输出 SELECT * FROM testTable WHERE id=1 ORDER BY id DESC LIMIT 0,10
摘自脚本之家,原作者不详。
【转】PHP实现连贯操作的更多相关文章
- ThinkPhp 3.2 数据的连贯操作
ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作. 使用也比较简单, 假如我们现在要查询一个User表 ...
- thinkPHP--SQL连贯操作
一.连贯入门 连贯操作使用起来非常简单,比如查找到 id 为 1,2,3,4 中按照创建时间的倒序的前两 位. //连贯操作入门 $user = M('User'); var_dump($user-& ...
- 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句
如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true) ...
- ci连贯操作的limit两个参数和sql是相反的
ci连贯操作的limit两个参数和sql是相反的 db->where("name =",'mary')->ge() name后面要有个空格否则报错当为一个字段 -> ...
- Laravel框架数据库CURD操作、连贯操作
这篇文章主要介绍了Laravel框架数据库CURD操作.连贯操作.链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下 一.Selects 检索表中的所有行 $users = DB::t ...
- Laravel框架数据库CURD操作、连贯操作总结
这篇文章主要介绍了Laravel框架数据库CURD操作.连贯操作.链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下 一.Selects 检索表中的所有行 复制代码代码如下: $use ...
- ThinkPHP第十八天(Widget类的使用,连贯操作where IN用法,缓存S函数使用)
1.Widget类的使用方法: 第一步:在Action同级目录中新建Widget文件夹(独立分组需要自己建立) 第二步:根据不同功能在Widget文件夹中建立不同的Widget类,如热门文章HotWi ...
- ThinkPHP - 连贯操作
/** * 连贯操作 * @return 无返回值 */ public function coherentOperation(){ //实例化模型 $user = M('User'); // +--- ...
- 11.ThinkPHP 3.1.2 连贯操作
==================================================== 一.常用连贯操作 1.where 帮助我们设置查询条件 2.order 对结果进行排序 $ar ...
随机推荐
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
dispatchTouchEvent (分发TouchEvent) 处理触摸事件分发,事件(多数情况)是从Activity的dispatchTouchEvent开始的.执行super.dispatc ...
- NOIp 2012 #1 Vigenère 密码 Label:模拟
题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...
- NOIp 2014 #3 寻找道路 Label:图论
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- 【BZOJ2821】作诗(Poetize) 分块
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...
- 从一个QQ群友那儿偷来的js图形 ^_^
<script type="text/javascript"> var head=document.createElement("HEAD"); d ...
- 关于VSS上的项目源码管理的注意问题
1.将项目添加到vss上面去 如果项目取的名字没有问题,则不需要去vss上面去新建项目,直接在解决方案那里右击“添加到vss”中,把第一个输入框中的名字(xxxx.root)全部清除掉.确定即可. 2 ...
- 使用C#向ACCESS中插入数据(仅供参考)
1.创建并打开一个OleDbConnection对象 string strConn = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source ...
- 关于JS的算法
一.快速排序 function qSort(arr) { if(arr.length === 0) { return []; } var left = []; var right = []; var ...
- IO字 节流/字符流 读取/写入文件
流是指一连串流动的数据信号,以先进,先出的方式发送和接收的通道 流的分类根据方向分为输入流所有接收,获得,读取的操作都是属于输入流所有的输入流名字都带有input或Reader 输出流所有发送,写的操 ...
- HDU1134/HDU1133 递推 大数 java
Game of Connections Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...