- 浏览器地址栏中的 URL 参数:访问
http://www.example.com/list.php?tid=1&pagesize=10,这里的tid和pagesize就是参数,这是最常见的情况。 - 织梦栏目体系中的父栏目:当前栏目是“新闻动态”,它的父栏目是“网站首页”,想获取父栏目的 ID 或名称。
下面我将针对这两种情况,为你提供详细的解决方案和代码示例。

获取 URL 传递的参数(GET 参数)
这是最常用的一种方法,通常用于列表页接收筛选条件、分页参数等。
方法 1:使用 $dsql 全局对象(推荐)
织梦的全局数据库对象 $dsql 提供了一个 GetOne() 方法,可以非常方便地获取并自动处理 GET 参数。
示例场景:
假设你有一个列表页 list.php,需要根据 URL 中的 tid (栏目ID) 来获取该栏目的名称。
代码实现:

在你的模板文件 list.htm 或者 PHP 动页文件 list.php 中,可以这样写:
<?php
// 引入全局数据库对象(如果在模板文件中,织梦会自动引入;在PHP文件中需要确保已引入)
// 如果在 list.php 中,通常不需要手动引入,因为 dedecms 的入口文件已经处理了。
// 使用 $dsql->GetOne() 获取 tid 对应的栏目信息
// $_GET['tid'] 会自动被处理和转义,防止SQL注入
$typename = $dsql->GetOne("SELECT typename FROM `#@_arctype` WHERE id = '{$_GET['tid']}'");
// 判断是否获取成功
if (is_array($typename)) {
$current_typename = $typename['typename'];
echo "当前栏目名称是: " . $current_typename;
} else {
echo "未找到或未传递 tid 参数!";
}
// 如果你想获取多个参数,可以多次调用 GetOne
// 同时获取 tid 和pagesize
$pagesize = isset($_GET['pagesize']) ? intval($_GET['pagesize']) : 20; // 使用 isset 和 intval 更安全
echo "<br>每页显示条数: " . $pagesize;
?>
优点:
- 安全:
$dsql->GetOne()内部会对$_GET数组中的值进行自动的过滤和转义,能有效防止 SQL 注入攻击。 - 方便:代码简洁,一行即可搞定。
方法 2:直接使用 PHP 的 $_GET 超全局变量
如果你只是简单地获取参数值,并且不立即用于数据库查询,可以直接使用 $_GET。
示例场景:
在列表页获取 keyword 参数,用于显示“您正在搜索xxx”的提示。

代码实现:
<?php
// 直接从 $_GET 数组中获取参数
$keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : '';
if (!empty($keyword)) {
echo "<h3>搜索关键词: " . htmlspecialchars($keyword) . "</h3>";
}
// 注意:如果这个参数要用于 SQL 查询,必须手动过滤!
// $keyword = addslashes($keyword); 或使用 $dsql->Escape() 函数
?>
优点:
- 直接、原始。
- 适用于非数据库查询的场景。
缺点:
- 不安全:直接用于 SQL 查询有极高的 SQL 注入风险,必须手动进行转义处理。
获取织梦栏目体系中的父栏目信息
这种情况通常用在当前页面(如列表页、内容页)需要知道它在栏目结构中的“上级”是谁。
方法 1:在列表页 (list.php / list.htm) 获取父栏目信息
列表页的父栏目信息通常存储在全局变量 $typelist 或 $type 中。
示例场景: 在“新闻动态”列表页,想获取其父栏目“网站首页”的 ID 和名称。
代码实现:
在 list.php 文件中,织梦已经获取了当前栏目的信息,并存储在 $type 数组里,父栏目的信息也在其中。
<?php
// 在 list.php 的循环查询之前,$type 变量已经包含了当前栏目的完整信息
// $type['reid'] 就是父栏目的 ID
// $type['topid'] 是顶级栏目的 ID
// $type['typename'] 是当前栏目的名称
if ($type['reid'] > 0) {
// 获取父栏目信息
$parent_type = $dsql->GetOne("SELECT id, typename FROM `#@_arctype` WHERE id = '{$type['reid']}'");
if (is_array($parent_type)) {
echo "父栏目ID: " . $parent_type['id'] . "<br>";
echo "父栏目名称: " . $parent_type['typename'] . "<br>";
}
} else {
echo "当前栏目是顶级栏目,没有父栏目。";
}
?>
在模板文件 list.htm 中,可以直接使用 {dede:field.reid/} 和 {dede:field.parentname/}(如果标签存在的话,或者通过PHP传递变量)。
方法 2:在内容页 (article_article.php / article.htm) 获取父栏目信息
页的父栏目信息可以通过文章的 typeid 反向查询得到。
示例场景: 在文章详情页,想获取该文章所在栏目的父栏目信息。
代码实现:
在 article.php 中,文章信息已经获取,存储在 $arc 数组里。
<?php
// 在 article.php 中,$arc['typeid'] 存储了文章所属的栏目ID
$typeid = $arc['typeid'];
// 获取当前文章所在栏目的信息
$current_type = $dsql->GetOne("SELECT * FROM `#@_arctype` WHERE id = '$typeid'");
if (is_array($current_type) && $current_type['reid'] > 0) {
// 获取父栏目信息
$parent_type = $dsql->GetOne("SELECT id, typename FROM `#@_arctype` WHERE id = '{$current_type['reid']}'");
if (is_array($parent_type)) {
echo "文章所属栏目的父栏目ID: " . $parent_type['id'] . "<br>";
echo "文章所属栏目的父栏目名称: " . $parent_type['typename'] . "<br>";
}
}
?>
在模板文件 article.htm 中,可以通过 {dede:field.typeid/} 获取当前栏目ID,然后通过自定义标签或PHP代码来获取父栏目信息。
总结与最佳实践
| 需求场景 | 推荐方法 | 代码示例 | 注意事项 |
|---|---|---|---|
获取 URL 参数 (如 ?tid=1) |
$dsql->GetOne() |
$typename = $dsql->GetOne("SELECT ... WHERE id = '{$_GET['tid']}'"); |
首选方法,安全可靠,自动防SQL注入。 |
| 获取 URL 参数 (仅显示用) | $_GET |
$keyword = isset($_GET['keyword']) ? $_GET['keyword'] : ''; |
仅用于非数据库查询,如显示、JS变量等。 |
| 获取父栏目信息 (列表页) | $type['reid'] |
$parent_id = $type['reid']; |
在 list.php 中,$type 变量已存在,直接取用即可。 |
| 获取父栏目信息 (内容页) | 通过 $arc['typeid'] 反查 |
$current_type = $dsql->GetOne("... WHERE id = '{$arc['typeid']}'"); |
需要先获取当前栏目信息,再通过 reid 获取父栏目。 |
核心要点:
- 安全第一:任何来自用户输入的数据(尤其是
$_GET,$_POST)都不能直接拼接到 SQL 语句中,优先使用$dsql提供的安全方法。 - 区分场景:清楚你要获取的是“浏览器URL参数”还是“织梦栏目树中的父级关系”,选择对应的方法。
- 善用全局变量:织梦在加载页面时会初始化很多有用的全局变量(如
$type,$arc),熟悉它们可以让你事半功倍。
