wordpress内核揭秘之day4_到底数据库操作是怎么实现的
2016-12-16 16:27
447 查看
"年初的承诺,希望这次能写完dAY10 ------- Sidney"
刚才发了一博客
里面有一段是这么写的
刚才博客也说了,这是一个10w行代码里面找出来的一个小片段
(这10万行代码还只是为了实现一个csv上传的功能)
这个小片段来源于一个大mvc框架(非wordpress框架)里面的model层的一个查询数据库的实现
整个片段代码也只有最后一句话有用:
“$result = $this->wpdb->get_results($sql, ARRAY_A);”
也就是这句话应该彻底解决了所有人的迷思:
“”无论再大的框架,最终还是拼装spl,做数据库查询,通过wordpress的db,wpdb做查询,只是人家做得比较优雅而已“”
别指望写一个什么算法,什么框架就能一次解决所有问题
人家写了10w行代码,也只是封装了个数据库查询,做了一些定制功能,仅此而已,还根本没解决数据库查询问题
我们还是先搞清楚这个wpdb->getresults这个方法到底怎么实现的?
难道还是每次调用都查一次数据库?没有缓存的?缓存又在哪里呢?
估计get_results这个方法里面有可能包含几万行代码,
我不知道,写了10年从未分析过
就让我们来看看里面到底什么鬼吧。。。。
其实好像也没什么秘密
wpdb里面
有一个内部和外部都可以使用的public function query
有一些内部属性,例如:last_result等
用于输出
输出结构包括:
Array,--这个是我唯一知道的,php里面的神器,那些还在研究hashmap和 vector有什么区别的咋不上天,哦不好意思这事java的
ArrayN,--不懂
Object,
ObjectK, --怎么还有k,不懂
db_getresult的方法实在就是这么简单粗暴,没什么秘密
所以难免要了解wordpress更核心的方法:apply_filters和apply_action,其实这个我现在也是不懂的,这个放在day5揭秘
翻查wordpress内核的代码5分钟后,发现完全没有query filter的实现方法
所以可以肯定"apply_filters('query',$query);"和数据库查询并没有什么实际关联
(事实上,apply_filter('query',$query);也只是开放给开发者的接口而已,可能某个天才开发者,用了这个接口就能写出一个完全反转的query查询,但实际开发过程中,只会引入无穷无尽的bug,动则白屏,这也是apply_filters和wordpress内核一直给人诟病的原因,但可能还有人没看出我在吐槽,先想想你是哪种开发者把。。。。)
db_getresult的真正实现方法:
wordpress的wpdb秘密就是mysql_query,也就是仅仅是一个查询封装而已。。。。。。。事实还是很骨感的
我上篇说的wp-all-import插件更骨感,10w行左右的代码,仅仅也只是封装wpdb查询而已
我们其实也很骨感,写那么多年程序,也仅仅是封装sql查询而已
最近2年很多程序猿有这种声音
“我肯定不满足于现状,仅仅是insert select做一些简单封装调用。体现不出我的价值”
我真想问,so?
人家写10w行代码,做得这么优雅,这么有经验,也还仅仅是insert select,做一些简单封装调用而已
所以还是面对现实吧,程序猿
其实整个wpdb的秘密就是这么简单的一个结构
刚才发了一博客
里面有一段是这么写的
/** * Read records from database by specified fields and values * When 1st parameter is an array, it's expected to be an associative array of field => value pairs to read data by * When 2nd parameter is a scalar, it's expected to be a field name and second parameter - it's value * * @param string|array[optional] $field * @param mixed[optional] $value * @param string[optional] $orderBy Ordering rule * @param int[optional] $page Paging paramter used to limit number of records returned * @param int[optional] $perPage Page size when paging parameter is used (20 by default) * @return PMXI_Model_List */ public function getBy($field = NULL, $value = NULL, $orderBy = NULL, $page = NULL, $perPage = NULL, $groupBy = NULL) { if (is_array($field) or is_null($field)) { // when associative array is submitted, do not expect second paramter to be $value, but act as if there is no $value parameter at all $groupBy = $perPage; $perPage = $page; $page = $orderBy; $orderBy = $value; $value = NULL; } ! is_null($perPage) or $perPage = 20; // set default value for page length $page = intval($page); $sql = "FROM $this->table "; $sql .= implode(' ', $this->joined); if ( ! is_null($field)) { $sql .= " WHERE " . $this->buildWhere($field, $value); } if ( ! is_null($groupBy)) { $sql .= " GROUP BY $groupBy"; } is_null($orderBy) and $orderBy = implode(', ', $this->primary); // default sort order is by primary key $sql .= " ORDER BY $orderBy"; if ($page > 0) { $sql = "SELECT SQL_CALC_FOUND_ROWS $this->what $sql LIMIT " . intval(($page - 1) * $perPage) . ", " . intval($perPage); } else { $sql = "SELECT $this->what $sql"; } $result = $this->wpdb->get_results($sql, ARRAY_A);
刚才博客也说了,这是一个10w行代码里面找出来的一个小片段
(这10万行代码还只是为了实现一个csv上传的功能)
这个小片段来源于一个大mvc框架(非wordpress框架)里面的model层的一个查询数据库的实现
整个片段代码也只有最后一句话有用:
“$result = $this->wpdb->get_results($sql, ARRAY_A);”
也就是这句话应该彻底解决了所有人的迷思:
“”无论再大的框架,最终还是拼装spl,做数据库查询,通过wordpress的db,wpdb做查询,只是人家做得比较优雅而已“”
别指望写一个什么算法,什么框架就能一次解决所有问题
人家写了10w行代码,也只是封装了个数据库查询,做了一些定制功能,仅此而已,还根本没解决数据库查询问题
我们还是先搞清楚这个wpdb->getresults这个方法到底怎么实现的?
难道还是每次调用都查一次数据库?没有缓存的?缓存又在哪里呢?
估计get_results这个方法里面有可能包含几万行代码,
我不知道,写了10年从未分析过
就让我们来看看里面到底什么鬼吧。。。。
其实好像也没什么秘密
wpdb里面
有一个内部和外部都可以使用的public function query
有一些内部属性,例如:last_result等
用于输出
输出结构包括:
Array,--这个是我唯一知道的,php里面的神器,那些还在研究hashmap和 vector有什么区别的咋不上天,哦不好意思这事java的
ArrayN,--不懂
Object,
ObjectK, --怎么还有k,不懂
db_getresult的方法实在就是这么简单粗暴,没什么秘密
public function query($query) { //... $query = apply_filters( 'query', $query ); //...重要的原来在后面 }
所以难免要了解wordpress更核心的方法:apply_filters和apply_action,其实这个我现在也是不懂的,这个放在day5揭秘
翻查wordpress内核的代码5分钟后,发现完全没有query filter的实现方法
所以可以肯定"apply_filters('query',$query);"和数据库查询并没有什么实际关联
(事实上,apply_filter('query',$query);也只是开放给开发者的接口而已,可能某个天才开发者,用了这个接口就能写出一个完全反转的query查询,但实际开发过程中,只会引入无穷无尽的bug,动则白屏,这也是apply_filters和wordpress内核一直给人诟病的原因,但可能还有人没看出我在吐槽,先想想你是哪种开发者把。。。。)
db_getresult的真正实现方法:
public function query($query){ //... $query = apply_filters('query',$query); //... if ( ! empty( $this->dbh ) && $this->use_mysqli ) { $this->result = mysqli_query( $this->dbh, $query ); } elseif ( ! empty( $this->dbh ) ) { $this->result = mysql_query( $query, $this->dbh ); } }(记得以前好像还可以支持oracle和mysql,现在明显就是mysql比较好)
wordpress的wpdb秘密就是mysql_query,也就是仅仅是一个查询封装而已。。。。。。。事实还是很骨感的
我上篇说的wp-all-import插件更骨感,10w行左右的代码,仅仅也只是封装wpdb查询而已
我们其实也很骨感,写那么多年程序,也仅仅是封装sql查询而已
最近2年很多程序猿有这种声音
“我肯定不满足于现状,仅仅是insert select做一些简单封装调用。体现不出我的价值”
我真想问,so?
人家写10w行代码,做得这么优雅,这么有经验,也还仅仅是insert select,做一些简单封装调用而已
所以还是面对现实吧,程序猿
其实整个wpdb的秘密就是这么简单的一个结构
相关文章推荐
- wordpress内核揭秘之day6_Permalink伪静态方法实现原理
- 一个javabean轻松实现对数据库的各种操作
- 用api实现数据库的操作!
- 用强制订阅实现数据库同步操作
- 用强制订阅实现数据库同步操作
- 如何实现每天定时对数据库的操作
- C++中的虚函数到底怎么实现的?
- 如何实现每天定时对数据库的操作
- 使用Adoconnection实现对两个数据库的操作
- 如何实现快速地从超大数据库中提取数据并进行相关的操作
- 一个javabean轻松实现对数据库的各种操作
- 使用ADO操作SQL SERVER 通过'OLE DB 访问 ACCESS 数据库 ,实现数据交换
- NHibernate是能实现多数据库操作吗?
- 用api实现数据库的操作!
- 一个javabean轻松实现对数据库的各种操作
- 再谈Abstract Factory模式来实现数据库操作的类
- 使用XML封装数据库操作语句的实现(zz)
- 如何实现每天定时对数据库的操作
- VB.NET 中启动ADO.NET事务,实现对数据库操作的整体性。
- 在ASP中简化数据库操作的思路和实现