您的位置:首页 > 数据库

wordpress内核揭秘之day4_到底数据库操作是怎么实现的

2016-12-16 16:27 447 查看
"年初的承诺,希望这次能写完dAY10  -------  Sidney"

刚才发了一博客

里面有一段是这么写的

/**
* 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的秘密就是这么简单的一个结构

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php wordpress wp db sql