Z-Blog 数据查询层:GetArticleList 的参数怎么拼、为什么查不到数据

· zblog · 阅读 19
摘要

where 用列名不用属性名、IN 的值必须是数组、分页传页码不是偏移量,外加列名与属性名对照表和调试技巧。

Z-Blog 的查询不像原生 SQL 那么直白——$zbp->GetArticleList() 收的是一组带 Count、Page、Where 的结构化参数,还夹着「按什么排序」「要不要连附表」的坑。参数拼错不会有报错,只会安静地返回空数组。

一、基础调用形态

$list = $zbp->GetArticleList(
    '*',                    // 字段,* 表示全部
    array(array('=', 'log_Status', 0)),   // where 条件
    array('log_PostTime' => 'DESC'),     // order
    10,                     // count
    null                    // page
);

五个参数里,第一个是字段列表,第二个是条件数组,第三个是排序,第四是条数,第五是页码。任何一项类型传错(比如排序传成字符串而不是数组),都可能静默失败。

二、where 条件怎么写

条件是一个「数组的数组」,每个子数组是 [操作符, 字段名, 值]。多个条件是 AND 关系:

array(
    array('=', 'log_Status', 0),
    array('>', 'log_PostTime', strtotime('-30 days')),
)

支持的操作符包括 =、<>、>、<、>=、<=、LIKE、IN、NOT IN。其中 IN 的值必须是数组,写成逗号分隔的字符串会被当成一个整体去匹配,永远查不到。

array('IN', 'log_CateID', array(10, 11, 13))

三、查不到数据的高频原因

现象原因
明明有文章,返回空log_Status 忘了传 0,默认包含草稿但被别处过滤
分页只有第一页有数据Page 参数传了 0 而不是 null,内部偏移算错
模糊搜索搜不到LIKE 的值两边没加 %
条件写了却不生效字段名写成了对象属性名(Status)而非列名(log_Status)

最后一条最容易踩:where 里要写数据库列名,不是 $article->Status 那种属性名。属性名只在模板和对象访问时用。

四、文章属性 vs 列名的对应

这个映射有必要记一下,两边混用是最常见的静默失败来源:

对象属性数据库列
$a->IDlog_ID
$a->Titlelog_Title
$a->Contentlog_Content
$a->Introlog_Intro
$a->CateIDlog_CateID
$a->Statuslog_Status
$a->PostTimelog_PostTime

五、分页的正确做法

自己算分页容易错,Z-Blog 提供了 LoadArticleList 之外的辅助。核心是先用同样的条件查一次总数,再算总页数:

// 先查总数(count 传 0 或 null,只看长度)
$all = $zbp->GetArticleList('log_ID', $where, null, null, null);
$total = count($all);

// 再取当页
$page = (int)GetVars('page', 'GET');
$page = $page > 0 ? $page : 1;
$list = $zbp->GetArticleList('*', $where, $order, 10, $page);

注意:查总数时字段传 log_ID 而不是 *,能少取一大截数据。文章量上万后这个差别很明显。

六、跨表:附表数据要显式连

Z-Blog 的内容模型里,正文存主表,但某些扩展字段可能落在附表。默认 GetArticleList 只查主表,取附表字段得靠 GetArticleList 之后逐条 LoadArticle,或者直接用 $zbp->GetList() 走更底层。

判断方法:模板里 {$article.字段名} 取不到值,而直接查表明明有数据,基本就是没连附表。

七、调试技巧:把 SQL 打出来

参数对不对,看最终 SQL 最直接。Z-Blog 在调试模式下会记录 SQL:

// 打开调试后,在输出末尾能看到执行过的语句
$zbp->ShowError();

或者临时在查询前 var_dump($where); 确认条件结构没拼错。结构错了函数不报错,只是把条件当成了空数组——这是它最容易误导人的地方。

小结

四个要点:where 用列名不用属性名;IN 的值必须是数组;分页传页面号而不是偏移量;查总数时字段只取 log_ID。这四条覆盖了大部分「查不到数据」的场景。