织梦SQL如何调用文章标题?

99ANYc3cd6
预计阅读时长 16 分钟
位置: 首页 织梦建站 正文

使用 dedecms 标签(最推荐,最安全)

对于绝大多数场景,不推荐直接写原生SQL,而是使用织梦自带的标签,因为织梦标签已经做了安全处理,能有效防止SQL注入,并且语法更简洁。

织梦sql调用文章标题
(图片来源网络,侵删)

调用指定ID的文章标题

如果你已经知道文章的ID,可以直接用 arctitle

{dede:arctitle id='1'/}

这会直接输出ID为1的文章的标题。

调用指定栏目(catid)下的文章标题

这是最常用的场景之一,比如在首页某个位置调用“公司新闻”栏目的最新几篇文章标题。

{dede:arclist row='10' titlelen='30' typeid='2'}
    <a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}

参数解释:

  • typeid='2': 指定栏目ID为2,如果要调用多个栏目,用逗号隔开,如 typeid='2,5,8'
  • row='10': 调用10篇文章,len='30'`: 标题长度限制为30个字符(一个汉字算一个字符)。
  • [field:title/]: 输出文章标题。
  • [field:arcurl/]: 输出文章的链接地址。

调用指定关键词(keyword)的文章标题

如果你想调用包含特定关键词的文章。

织梦sql调用文章标题
(图片来源网络,侵删)
{dede:arclist row='5' keyword='织梦CMS'}
    <li><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></li>
{/dede:arclist}
  • keyword='织梦CMS': 查询标题或关键词中包含“织梦CMS”的文章。

使用 dede_sql 标签(原生SQL调用)

当你需要实现 arclist 标签无法满足的复杂查询时(按特定字段排序、关联多表查询等),就需要使用 dede_sql 标签来执行原生SQL语句。

核心语法:

{dede:sql sql='你的SQL语句'}
    [field:字段名/]
{/dede:sql}

示例1:调用指定栏目ID下的文章标题

假设我们要调用栏目ID为3下的所有文章标题。

{dede:sql sql="SELECT title FROM `dede_archives` WHERE typeid=3"}
    <a href="/plus/view.php?aid=[field:id/]" title="[field:title/]">[field:title/]</a>
{/dede:arclist}

注意:

织梦sql调用文章标题
(图片来源网络,侵删)
  1. 表前缀dede_archives 是织梦默认的文章主表,如果你的数据库表前缀不是 dede_,请务必修改成你自己的前缀。
  2. 字段缺失:上面的SQL只查了 title 字段,[field:id/] 是无法获取的,如果还需要文章ID和链接,需要同时查询这些字段。
  3. 链接问题:直接拼接 /plus/view.php?aid=[field:id/] 虽然可行,但不是最佳实践,更好的方法是使用织梦自带的函数来生成链接。

示例2:更完善的调用(包含ID、标题、链接并分页)

这是一个更完整的例子,它会调用栏目ID为3的文章,并获取ID、标题、发布时间,同时生成正确的链接。

{dede:sql sql="SELECT id, title, pubdate FROM `#@__archives` WHERE typeid=3 ORDER BY pubdate DESC LIMIT 0, 10"}
    <li>
        <a href="[field:array runphp='yes']
            $arcRow = GetOneArchive(@me);
            echo $arcRow['arcurl'];
            [/field:array]" title="[field:title/]">
            [field:title/]
        </a>
        <span>([field:pubdate function="MyDate('Y-m-d',@me)"/])</span>
    </li>
{/dede:sql}

代码详解:

  • #@__archives:这是织梦推荐的表名写法,系统会自动替换成你配置的数据库表前缀,比硬编码 dede_ 更安全。
  • ORDER BY pubdate DESC LIMIT 0, 10:按发布时间降序排列,并只取前10条记录。
  • [field:array runphp='yes']...[/field:array]:这是一个非常强大的用法,当 runphp='yes' 时,@me 代表当前行的所有字段数据(一个数组),我们调用织梦内置的 GetOneArchive() 函数,传入这个数组,函数会返回一个包含文章完整信息(包括最终URL)的新数组,我们从中取出 arcurl 即可。
  • function="MyDate('Y-m-d',@me)":调用织梦的日期格式化函数,将时间戳格式化为 年-月-日

在PHP文件中直接调用SQL

如果你是在一个自定义的PHP页面(yourpage.php)中调用,那么就需要直接使用PHP代码来操作数据库。

<?php
require_once (dirname(__FILE__) . "/include/common.inc.php"); // 引入织梦核心文件
// 1. 准备SQL语句
$sql = "SELECT id, title FROM `#@__archives` WHERE typeid=3 ORDER BY id DESC LIMIT 10";
// 2. 执行查询
$dsql->SetQuery($sql);
$dsql->Execute();
// 3. 循环输出结果
while($row = $dsql->GetArray())
{
    $arcUrl = GetOneArchive($row['id']);
    echo "<li><a href='{$arcUrl['arcurl']}' title='{$row['title']}'>{$row['title']}</a></li>";
}
?>

代码详解:

  1. require_once ...:这是必须的,引入织梦的核心配置和函数库。
  2. $dsql:这是织梦的全局数据库连接对象,可以直接使用。
  3. SetQuery()Execute():设置并执行SQL语句。
  4. GetArray():获取查询结果的一行数据,返回一个关联数组。
  5. GetOneArchive($row['id']):根据文章ID获取文章的详细信息,包括最终的URL,注意这里传入的是ID,而不是整个数组。
  6. echo:使用PHP的 echo 语句来输出HTML。

重要注意事项

  1. 安全第一,防止SQL注入

    • 永远不要直接将用户输入(如URL参数)拼接到SQL语句中。
    • 错误示范$sql = "SELECT title FROM dede_archives WHERE typeid={$_GET['id']}";
    • 正确做法:使用织梦提供的 $dsql->GetOne()$dsql->Execute() 等方法,它们内部有处理机制,或者对变量进行严格的过滤和验证。
  2. 表前缀问题

    • 在SQL语句中,强烈建议使用 #@__ 作为表名前缀,#@__archives#@__arctype,这样无论你的后台如何修改数据库前缀,代码都能正常工作。
  3. 性能考虑

    • 避免使用 SELECT *,只查询你需要的字段,如 SELECT id, title, pubdate
    • typeidarctypeidclickpubdate 等常用查询字段建立数据库索引,可以大幅提升查询速度。

总结与推荐

场景 推荐方法 优点 缺点
常规列表调用 {dede:arclist} 语法简单、安全、官方支持 灵活性较低,无法实现复杂查询
复杂查询需求 {dede:sql} 灵活性极高,可执行任意SQL 需要编写SQL,有一定门槛,安全性需自己保证
在PHP文件中调用 PHP代码 + $dsql 功能最强大,可结合PHP逻辑 代码量稍多,需要PHP基础

对于99%的模板修改需求,优先使用 {dede:arclist} 只有当它无法满足时,再考虑使用 {dede:sql} 或PHP代码。

-- 展开阅读全文 --
头像
c语言10进制转16进制函数
« 上一篇 02-09
C语言源程序由哪些基本组成?
下一篇 » 02-09

相关文章

取消
微信二维码
支付宝二维码