dede runphp如何执行sql语句?

99ANYc3cd6
预计阅读时长 19 分钟
位置: 首页 DEDE建站 正文

这是一个非常强大且常用的功能,可以让模板实现很多复杂的逻辑,而无需修改 PHP 源文件。

dede runphp sql
(图片来源网络,侵删)

runphp 标签基础

runphp 是 DedeCMS 的一个特殊模板标签,它的作用是在模板渲染时执行一段 PHP 代码,并将代码的最终输出显示在页面上。

基本语法

{dede:runphp}
    // 你的 PHP 代码
    // echo $value;  // 最后一定要用 echo 输出结果
{/dede:runphp}

核心要点:

  • 代码块中写的是标准的 PHP 语法。
  • 最后必须使用 echoprint 来输出你想要显示在页面上的内容。 如果没有输出,标签位置将显示为空。
  • 默认情况下,PHP 的安全模式是开启的,很多函数(如 file_get_contents, exec 等)会被禁用,这是出于安全考虑。

变量作用域

runphp 块中,你可以访问到 DedeCMS 模板中的一些常用变量:

  • $GLOBALS: 全局变量数组,这是访问 DedeCMS 全局变量的关键。
    • $GLOBALS['cfg_basehost']: 网站根目录 URL,如 http://www.yoursite.com
    • $GLOBALS['cfg_cmspath']: CMS 安装目录,如 /dedecms
    • $GLOBALS['cfg_templets_dir']: 模板目录。
  • $fields: 在循环标签(如 {dede:arclist}, {dede:loop})内部,$fields 是一个数组,包含了当前记录的所有字段。
    • 在文章列表中,$fields['id'] 是当前文章的 ID,$fields['title'] 是当前文章的标题。
  • $env: 当前环境变量,如 typeid(当前栏目ID)等。

runphp 结合 SQL 查询

这是 runphp 最核心的用法之一,当模板需要的数据无法通过常规的 DedeCMS 标签直接获取时,就可以在 runphp 里手动执行 SQL 查询,然后处理并输出结果。

dede runphp sql
(图片来源网络,侵删)

执行 SQL 查询

runphp 中执行 SQL,主要通过 DedeCMS 提供的数据库操作类 dedesql

// 1. 获取数据库实例
$dsql = $GLOBALS['dsql'];
// 2. 准备你的 SQL 语句
$sql = "SELECT id, title FROM `#@__archives` WHERE typeid = 10 ORDER BY id DESC LIMIT 5";
// 3. 执行查询
$rs = $dsql->Execute('me', $sql); // 'me' 是一个别名,用于后续的 fetch 操作
// 4. 遍历结果并处理
$items = '';
while ($row = $rs->GetArray()) {
    $items .= "<a href='/plus/view.php?aid={$row['id']}'>{$row['title']}</a><br />";
}
// 5. 输出最终结果
echo $items;

代码解释:

  • $GLOBALS['dsql']: 这是 DedeCMS 全局数据库连接对象,可以直接拿来用。
  • $dsql->Execute('alias', sql): 执行 SQL 查询。
    • 第一个参数 'me' 是一个别名,在 GetArray() 方法中会用到,可以随便写,但必须是唯一的。
    • 第二个参数是 SQL 语句。注意: DedeCMS 的表名前缀 #@__ 会被自动替换为你数据库中配置的前缀(如 dede_),请务必使用 #@__
  • $rs->GetArray(): 从结果集中获取一行数据,并将其转换为关联数组,如果数据获取完毕,则返回 false,因此非常适合用在 while 循环中。
  • $row['id'], $row['title']: 通过列名访问数组中的数据。
  • echo $items: 将拼接好的 HTML 字符串输出到模板中。

完整示例:调用指定栏目的最新5篇文章

假设你想在首页某个位置,调用 ID 为 3 的栏目的最新5篇文章,而首页默认没有这个栏目列表。

步骤 1:修改首页模板文件 (index.htm)

在你希望显示文章列表的地方,添加如下代码:

<div class="hot-articles">
    <h3>栏目ID为3的最新文章</h3>
    {dede:runphp}
        // 1. 获取数据库连接
        $dsql = $GLOBALS['dsql'];
        // 2. 定义SQL
        $sql = "SELECT id, title FROM `#@__archives` WHERE typeid = 3 ORDER BY id DESC LIMIT 5";
        // 3. 执行查询
        $rs = $dsql->Execute('me', $sql);
        // 4. 遍历结果
        $articleList = '<ul>';
        while($row = $rs->GetArray())
        {
            // 获取文章链接
            $arcUrl = GetOneArchive($row['id']);
            $articleList .= "<li><a href='{$arcUrl['arcurl']}'>{$row['title']}</a></li>";
        }
        $articleList .= '</ul>';
        // 5. 输出
        echo $articleList;
    {/dede:runphp}
</div>

代码优化点:

  • GetOneArchive($row['id']): 这是一个 DedeCMS 的内置函数,比手写 plus/view.php?aid=xxx 更推荐,因为它能正确处理文章的静态/动态链接。

步骤 2:生成首页

保存模板文件后,登录 DedeCMS 后台,点击 “生成” -> “主页HTML” -> “更新主页”,让新的模板代码生效。

现在访问你的首页,就能看到指定栏目的最新文章列表了。


进阶用法与注意事项

单条数据查询

如果你只想查询一条记录(例如获取网站配置),可以使用 GetOne() 方法。

{dede:runphp}
    $dsql = $GLOBALS['dsql'];
    $row = $dsql->GetOne("SELECT value FROM `#@__sysconfig` WHERE varname = 'cfg_webname'");
    if(is_array($row)) {
        echo "网站名称是:" . $row['value'];
    } else {
        echo "未能获取网站名称";
    }
{/dede:runphp}

安全性考虑

  • SQL 注入:SQL 语句中的参数来自用户输入(如 URL、表单),必须进行过滤。$dsql 对象提供了 EscapeString() 方法。
    $typeid = intval($_GET['typeid']); // 最简单的方式,确保是整数
    // 或者
    $typeid = $dsql->GetOne("SELECT id FROM `#@__arctype` WHERE typename LIKE '{$typename}'");
    $typeid = is_numeric($typeid) ? $typeid : 1; // 确保是数字
  • 代码执行runphp 是一把双刃剑,不要在模板中写过于复杂的业务逻辑,也不要引入不安全的第三方代码,保持模板的简洁性。

性能考虑

  • runphp 中的 SQL 查询是在每次页面加载时执行的,如果页面被大量用户同时访问,或者查询非常复杂,可能会对数据库造成压力。
  • 对于频繁访问但数据不常变动的模块,可以考虑使用 DedeCMS 的缓存机制,查询数据后,将结果序列化存入缓存文件,下次访问时先读取缓存,这需要你对 PHP 文件操作有一定了解。

调试技巧

runphp 代码没有按预期工作,可以尝试使用 var_dump()<pre> 标签来调试。

{dede:runphp}
    $dsql = $GLOBALS['dsql'];
    $typeid = 3;
    $sql = "SELECT * FROM `#@__archives` WHERE typeid = {$typeid} LIMIT 1";
    // 调试:打印 SQL 语句
    echo '<!-- SQL: ' . htmlspecialchars($sql) . ' -->';
    $rs = $dsql->Execute('me', $sql);
    // 调试:打印查询结果
    if($rs){
        $row = $rs->GetArray();
        echo '<pre>';
        var_dump($row);
        echo '</pre>';
    } else {
        echo '查询无结果或执行失败。';
    }
    // 你的正式代码...
{/dede:runphp}

查看页面源码,你会看到注释中的 SQL 和 <pre> 标签格式化的数组,这能帮你快速定位问题。


功能 代码示例 说明
基础执行 {dede:runphp}echo 'Hello World';{/dede:runphp} 执行简单 PHP 并输出。
访问全局变量 {dede:runphp}echo $GLOBALS['cfg_basehost'];{/dede:runphp} 输出网站域名。
访问循环字段 {dede:arcpy}<li>{dede:runphp}echo $fields['id'];{/dede:runphp}</li>{/dede:arclist} 在列表中输出当前文章 ID。
执行 SQL 查询 见上文完整示例 runphp 中通过 $dsql 执行 SQL 并处理结果。
获取单条数据 见上文单条数据查询示例 使用 $dsql->GetOne() 获取一行数据。

掌握 runphp 和 SQL 的结合使用,能让你在 DedeCMS 的模板定制中游刃有余,实现各种个性化、复杂化的数据展示需求。

-- 展开阅读全文 --
头像
dede sphinx 404
« 上一篇 01-08
织梦系统图片集采集教程
下一篇 » 01-08

相关文章

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

目录[+]