【第一种方案 __call】

我们在使用一些框架(如ThinkPHP)编码的时候,常用到这样的代码。

  1. M('User')->where(array('id'=>1))->field('name')->select();

这样不仅有利于编码,而且也能让人"心情愉悦"呢。好了,不多说了。让我们看看如何实现的吧?

  1. <?php
  2. //数据库操作基类[PS:主要功能连贯功能实现]
  3. class Db{
  4. //此属性定义要实现连贯操作的方法名
  5. public $sql = array(
  6. "field" => "",
  7. "where" => "",
  8. "order" => "",
  9. "limit" => "",
  10. "group" => "",
  11. "having" => "",
  12. );
  13.  
  14. /**
  15. * 连贯操作时,调用field() where() order() limit() group() having()方法且组合成sql语句
  16. * 此方法为PHP魔术方法,调用类中不存在的方法时就会自动调用此方法
  17. * @param $methodName 调用不存在的方法时,接收这个方法名称的字符串
  18. * @param $args 调用不存在的方法时,接收这个方法的参数,以数组形式接收
  19. */
  20. function __call($methodName,$args){
  21. //把要请求的方法名,统一转为小写
  22. $methodName=strtolower($methodName);
  23. //若请求方法名与成员属性数组$sql下标对应上;则将第二个参数,赋值给数组中"下标对应的元素"
  24.  
  25. if(isset($this->sql[$methodName])){
  26. $this->sql[$methodName]=$args[0];
  27. }else{
  28. echo '调用类'.get_class($this).'中的'.$methodName.'()方法不存在';
  29. }
  30. //返回对象;从而可以继续调用本对象中的方法,形成连贯操作
  31. return $this;
  32. }
  33.  
  34. /**
  35. * 用此方法拼接成一个select的sql语句;[PS:此方法终结了连贯操作,置于连贯操作的最后面]
  36. */
  37. function select(){
  38. //按照select语法拼接sql字符串[PS:可以在mysql命令行中执行"help select;"查看其语法构结]
  39. $sql="SELECT {$this->sql['field']} FROM test {$this->sql['where']} {$this->sql['group']} {$this->sql['having']} {$this->sql['order']} {$this->sql['limit']}";
  40. echo $sql;
  41. }
  42. }
  43.  
  44. $obj=new db();
  45. $obj->field('name,sex,address')->where('where name="gongwen"')->limit('limit 1')->select();
  46.  
  47. //输出:SELECT name,sex,address FROM test where name=gongwen limit 1

原文出处http://www.gwalker.cn/article-163.html

【第二种方案 不使用__call】

下面写的这个例子,则不是用_call的,大家可以扩展一下吧。

  1. /*
  2. * SQL语句组合实例类,始发文章web开发笔记
  3. * 学习用,非专业类
  4. * */
  5. class sql{
  6. private $sql=array("from"=>"",
  7. "where"=>"",
  8. "order"=>"",
  9. "limit"=>"");
  10.  
  11. public function from($tableName) {
  12. $this->sql["from"]="FROM ".$tableName;
  13. return $this;
  14. }
  15.  
  16. public function where($_where='1=1') {
  17. $this->sql["where"]="WHERE ".$_where;
  18. return $this;
  19. }
  20.  
  21. public function order($_order='id DESC') {
  22. $this->sql["order"]="ORDER BY ".$_order;
  23. return $this;
  24. }
  25.  
  26. public function limit($_limit='30') {
  27. $this->sql["limit"]="LIMIT 0,".$_limit;
  28. return $this;
  29. }
  30. public function select($_select='*') {
  31. return "SELECT ".$_select." ".(implode(" ",$this->sql));
  32. }
  33. }
  34.  
  35. $sql =new sql();
  36.  
  37. echo $sql->from("testTable")->where("id=1")->order("id DESC")->limit(10)->select();
  38. //输出 SELECT * FROM testTable WHERE id=1 ORDER BY id DESC LIMIT 0,10

摘自脚本之家,原作者不详。

【转】PHP实现连贯操作的更多相关文章

  1. ThinkPhp 3.2 数据的连贯操作

    ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作. 使用也比较简单, 假如我们现在要查询一个User表 ...

  2. thinkPHP--SQL连贯操作

    一.连贯入门 连贯操作使用起来非常简单,比如查找到 id 为 1,2,3,4 中按照创建时间的倒序的前两 位. //连贯操作入门 $user = M('User'); var_dump($user-& ...

  3. 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句

    如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true) ...

  4. ci连贯操作的limit两个参数和sql是相反的

    ci连贯操作的limit两个参数和sql是相反的 db->where("name =",'mary')->ge() name后面要有个空格否则报错当为一个字段 -> ...

  5. Laravel框架数据库CURD操作、连贯操作

    这篇文章主要介绍了Laravel框架数据库CURD操作.连贯操作.链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下 一.Selects 检索表中的所有行 $users = DB::t ...

  6. Laravel框架数据库CURD操作、连贯操作总结

    这篇文章主要介绍了Laravel框架数据库CURD操作.连贯操作.链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下 一.Selects 检索表中的所有行 复制代码代码如下: $use ...

  7. ThinkPHP第十八天(Widget类的使用,连贯操作where IN用法,缓存S函数使用)

    1.Widget类的使用方法: 第一步:在Action同级目录中新建Widget文件夹(独立分组需要自己建立) 第二步:根据不同功能在Widget文件夹中建立不同的Widget类,如热门文章HotWi ...

  8. ThinkPHP - 连贯操作

    /** * 连贯操作 * @return 无返回值 */ public function coherentOperation(){ //实例化模型 $user = M('User'); // +--- ...

  9. 11.ThinkPHP 3.1.2 连贯操作

    ==================================================== 一.常用连贯操作 1.where 帮助我们设置查询条件 2.order 对结果进行排序 $ar ...

随机推荐

  1. Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

     dispatchTouchEvent (分发TouchEvent) 处理触摸事件分发,事件(多数情况)是从Activity的dispatchTouchEvent开始的.执行super.dispatc ...

  2. NOIp 2012 #1 Vigenère 密码 Label:模拟

    题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...

  3. NOIp 2014 #3 寻找道路 Label:图论

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  4. 【BZOJ2821】作诗(Poetize) 分块

    Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...

  5. 从一个QQ群友那儿偷来的js图形 ^_^

    <script type="text/javascript"> var head=document.createElement("HEAD"); d ...

  6. 关于VSS上的项目源码管理的注意问题

    1.将项目添加到vss上面去 如果项目取的名字没有问题,则不需要去vss上面去新建项目,直接在解决方案那里右击“添加到vss”中,把第一个输入框中的名字(xxxx.root)全部清除掉.确定即可. 2 ...

  7. 使用C#向ACCESS中插入数据(仅供参考)

    1.创建并打开一个OleDbConnection对象 string strConn = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source ...

  8. 关于JS的算法

    一.快速排序 function qSort(arr) { if(arr.length === 0) { return []; } var left = []; var right = []; var ...

  9. IO字 节流/字符流 读取/写入文件

    流是指一连串流动的数据信号,以先进,先出的方式发送和接收的通道 流的分类根据方向分为输入流所有接收,获得,读取的操作都是属于输入流所有的输入流名字都带有input或Reader 输出流所有发送,写的操 ...

  10. HDU1134/HDU1133 递推 大数 java

    Game of Connections Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...