Z-Blog 数据查询层:GetArticleList 的参数怎么拼、为什么查不到数据
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->ID | log_ID |
$a->Title | log_Title |
$a->Content | log_Content |
$a->Intro | log_Intro |
$a->CateID | log_CateID |
$a->Status | log_Status |
$a->PostTime | log_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。这四条覆盖了大部分「查不到数据」的场景。