# 织梦cms系统跨站跨数据库如何调用数据

*Published:* 2023-10-22
*Author:* 客服001

#### 温馨提醒

如果文章内容或图片资源失效，请留言反馈，我们会及时处理，谢谢

本文最后更新于2023年10月22日，已超过 180天没有更新



标签的调用格式：

```
{dede:sql sql="一条完整的SQL语句" appname="<a class="tag_link" href="https://www.xarjtc.com/tag/%e6%95%b0%e6%8d%ae%e5%ba%93" target="_blank" title="查看数据库此标签更多文章"><abbr title="">数据库</abbr></a>配置参数"}
您的底层模板
{/dede:sql}
```

稍微有点细心的朋友可能就已经发现了，其实只是在SQL标签中多了一个appname参数，它的意思实际上指的就是您跨数据库调用的连接配置信息；

参数讲解：

这个跨数据库调用的连接配置信息是如何配置的呢？请大家打开/include/tablie/sql.lib.php，找到大约65行开始的如下代码：

```
// 引入配置文件
    if ($appname != 'default')
    {
        require_once(DEDEDATA.'/tag/sql.inc.php');
        global $sqltag;
        $config = $sqltag[$appname];
        if (!isset($config['dbname'])) return '';

        // 链接数据库
        $linkid = @mysql_connect($config['dbhost'], $config['dbuser'], $config['dbpwd']);
        if(!$linkid) return '';
        @mysql_select_db($config['dbname']);
        $mysqlver = explode('.',$dsql->GetVersion());
        $mysqlver = $mysqlver[0].'.'.$mysqlver[1];

        // 设定数据库编码及长连接
        if($mysqlver > 4.0)
        {
            @mysql_query("SET NAMES '".$config['dblanguage']."', character_set_client=binary, sql_mode='', interactive_timeout=3600 ;", $linkid);
        }

        $prefix="#@__";
        $sql = str_replace($prefix, $config['dbprefix'], $sql);

        // 校验SQL字符串并获取数组返回
        $sql = CheckSql($sql);
        $rs = @mysql_query($sql, $linkid);
        while($row = mysql_fetch_array($rs,MYSQL_ASSOC))
        {
            $sqlCt++;
            $GLOBALS['autoindex']++;

            // 根据程序判断编码类型,并进行转码,这里主要就是gbk和utf-8
            if (substr($cfg_soft_lang, 0, 2) != substr($config['dblanguage'], 0, 2))
            {
                $row = AutoCharset($row, $config['dblanguage'], $cfg_soft_lang);
            }

            foreach($ctp->CTags as $tagid=>$ctag)
            {
                if($ctag->GetName()=='array')
                {
                    $ctp->Assign($tagid, $row);
                }
                else
                {
                    if( !empty($row[$ctag->GetName()]))
                    {
                        $ctp->Assign($tagid, $row[$ctag->GetName()]);
                    } else {
                      $ctp->Assign($tagid, "");
                    }
                }
            }
            $revalue .= $ctp->GetResult();
        }
        @mysql_free_result($rs);

    }
```

上面这段代码的意思就是如果您的SQL标签的appname参数不等于default，那么就加载 DEDEDATA.'/tag/sql.inc.php' 这个配置文件，寻找相关的配置。

而DEDEDATA 是织梦系统的全局常量，代表程序的 /data 文件夹。

我们可以打开这个文件看一下，您应该能看到如下代码：

```
<?php
global $sqltag;
// phpwind8数据库连接配置
// ------------------------------------------------------------------------
$sqltag['phpwind8']['dbhost'] = 'localhost';
$sqltag['phpwind8']['dbname'] = 'phpwind8';
$sqltag['phpwind8']['dbuser'] = 'root';
$sqltag['phpwind8']['dbpwd'] = '123456';
$sqltag['phpwind8']['dbprefix'] = 'pw_';
$sqltag['phpwind8']['dblanguage'] = 'gbk';

// phpb2b数据库连接配置
// ------------------------------------------------------------------------
$sqltag['phpb2b']['dbhost'] = 'localhost';
$sqltag['phpb2b']['dbname'] = 'phpb2b';
$sqltag['phpb2b']['dbuser'] = 'root';
$sqltag['phpb2b']['dbpwd'] = '123456';
$sqltag['phpb2b']['dbprefix'] = 'pb_';
$sqltag['phpb2b']['dblanguage'] = 'utf8';
?>
```

其中phpwind8 和 phpb2b 就是跨服务器的配置信息了，您只需要将这里面的连接更改为您自己的即可。甚至还可以进行自定义，比如我们在末尾可以加上如下代码：

```
// discuz数据库连接配置
// ------------------------------------------------------------------------
$sqltag['discuz']['dbhost'] = 'localhost';//数据库服务器地址
$sqltag['discuz']['dbname'] = 'discuz';//数据库名称
$sqltag['discuz']['dbuser'] = 'xuewl_com';//数据库登录用户名
$sqltag['discuz']['dbpwd'] = 'xuewl_com';//数据库登录密码
$sqltag['discuz']['dbprefix'] = 'pre_';//数据库默认表前缀，用于#@__标识
$sqltag['discuz']['dblanguage'] = 'utf8';//数据库的编码
```

保存好文件以后关闭即可。

在前台我们就可以通过如下具体代码调用了：

```
{dede:sql sql="select * from #@__common_member WHERE uid > 1 ORDER BY credits DESC LIMIT 0,8" appname="discuz"}
 用户名：[field:username/]
{/dede:sql}
```