转载请注明出处:http://blog.csdn.net/jh_zzz

这一块比较复杂,我还没有完全理解为什么要把 SQL 语句的组装搞这么复杂。

从一个普通皮肤页面开始 themes/default/index.php ,代码如下:

<?php while ($this -> next())?>

< div class ="post">

< h2 class ="entry_title">< a href ="<?php $this -> permalink() ?>"><?php $this ->title() ?></ a ></ h2 >

< p class ="entry_data">

< span ><?php _e(' 作者: ' ); ?><?php $this -> author(); ?></ span >

< span ><?php _e(' 发布时间: ' ); ?><?php $this -> date('F j, Y' ); ?></ span >

< span ><?php _e(' 分类: ' ); ?><?php $this -> category(',' ); ?></ span >

< a href ="<?php $this -> permalink() ?>#comments"><?php $this -> commentsNum('No Comments' , '1 Comment' , '%d Comments' ); ?></ a >

</ p >

<?php $this -> content(' 阅读剩余部分 ...' ); ?>

</ div >

<?php endwhile ; ?>

从上面我们知道这个文件是在 Widget_Archive 执行时被 包含进来的,所以在这里 $this 就是 Widget_Archive ,next() 函数具体实现在 Typecho_Widget 中,他只是从 $stack 中取出一行数据返回,然后移向下一行, $stack 中的数据是如何生成的呢?

在 Widget_Archive 的 execute 函数中,有这几行:

$select $this -> select()-> where ('table.contents.status = ?' , 'publish' )

-> where('table.contents.created < ?' , $this -> options-> gmtTime);

… 中间代码略过 …

$select -> order('table.contents.created' , Typecho_Db:: SORT_DESC)

-> page($this -> _currentPage, $this -> parameter-> pageSize);

$this -> db-> fetchAll ($select , array ($this , 'push' ));

下面是 Widget_Abstract_Contents:: select() 函数的具体实现:

return $this -> db-> select ('table.contents.cid' , 'table.contents.title' ,'table.contents.slug' , 'table.contents.created' , 'table.contents.authorId' ,

'table.contents.modified' , 'table.contents.type' , 'table.contents.status' ,'table.contents.text' , 'table.contents.commentsNum' , 'table.contents.order' ,

'table.contents.template' , 'table.contents.password' , 'table.contents.allowComment' ,'table.contents.allowPing' , 'table.contents.allowFeed' ,

'table.contents.parent' )-> from ('table.contents' );

$this->db 是 Typecho_Db 对象,是 在 Widget_Abstract 初始化时赋值的:

$this -> db Typecho_Db:: get();

这个值其实是在 config.inc.php 中创建的,在安装的时候根据用户选择生成的:

$db new Typecho_Db('Mysql' , 'typecho_' );

… 中间略过

Typecho_Db:: set($db );

再看看 Typecho_Db 的 select() 函数,

return call_user_func_array(array ($this -> sql() , 'select' ), $args $args array ('*' ));

$this->sql() 返回一个 Typecho_Db_Query 对象,所以上面这句是调用 Typecho_Db_Query 的 select 函数并将相应的参数传给它, Typecho_Db_Query 会经过一系列的处理最终生成 SQL 语句,这里不再具体看了。

看看生成好的语句是怎么执行的,在最前面提到有这句代码:

$this -> db-> fetchAll($select , array ($this , 'push' ));

Typecho_Db 的 fetchAll 具体实现如下:

public function fetchAll($query , array $filter NULL )

{

// 执行查询

$resource $this -> query ($query , self:: READ);

$result array ();

/** 取出过滤器 */

if (empty ($filter )) {

list ($object $method $filter ;

}

// 取出每一行

while ($rows $this -> _adapter-> fetch ($resource )) {

// 判断是否有过滤器

$result [] $filter call_user_func (array (& $object $method ), $rows $rows ;

}

return $result ;

}

首先执行 query() , query() 函数会执行:

$resource $this -> _adapter-> query($query $handle $op $action );

然后将查询的结果返回,根据上面提到的 config.inc.php ,这里的 _adapter 是 Typecho_Db_Adapter_Mysql ,他其实就是执行了一个 mysql 查询:

if ($resource mysql_query($query instanceof Typecho_Db_Query $query -> __toString() :$query $handle )) {

return $resource ;

}

这里的 $query->__toString() 会返回经过 Typecho_Db_Query 处理后的 最终用来执行的 SQL 语句。

得到查询结果后,上面的 fetchAll 函数就循环调用回调函数将数据回调出去,前面的代码中 Widget_Archive 在调用时指定的是 push ,在 push 函数中返回的每一行数据都被压入 $stack ,这样 $stack 中就有了一行行的数据了。

Typecho 代码阅读笔记(二) - 数据库访问的更多相关文章

  1. Typecho 代码阅读笔记(三) - 插件机制

    转载请注明出处:http://blog.csdn.net/jh_zzz 以 index.php 为例: /** 初始化组件 */ Typecho_Widget:: widget('Widget_Ini ...

  2. Typecho 代码阅读笔记(一) - 页面渲染及路由机制

    转载请注明出处:http://blog.csdn.net/jh_zzz 从 index.php 开始看, /** 初始化组件 */ Typecho_Widget:: widget('Widget_In ...

  3. <<梦断代码>>阅读笔记二

    这是第二篇读书笔记,这本书我已经读了有一大半了,感觉书中所描述的人都是疯子,一群有创造力,却又耐得住寂寞的疯子. 我从书中发现几点我比较感兴趣的内容. 第一个,乐高之梦.将程序用乐高积木一样拼接起来. ...

  4. Linux协议栈代码阅读笔记(二)网络接口的配置

    Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...

  5. [置顶] Linux协议栈代码阅读笔记(二)网络接口的配置

    Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...

  6. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  7. Detectron2源码阅读笔记-(二)Registry&build_*方法

    ​ Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...

  8. 《Java编程思想》阅读笔记二

    Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...

  9. Linux-3.0.8 input subsystem代码阅读笔记

    先乱序记录一下阅读Linux input subsystem代码的笔记. 在input device driver的入口代码部分,需要分配并初始化input device结构,内核提供的API是inp ...

随机推荐

  1. 浅谈 qmake 之 shadow build(将源码路径和构建路径分开,一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰)

    shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...

  2. 《Programming WPF》翻译 第3章 4.我们进行到哪里了?

    原文:<Programming WPF>翻译 第3章 4.我们进行到哪里了? 控件是由应用程序创建的块.它们描述了用户用来交互的界面特征.控件提供了行为,依赖样式和模板来表示一个外观.输入 ...

  3. bitmap 内存溢出OOM的解决办法分享

    昨天遇到这个问题就是从一个输入流里调用BitmapFactory.decodeStream(this.getContentResolver().openInputStream(uri))得到一个bit ...

  4. Visual Assist X在Windows 8.1下出现中文乱码的解决方法

    这主要是输入法造成的,我的输入法中有US.中文.搜狗输入法三个输入法:通过搜狗输入法管理器把“中文”去掉,或者通过语言首选项把“中文”去掉就不会在出现乱码. 这个办法的思路来自于http://www. ...

  5. Remove Invalid Parentheses 解答

    Question Remove the minimum number of invalid parentheses in order to make the input string valid. R ...

  6. boost格式化输出xml

    我的boost为1.56而不是1.55 boost在xml的例子给出了一段写xml文件的代码,我简化如下: void debug_settings::save(const std::string &a ...

  7. 2301: [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4164  Solved: 1888[Submit] ...

  8. JAVA 代理模式(Proxy)

    1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉 ...

  9. PHP设计模式笔记二:面向对象 -- Rango韩老师 http://www.imooc.com/learn/236

    SPL标准库的使用 SPL是用于解决典型问题(standard problems)的一组接口与类的集合. 1.SPL提供了很多数据结构类,如SplStack.SqlQueue.SqlHeap.SplF ...

  10. 文件atime未变问题的研究

    1. atime, ctime 以及mtime 这三个名词属于文件/文件夹的属性,存在于inode数据结构之中. 通过系统调用stat可以获取stat结构,其中包括:atime(accesstime) ...